Knex ๋ฒ์ : 0.16.3
๋ฐ์ดํฐ๋ฒ ์ด์ค + ๋ฒ์ : ๋์ปค postgres:10.4
OS: Windows 10 Pro ๋ฐ Docker node:8.14.0
knex migrate:make --knexfile knexfile.ts
Unexpected token import
0.15.x
์์ ์ ์์ ์ผ๋ก ์๋ํฉ๋๋ค.
0.16์๋ ์ด์ ๋ฆฌํฌ์งํ ๋ฆฌ์ TypeScript ์ ํ์ด ํฌํจ๋ฉ๋๋ค( #2845 ์ฐธ์กฐ). ์ด๊ฒ์ด ์ ๋๋ก ์๋ํ๋ ค๋ฉด ํ๋ก์ ํธ์์ @types/knex
๋ฅผ ์ ๊ฑฐํด์ผ ํ ๊ฒ์
๋๋ค.
@types/knex
์ ๊ฑฐํ์ง๋ง ์ฌ์ ํ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
/usr/src/app/src/db/knexfile.ts:1
(function (exports, require, module, __filename, __dirname) { import { database } from '../config'
^^^^^^
SyntaxError: Unexpected token import
at createScript (vm.js:80:10)
at Object.runInThisContext (vm.js:139:10)
at Module._compile (module.js:617:28)
at Object.Module._extensions..js (module.js:664:10)
at Module.load (module.js:566:32)
at tryModuleLoad (module.js:506:12)
at Function.Module._load (module.js:498:3)
at Module.require (module.js:597:17)
at require (internal/module.js:11:18)
at initKnex (/usr/src/app/node_modules/knex/bin/cli.js:62:25)
at Command.commander.command.description.option.action (/usr/src/app/node_modules/knex/bin/cli.js:172:24)
at Command.listener (/usr/src/app/node_modules/commander/index.js:315:8)
at emitTwo (events.js:126:13)
at Command.emit (events.js:214:7)
at Command.parseArgs (/usr/src/app/node_modules/commander/index.js:654:12)
at Command.parse (/usr/src/app/node_modules/commander/index.js:474:21)
knex migrate:make --knexfile knexfile.ts
์ผ๋ฐ ๋
ธ๋๋ก typescript ์ฝ๋๋ฅผ ์คํํ๋ ค๋ ๊ฒ์ด ์๋๊ฐ์? ๋๋ ๊ทธ๊ฒ์ด 0.15์์๋ ์ด๋ป๊ฒ ์๋ํ๋์ง ์ ํ ๋ชจ๋ฆ
๋๋ค.
knexfile์ ์ด๋ป๊ฒ ์๊ฒผ๋์? ์์ ๋ด์ญ์ด ์์ต๋๊น?
import * as knex from 'knex'
import * as path from 'path'
import { env } from './env'
const database = {
client: 'postgresql',
connection: env.databaseUrl,
migrations: {
directory: path.resolve('../db/migrations'),
tableName: 'knex_migrations',
},
seeds: {
directory: path.resolve('../db/seeds'),
},
} as knex.Config
export = database
0.15
์์ 100% ์๋
0.15์์ ์๋ํ๋ ์ด์ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. Unexpected token import
์ค๋ฅ์์ ์ ์ ์๋ฏ์ด import * as knex from 'knex'
๋ Node.js์์ ์ดํด๋์ง ์์ต๋๋ค(์ ์ด๋ ์ฌ์ฉ ์ค์ธ ๊ตฌ์ฑ์์๋ ์๋).
knexfile์ JavaScript๋ก ์ปดํ์ผํ๊ฑฐ๋, ๊ฐ์ ธ์ค๊ธฐ ๊ตฌ๋ฌธ์ ์ดํดํ๋ Node.js ๋ฒ์ ์ ์ฌ์ฉํ๊ฑฐ๋( https://nodejs.org/api/esm.html ์ฐธ์กฐ), ์ด์ require()
์ ์ฌ์ฉํ๋๋ก ํ์ผ์ ๋๋๋ ค์ผ ํฉ๋๋ค
knex 0.15์ ๋ฒ๊ทธ๊ฐ ์์ด์ ํด๋น knexfile์ ์ฝ์ง ์๋๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ์๋ํ์ง ์์์ผ ํ๋ 0.16์ ๋ฒ๊ทธ์ฒ๋ผ ๋ณด์ด์ง ์์ต๋๋ค.
๊ทธ knexfile์ ์ฝ์ง ์๋๋ก
๊ทธ๊ฒ์ knexfile์ 100% ์ฝ์ต๋๋ค. ์ ๋ ๋ค๋ฅธ ๋ง์ด๊ทธ๋ ์ด์ ํด๋์ ์ฐ๊ฒฐ ๋ฐ์ดํฐ๊ฐ ์๋ ๋จ์ผ ํ๋ก์ ํธ(์ ๋จธ๋ฆฌ ๊ผญ๋๊ธฐ์์ ํ๋ก๋์ ์์ 4๋ฅผ ์๊ฐํ ์ ์์) ์ด์์์ ์ฌ์ฉํฉ๋๋ค.
0.15
๋ฒ์ ์์๋ ์ปดํ์ผ ์ค์ด๊ฑฐ๋ ts-node
์ฌ์ฉํ์ฌ ์๋์ผ๋ก ํ์ผ์ ์คํํ์ต๋๋ค.
๋ฐฉ๊ธ ํ ์คํธํ์ต๋๋ค ... ๋ง์ต๋๋ค. ๋ ๋ฒ์ ๋ชจ๋ ts-node ํญ๋ชฉ์ ๋ฑ๋กํ๋ ค๊ณ ํฉ๋๋ค. ํด๋น ๊ธฐ๋ฅ์ ํ ์คํธ๋์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค. ๋ฌธ์ํ๋์๋์ง๋ ํ์คํ์ง ์์ต๋๋ค.
์๋ ... ์ด์ ๋ ธ๋ 8์ ์ค์น๋ ํ์ ํญ๋ชฉ์ผ๋ก ์ค์ ๋ก ํ ์คํธํ์ต๋๋ค.
Mikaels-MacBook-Pro-2:test mikaelle$ npm install [email protected] ts-node-register
npm WARN [email protected] No description
npm WARN [email protected] No repository field.
+ [email protected]
+ [email protected]
updated 2 packages and audited 1037 packages in 2.135s
found 0 vulnerabilities
Mikaels-MacBook-Pro-2:test mikaelle$ echo "import * as knex from 'knex'; export = {client: 'pg'}" > knexfile.ts
Mikaels-MacBook-Pro-2:test mikaelle$ node_modules/.bin/knex migrate:make --knexfile knexfile.ts -x ts foo
Failed to load external module ts-node/register
Failed to load external module typescript-node/register
Failed to load external module typescript-register
Failed to load external module typescript-require
Failed to load external module @babel/register
/Users/mikaelle/Projects/Vincit/yessql/dodo-objection/test/knexfile.ts:1
(function (exports, require, module, __filename, __dirname) { import * as knex from 'knex'; export = {client: 'pg'}
^^^^^^
SyntaxError: Unexpected token import
์ฌํํ ์๋ ์์ง๋ง knex๋ ์ด๋ฏธ ts-node๋ฅผ ์ฌ์ฉํ์ฌ ์ค์ typescript ๋ง์ด๊ทธ๋ ์ด์ ํ์ผ ๋ฐ ์๋๋ฅผ ์ปดํ์ผํ๊ธฐ ๋๋ฌธ์ ๊ตฌํ ๊ฐ๋ฅํ ๊ธฐ๋ฅ์ ๋๋ค.
0.16์ด ์๋ 0.15์์ ์๋ํ๋ ์ด์ ๋ฅผ ์กฐ์ฌํ๋ ค๋ ๊ฒฝ์ฐ์ ๋๋นํ์ฌ ์ ์ฒด ์๋ฅผ ์ค์ ํ์ต๋๋ค.
๋ถ๊ธฐ: knex16
์ 0.16.3
์ค์น๋์์ต๋๋ค.
https://github.com/brunolm/knex16bug/tree/knex16
์ง์ : knex15
์ 0.15.2
์ค์น๋์์ต๋๋ค.
https://github.com/brunolm/knex16bug/tree/knex15
ํ์ธํ๋ ค๋ ๋ถ๊ธฐ๋ก ์ ํํ๊ณ ๋ฃจํธ ํด๋์์ ์คํํฉ๋๋ค.
docker-compose up
์๋ํ๋ฉด test
์ /api/src/db/migrations
test
๋ผ๋ ๋ง์ด๊ทธ๋ ์ด์
์ด ํ์๋ฉ๋๋ค.
๋ ๋ง์ ํจํค์ง(ts-node ts-node-dev typescript)๋ฅผ ์ค์นํ ํ 0.15์ 0.16 ๋ชจ๋ ์ฌ๊ธฐ์์ ์ ์๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค... ํ์ง๋ง ์ค์ ๋ก ๋ ธ๋ 0.16์ ์ฌ์ฉํ ๋์ปค ์ค์ ์ด ์คํจํ๊ณ ์ด์ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
Mikaels-MacBook-Pro-2:test mikaelle$ rm -fr node_modules/*
Mikaels-MacBook-Pro-2:test mikaelle$ npm install knex typescript ts-node
npm WARN [email protected] No description
npm WARN [email protected] No repository field.
+ [email protected]
+ [email protected]
+ [email protected]
added 295 packages from 184 contributors and audited 1213 packages in 6.59s
found 0 vulnerabilities
Mikaels-MacBook-Pro-2:test mikaelle$ node_modules/.bin/knex migrate:make --knexfile knexfile.ts test
Requiring external module ts-node/register
Created Migration: /xxx/migrations/20190119003358_test.js
Mikaels-MacBook-Pro-2:test mikaelle$ cat knexfile.ts
import * as knex from 'knex'; export = {client: 'pg'}
Mikaels-MacBook-Pro-2:test mikaelle$
docker-compose.yml์ ์์ ํ์ฌ ๊ฑฐ์ ๋์ผํ๊ฒ ๋ง๋ค์๊ณ ๋ค์๊ณผ ๊ฐ์ด ์คํจํฉ๋๋ค.
version: '3'
services:
api:
image: node:8.14.0
command: bash -c 'rm -fr api/node_modules; npm i knex ts-node typescript; node_modules/.bin/knex migrate:make --knexfile ./src/db/knexfile.ts test'
working_dir: /usr/src/app
volumes:
- ./api:/usr/src/app
api_1 | npm WARN [email protected] No repository field.
api_1 |
api_1 | + [email protected]
api_1 | + [email protected]
api_1 | + [email protected]
api_1 | updated 3 packages and audited 1176 packages in 9.804s
api_1 | found 0 vulnerabilities
api_1 |
api_1 | /usr/src/app/src/db/knexfile.ts:1
api_1 | (function (exports, require, module, __filename, __dirname) { import { database } from '../config'
api_1 | ^^^^^^
api_1 |
์ปจํ ์ด๋์ knexfile์ /usr/src/app๋ก ์ด๋ํ๋ฉด ์ฌ๋ฐ๋ฅด๊ฒ ์ปดํ์ผํ๋ ค๊ณ ์๋ํ์ง๋ง... ๋ก์ปฌ์์ ํด๋น ๋์์ ์ฌํํ ์ ์์ต๋๋ค. knexfile.ts๊ฐ ํ์ ๋๋ ํ ๋ฆฌ ์์ ์์ด๋ ๋ชจ๋ ๊ฒ์ด ์๋ํฉ๋๋ค...
0.16์์ ๋ฒ๊ทธ๋ฅผ ๋ฐ๊ฒฌํ๊ฑฐ๋ ์ด์ํ ๊ฒ์ ๋ฐ๊ฒฌํ ๊ฒ ๊ฐ์ต๋๋ค.
0.15์์ launch
๋ configPath
ํธ์ถ๋ฉ๋๋ค.
https://github.com/tgrisser/knex/blob/0.15.2/bin/cli.js#L260
๊ทธ๋ฌ๋ 0.16์์๋ ๋ค์๊ณผ ๊ฐ์ด ํธ์ถ๋ฉ๋๋ค.
knexfile: argv.knexfile,
knexpath: argv.knexpath,
https://github.com/tgriesser/knex/blob/0.16.3/bin/cli.js#L303 -L304
LiftOff๋ var env = this.buildEnvironment(opts);
๋ฅผ ์ ๋ฌํ๋ configPath
findConfig({
๋ฅผ ํธ์ถํ๋ var env = this.buildEnvironment(opts);
๋ฅผ ํธ์ถํฉ๋๋ค(๋ ์ด์ ์ ๊ณต๋์ง ์์). ๋ด๋ถ์ ์ผ๋ก configPath
๋ฅผ ์ฌ์ฉํ๊ณ knexfile
๋๋ knexpath
์ฐธ์กฐํ์ง ์์ต๋๋ค.
ํ๋ก์ ํธ์ typescript
๋ฐ ts-node
์ค์น๋์ด ์๊ณ v0.15๊ฐ ์ค์น๋์ด ์์ ๋ ์๋ํฉ๋๋ค(์: Git ๋ฆฌํฌ์งํ ๋ฆฌ์์ ์ ๊ณตํ ์์ ์ ๊ฐ์ต๋๋ค.
๋๋ ์ฝ๊ฐ์ ๋๋ฒ๊น ์ํ๊ณ ์ด๊ฒ์ ์ฐพ์์ง๋ง ์ฌ์ ํ 0.15์์ ์๋ํ๋ ์ด์ ๋ฅผ ์์ง ๋ชปํ์ต๋๋ค.
[email protected]
์ด ์ค์ ๊ฒฐ๊ณผ ๋ก๊น
var config = require(env.configPath);
https://github.com/tgriesser/knex/blob/0.15.2/bin/cli.js#L55
๋๋ ์ด๊ฒ์ ์ป๋๋ค
api_1 | require(/usr/src/app/src/db/knexfile.ts)------------ { client: 'postgresql',
api_1 | connection: 'postgres://user:password@db/api-db',
api_1 | migrations:
api_1 | { directory: '/usr/src/app/src/db/migrations1337',
api_1 | tableName: 'knex_migrations' },
api_1 | seeds: { directory: '/usr/src/app/src/db/seeds' } }
api_1 | this.config { extension: 'js',
api_1 | loadExtensions:
api_1 | [ '.co',
api_1 | '.coffee',
api_1 | '.eg',
api_1 | '.iced',
api_1 | '.js',
api_1 | '.litcoffee',
api_1 | '.ls',
api_1 | '.ts' ],
api_1 | tableName: 'knex_migrations',
api_1 | schemaName: null,
api_1 | directory: '/usr/src/app/src/db/migrations1337',
api_1 | disableTransactions: false }
๋ง์ด๊ทธ๋ ์ด์
๋๋ ํ ๋ฆฌ๋ directory: '/usr/src/app/src/db/migrations1337',
๋ผ๊ณ ๋งํ๊ณ ์๋๋ฐ, ์ด๋ ์ ํํ ๋ด๊ฐ knexfile.ts์ ๊ฐ์ง๊ณ ์๋ ๊ฒ์
๋๋ค.
๊ทธ๋ฆฌ๊ณ .ts ํ์ผ์ด ์ง์ ํ์ํฉ๋๋ค.
require('/usr/src/app/src/db/knexfile.ts')
[email protected]
์๊ตฌ ์ฌํญ์ ์ ํํ ๋์ผํ ํ์ผ์ ์์ง๋ง ์คํจํฉ๋๋ค.
// /usr/src/app/src/db/knexfile.ts
env.configuration = require(resolvedKnexfilePath);
[email protected]
typescript
๋ฐ ts-node
. ์ด์ ๋๋ ์ด๊ฒ์ ์ป๋๋ค.
api_1 | Failed to load external module ts-node/register
api_1 | Failed to load external module typescript-node/register
api_1 | Failed to load external module typescript-register
api_1 | Failed to load external module typescript-require
api_1 | Failed to load external module @babel/register
cli.on('requireFail', function(name) {
console.log(chalk.red('Failed to load external module'), chalk.magenta(name));
});
https://github.com/tgriesser/knex/blob/0.15.2/bin/cli.js#L254
16์์๋ ์ด ๋ฉ์์ง๊ฐ ์ ํ ๋ณด์ด์ง ์๊ณ ๊ทธ๋ฅ ๊นจ์ง๋๋ค.
@elhigu ์์์ด์ ํ๋ณด๋
https://github.com/tgrisser/knex/pull/3005
์ด๊ฒ์ ์๋ง๋ ์ด๋๊ฐ์ ๋ฒ๊ทธ ์ผ ๊ฒ์ด๋ฏ๋ก ๋ค์ ์ด๋ฉด ... ์ฌ์ง์ด osx์์ ์ฌํํ๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ฆ ๋๋ค.
์ฐธ๊ณ ๋ก, ๋๋ brunolm์ ์์ ๋ฅผ ์คํํ๊ณ knex 0.15.2๋ ์๋ํ์ง๋ง knex 0.16.3์ ์๋ํ์ง ์์ต๋๋ค.
@scorbin ์,
์ฌ๊ธฐ์๋ ๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค(TypeScript ๋ง์ด๊ทธ๋ ์ด์
+ 0.16.3).
๋ Migrator#latest
์, ๊ทธ ์์์ด๋ผ๊ณ migrationListResolver#listAllAndCompleted
์ฐจ๋ก๋ก ํธ์ถํ๋์ listAll(config.migrationSource)
๊ฒฝ์ฐ migrationSource
๊ฐ์ง loadExtensions = [".co", ".coffee", ".eg", ".iced", ".js", ".litcoffee", ".ls", ".ts"]
, ์ฌ์ง์ด์๊ฒ ๊ฒฝ์ฐ { โฆ, loadExtensions: ['.js'], โฆ }
๋ง์ด๊ทธ๋ ์ด์
๊ธฐ ๊ตฌ์ฑ์
๊ฒฐ๊ณผ์ ์ผ๋ก, ๊ทธ๊ฒ์ ๋ชจ๋ ์ ํํฉ๋๋ค .ts
ํ์ผ๊ณผ .js
ํ๊ณ ์์ ๊ฐ ์์๋ ๋ง์ด๊ทธ๋ ์ด์
์๋ ค์ค๋๋ค .ts
๊ทธ๋ค์ ์์ง ์ ์ฉ๋์ง ์๊ฒ ์ด์ผ๊ธฐํ๊ณ ์๊ธฐ ๋๋ฌธ์ (ํ์ผ, ๋ถ๋ช
ํ) #getMigration
๊ฐ ๋ง์นจ๋ด ์คํฌ๋ฆฝํธ๋ฅผ ํ๊ฐํ๊ธฐ ์ํด ํธ์ถ๋ ๋ ์ค๋จ๋ฉ๋๋ค(TypeScript์ธ ๋ง์ด๊ทธ๋ ์ด์
์คํฌ๋ฆฝํธ๋ก #require
๋ฅผ ํธ์ถํ๊ธฐ ๋๋ฌธ์).
๋์์ด ๋์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค...
๋ค์๊ณผ ๊ฐ์ ์ฝ๊ฐ์ ๋ณ๊ฒฝ์ผ๋ก ๋ชจ๋ ๊ฒ์ด ์ ์์ผ๋ก ๋์์ต๋๋ค.
function listAllAndCompleted(config, trxOrKnex) {
return _bluebird.default.all([listAll(config.migrationSource, config.loadExtensions), listCompleted(config.tableName, config.schemaName, trxOrKnex)]);
}
๋๋ ๊ทธ๊ฒ์ด ๋ง์ด๊ทธ๋ ์ด์ ์์ ๋์์ธ๊ณผ 100% ํธํ๋๋์ง ๊ฒ์ฆํ์ง ์์์ต๋๋ค. :)
Knex ๋ฒ์ 0.16.3
์์ ๋์ผํ ๋ฌธ์ ์ ์ง๋ฉดํ์ต๋๋ค.
import * as Knex from 'knex';
^^^^^^
SyntaxError: Unexpected token import
at createScript (vm.js:80:10)
at Object.runInThisContext (vm.js:139:10)
at Module._compile (module.js:617:28)
at Object.Module._extensions..js (module.js:664:10)
์ด ์๋ฃจ์
์ ๊ถ์ฅ๋์ง ์์ง๋ง knexfile.ts
ํ์ผ์ ์์ ๋ถ๋ถ์ ts-node/register
๋ฅผ ์ถ๊ฐํ์ฌ ๊ฐ๋จํ ํด๊ฒฐํ์ต๋๋ค.
require('ts-node/register');
//
0.16.4-next2์์ ์์ ๋์ด์ผ ํฉ๋๋ค.
๋ฐฉ๊ธ 0.16.4-next2๋ฅผ ์๋ํ์ต๋๋ค. ๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ฌ ์ฌํ๋ค
@brunolm 0.16.4-next2๊ฐ ์ฌ์ ํ ์คํจํ๋์ง ํ์ธํ ์ ์์ต๋๊น?
@pvoisin 0.16.4-next2์์ ์๋ํฉ๋๊น?
@kibertoad 0.16.4-next2์์ ๋๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
์, ์ด์ ๋ํ ์ ์ ํ ์์ ์ migration:make ์์ knexfile์ ๋ํ ์ข ์์ฑ์ ์์ ํ ์ ๊ฑฐํ๋
๋๋ ์ฃฝ์ ๋ง์ ์ด๊ธฐ๊ณ ์ถ์ง ์์ง๋ง @kibertoad ๋
@juliancoleman ์ด๊ฒ์ ์ฌํํ๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค. ๊ทธ๋ฌ๋ ์ค์ ๋ก ์์ ์ฌํญ์ ํ๊ท ํ ์คํธ๊ฐ ์ถ๊ฐ๋์ด์ผ ํฉ๋๋ค(์ค์ ๋ก ์๋์ง ํ์ธํ์ง ์์๊ณ ํ ์คํธ๋ ci env์์ ์คํจํ์ง ์์์ต๋๋ค).
์ฌ์์ฐํ๊ธฐ ์ด๋ ค์ด ๊ฒ์ ์ค์ ๋ก ๊ณต์ ํฉ๋๋ค. ๋ด๊ฐ ๋ค๋ฅผ ๋์๋ณด๊ณ ๋๋ฅผ ํฌํจํ์ฌ ์๋ฌด๋ ์ฌ์์ฐ ๋จ๊ณ๋ฅผ ์ถ๊ฐํ์ง ์์ ๊ฒ์ ๋ณด์๊ธฐ ๋๋ฌธ์ ๋๋ค.
[email protected]
์ถ๊ฐknexfile.ts
Model.knex
์์ knex ๊ตฌ์ฑ์ ์ธ์คํด์คํํฉ๋๋ค.package.json
๋ค์ ์คํฌ๋ฆฝํธ ์ถ๊ฐ"knex": "knex --knexfile ./path/to/Knexfile.ts"
yarn knex migrate:latest
SyntaxError
๋๋ ์์ ์ ์์ํ ํ๋ก์ ํธ์์ ์ด ๋จ๊ณ๋ฅผ ํ์ธํ๊ณ , ๊ทธ๋ก ์ธํด ์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.
"knex": "^0.16.4-next2",
git clone [email protected]:brunolm/knex16bug.git
cd knex16bug
git checkout knex16
npm run api-i
docker-compose up
api_1 | > knex migrate:make --knexfile ./src/db/knexfile.ts "test"
api_1 |
api_1 | /usr/src/app/src/db/knexfile.ts:1
api_1 | (function (exports, require, module, __filename, __dirname) { import { database } from '../config'
api_1 | ^^^^^^
api_1 |
api_1 | SyntaxError: Unexpected token import
api_1 | at createScript (vm.js:80:10)
api_1 | at Object.runInThisContext (vm.js:139:10)
api_1 | at Module._compile (module.js:617:28)
api_1 | at Object.Module._extensions..js (module.js:664:10)
api_1 | at Module.load (module.js:566:32)
api_1 | at tryModuleLoad (module.js:506:12)
api_1 | at Function.Module._load (module.js:498:3)
api_1 | at Module.require (module.js:597:17)
api_1 | at require (internal/module.js:11:18)
api_1 | at initKnex (/usr/src/app/node_modules/knex/bin/cli.js:62:25)
api_1 | at Command.commander.command.description.option.action (/usr/src/app/node_modules/knex/bin/cli.js:172:24)
api_1 | at Command.listener (/usr/src/app/node_modules/commander/index.js:315:8)
api_1 | at emitTwo (events.js:126:13)
api_1 | at Command.emit (events.js:214:7)
api_1 | at Command.parseArgs (/usr/src/app/node_modules/commander/index.js:654:12)
api_1 | at Command.parse (/usr/src/app/node_modules/commander/index.js:474:21)
api_1 | npm ERR! code ELIFECYCLE
api_1 | npm ERR! errno 1
api_1 | npm ERR! [email protected] migrate-make: `knex migrate:make --knexfile ./src/db/knexfile.ts "test"`
api_1 | npm ERR! Exit status 1
api_1 | npm ERR!
api_1 | npm ERR! Failed at the [email protected] migrate-make script.
api_1 | npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
api_1 |
api_1 | npm ERR! A complete log of this run can be found in:
api_1 | npm ERR! /root/.npm/_logs/2019-03-18T21_39_10_408Z-debug.log
๋ด PR์ ๊ทธ๊ฒ์ ๊ณ ์ณค์ต๋๋ค. ๋๊ตฐ๊ฐ๊ฐ ๊ทธ๊ฒ์ ์กฐ์ฌ ํ ์ ์๋ค๋ฉด ๊ทธ๊ฒ์ ์์ ํ ํ ์คํธ ํ ์ง์์ด ์์ต๋๋ค ...
๋๋ ์ฃฝ์ ๋ง์ ์ด๊ธฐ๊ณ ์ถ์ง ์์ง๋ง @kibertoad ๋
์ฃ์กํฉ๋๋ค. ์ฌ๊ธฐ ์์คํ ๋ฅด๋ด์ ๋ฆ์ ์๊ฐ์ด์๊ณ ๋จ์ด ์ ํ์ด ์ ๋ง ์ต์ ์ด ์๋์์ต๋๋ค. "0.16.4-next2๊ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ฉด ์๋ ค์ฃผ์ธ์"๋ผ๊ณ ํ์ด์ผ ํ๋๋ฐ, TBH๊ฐ ๊ทธ๋ฌ๋ค๋ฉด ๋งค์ฐ ๋๋์ ๊ฒ์ ๋๋ค. ์ด ์์ ์ฌํญ์ด ์ค์ ๋ก ์์ ๋ ์ฌํญ์ ์ ํํ ํ์ธํ๋ ๋จ์ ํ ์คํธ๊ฐ ์์ฑ๋์์ผ๋ฉฐ, ์ด์ ์ ๋ ์ ๊ฐ ์คํดํ๊ณ ์๋ ๊ฒ์ด ์๊ณ ๊ทธ ๋ฌธ์ ๊ฐ ์ ๊ฐ ์๊ฐํ๋ ๊ฒ๊ณผ ์ ํํ ์ผ์นํ๋ค๊ณ ํ์ ํฉ๋๋ค. knexfile์ ์์ ํ ์ฐํํ๋ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ ๊ฐ๊น์ด ์ฅ๋์ ๊ฐ์ ํ๋ ค๋ ์์คํ ๋์์ด์ง๋ง ์ด์ ์ ์ ๋ฌ๋๊ธฐ ์ํด์๋ ์ฝ๊ฐ์ ์ ์ ์กฐ๊ฑด์ด ํ์ํฉ๋๋ค. ๋ถํธ์ ๋๋ ค ์ฃ์กํฉ๋๋ค. ์๊ฐ์ ์ฃผ์ธ์. ๊ทธ ๋์ ts-node๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ ์ ํ ์๋ฃจ์ ์ผ๋ก ๋ณด์ ๋๋ค. knexfile์ ๋ง์ด๊ทธ๋ ์ด์ ํ์ผ์ ์์น์ ๊ดํ ๋จ์ผ ์ ๋ณด ์์ค๋ก ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ์ค์ ๋ก knexfile์ ์์กดํ์ง ์๋ ๊ฒ๋ณด๋ค ๋ ํดํน์ ์ด๋ผ๊ณ ์ฃผ์ฅํ ์ ์์ต๋๋ค.
@kibertoad
์ด์ ์ ์๋ํ ์ ์์๋ ์ ์ผํ ๋ฐฉ๋ฒ์ knexfile์ ์์ ํ ์ฐํํ๋ ๊ฒ์ ๋๋ค.
์ด๊ฒ์ ์ฌ์ค์ด ์๋๋๋ค. ์ด์ ์๊ฒฌ์ ์ฐธ์กฐํ์ญ์์ค. ๋ชจ๋ ๊ฒ์ด 0.15์์ ์๋ํฉ๋๋ค.
@brunolm ํ์ง๋ง ๊ฐ์ค์ ์ผ๋ก Typescript ํ์ผ์ ๊ตฌ๋ฌธ ๋ถ์ํ๋ ๋์ Node.js๊ฐ ์ง์ํ์ง ์๋ ๋ฐฉ๋ฒ์ ๊ธฐ์ ์ ์์ค์์ ์ค๋ช ํ ์ ์์ต๋๊น? PR์ ํ์ธํด ๋ณด๊ฒ ์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ถ๊ทน์ ์ผ๋ก (๋ค๋ฅธ ์๋จ์ ํตํด) ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. knexfile์ ์ฐํํฉ๋๋ค.
@kibertoad ํ์ฌ ts-node๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ๊ธฐ์ ์์ค์์ ์ ์ด๋ฐ ์ผ์ด ๋ฐ์ํ๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
์์ค๋ฅผ ํ์ธํ ์๊ฐ์ด ์๋ค๋ฉด ๊ทธ๋ ๊ฒ ํ๊ฒ ์ง๋ง, ์ ๋ Knex๋ฅผ ๋ช ๋ ๋์ ์ฌ์ฉํด ์์ผ๋ฉฐ ์ด ์์ ์์ ์๋ํ๋ค๊ณ ๋ฏฟ์ต๋๋ค. ๋๋ 0.15๋ก ๋๋๋ ธ๊ณ ๋ชจ๋ ๊ฒ์ด ์๋ํฉ๋๋ค ... ๋ฌผ๋ก ์ด๊ฒ์ ์ ์ธํ๊ณ
@brunolm ํ์ง๋ง ๊ฐ์ค์ ์ผ๋ก Typescript ํ์ผ์ ๊ตฌ๋ฌธ ๋ถ์ํ๋ ๋์ Node.js๊ฐ ์ง์ํ์ง ์๋ ๋ฐฉ๋ฒ์ ๊ธฐ์ ์ ์์ค์์ ์ค๋ช ํ ์ ์์ต๋๊น? PR์ ํ์ธํด ๋ณด๊ฒ ์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ถ๊ทน์ ์ผ๋ก (๋ค๋ฅธ ์๋จ์ ํตํด) ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. knexfile์ ์ฐํํฉ๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด knexfile.ts ํ์ผ์ ๋ฌด์ํ์ง ์๊ณ knex 0.15
์์ ์์ ํ ์๋ํ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
git clone [email protected]:brunolm/knex16bug.git
cd knex16bug
git checkout knex15
npm run api-i
docker-compose up
๊ทธ๋ฌ๋ knex 0.16
์์ ๋๊ฐ์ ๊ฒ์ ์คํํ๋ฉด ์ค๋ฅ๊ฐ ํ์๋ฉ๋๋ค. ์ด๊ฒ์ ๋ณต์ ํ๋ ๊ฒฝ์ฐ ์ฌ๋ฐ๋ฅธ ๋ฒ์ ์ธ์ง ํ์ธํ ์ ์๋๋ก ๋ค๋ฅธ ํด๋์ ๋ณต์ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
git clone [email protected]:brunolm/knex16bug.git
cd knex16bug
git checkout knex16
npm run api-i
docker-compose up
์ด์ ์ @brunolm์ ํด๋น ์๋ฅผ ํ์ธ
๋ฐ๋ผ์ ํ์ฌ ๋ฌธ์ ๋ ์ค์ ๋ก 0.16์์๋ ์คํจํ๊ณ 0.15์์๋ ์๋ํ๋ knex CI์ ๋ํ ํ ์คํธ ์ผ์ด์ค๋ฅผ ์์ฑํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. CI๊ฐ ์ค๋๋ ์ฐ๋ถํฌ๋ฅผ ์คํํ๊ณ ์๊ธฐ ๋๋ฌธ์ ํ ์คํธ ์ผ์ด์ค๊ฐ ์ ๋๋ก ์๋ํ ์ ์์ต๋๋ค(์คํจ๋ฅผ ์๋ฏธ).
๋ด ์ชฝ์์ ๋น ๋ฅธ ์
๋ฐ์ดํธ. ์ด๊ฒ์ด ์ ์ฉํ์ง ์๋์ง ํ์คํ์ง ์์ง๋ง ๋ด ๋ฌธ์ ๋ ๋ด ํ๋ก์ ํธ์์ ์ฌ๋ฌ tsconfig.json
ํ์ผ์ ์ฌ์ฉํ๊ณ ์์๊ณ knex
๊ฐ ๊ธฐ๋ณธ๊ฐ์ ์ฌ์ฉํ๊ณ ์๋ค๋ ๊ฒ์ด์์ต๋๋ค. knex
์ฌ์ฉํ์ฌ ts-node
knex
๋ฅผ ์ง์ ์คํํ์ฌ ์ด ๊ธฐ๋ฅ์ ๋ฌด์ํ์ ๋ ์ด ์ค๋ฅ๋ฅผ ํด๊ฒฐํ ์ ์์์ต๋๋ค.
์
๋ฐ์ดํธ๋ ๋ด package.json
:
// ...
"knex": "ts-node --project tsconfig.server.json $(npm bin)/knex --knexfile ./src/server/knexfile.ts",
// ...
์ง๊ธ ๋ง์ด๊ทธ๋ ์ด์ ์ ์คํํ๋ ๋ฐฉ๋ฒ:
npm run knex -- migrate:latest
์ด๊ฒ์ด ๋๊ตฐ๊ฐ๋ฅผ ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
@FindAPattern tsconfig๋ฅผ ๊ฒ์ํ์๊ฒ ์ต๋๊น? ์ฌ๊ธฐ ๋ด๊บผ์ผ ts-node
์ ๊ณตํ ๋ ๋น๋ํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ํ๋๋ง ์ฌ์ฉํฉ๋๋ค.
{
"compilerOptions": {
"noEmit": true,
"rootDir": "src",
"target": "es6",
"module": "commonjs",
"moduleResolution": "node",
"declaration": true,
"inlineSourceMap": true,
"resolveJsonModule": true,
},
"include": [
"src/**/*.ts",
],
"exclude": [
"src/**/*.spec.ts"
]
}
์๋ ํ์ธ์! ์ด์ ๋ํ ์ง์ ์ด ์์ต๋๊น?
@brunolm ์ด๋ป๊ฒ ํด๊ฒฐํ์๋์? ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
@algil ์์ง ์ ํ๋ก์ ํธ๋ฅผ ์ ๋ฐ์ดํธํ๊ฑฐ๋ ์์ํ ํ์๊ฐ ์์๊ธฐ ๋๋ฌธ์ ์ฌ์ ํ 0.15๋ฅผ ๋๋ถ๋ถ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
ํ์ง๋ง ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ PR์ ๋ง๋ค์์ต๋๋ค. knex๋ฅผ ํฌํฌํ๊ณ ๋ค์ ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ฉํ ์ ์์ต๋๋ค. https://github.com/tgrisser/knex/pull/3005
๋ถํํ๋ ๊ทธ๋ ๊ฒ ๊ฐ๋จํ์ง ์์ต๋๋ค. ์ด๋ฒ ์ฃผ์ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ค๋จํ์ง ์๋ ์์ ์ฌํญ์ ์ ์ํ๋ ค๊ณ ๋ ธ๋ ฅํ ๊ฒ์ ๋๋ค.
์ด์ฉ๋ฉด ๊ทธ๊ฒ์ ๋๊ตฐ๊ฐ๋ฅผ ๋์ธ ๊ฒ์
๋๋ค. tsconfig.json "module": "es2015"๋ฅผ "module": "commonjs"๋ก ๋ณ๊ฒฝํ ๋ ์์ ๋จ
package.json => "migrate"์ ๋ช
๋ น: "ts-node -P ./tsconfig.json node_modules/.bin/knex migrate:latest --knexfile knexfile.ts".
์ด์ฉ๋ฉด ๊ทธ๊ฒ์ ๋๊ตฐ๊ฐ๋ฅผ ๋์ธ ๊ฒ์ ๋๋ค. tsconfig.json "module": "es2015"๋ฅผ "module": "commonjs"๋ก ๋ณ๊ฒฝํ ๋ ์์ ๋จ
package.json => "migrate"์ ๋ช ๋ น: "ts-node -P ./tsconfig.json node_modules/.bin/knex migrate:latest --knexfile knexfile.ts".
์ต์ ์ ์๋ฃจ์ ์ ์๋์ง๋ง ์ ์๋ํฉ๋๋ค.
@Areshetcov @Meldiron ์์์ ๋ณผ ์ ์๋ฏ์ด commonjs
๋ชจ๋์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ๋๋ ์ ๋ง๋ก ํ์ํ ๊ฒ์ ๋ ๊น์ ์ง์์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋ฐ๋์ ๋ง์ ์ฌ์ฉ์ ๊ตฌ์ฑ์ ์ผ์ผํค์ง๋ ์์ต๋๋ค. ๊ทธ๊ฒ์ด ์ ๋ง๋ก ์ต์
์ด ์๋ ํ
์ด ๋ฌธ์ ๊ฐ ํ์ฌ ๋ค์ณ์ง ๋ฆด๋ฆฌ์ค์ ์ด๋ค ๊ด๋ จ์ด ์๋์ง ๊ณ ๋ คํ๋ฉด ํ์ฌ 0.17.6
์
๋๊น?
@juliancoleman knex ๋ ์ฌ์ ํ knexfile.js๋ฅผ ์ด๋ ค๊ณ ์๋ํ๊ณ Javascript ํ์์ด ์๋ ๊ฒฝ์ฐ ํญ๋ฐํ๋ฏ๋ก ts-node๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ฌ์ ํ ์ต์์ ์๋ฃจ์ ์ ๋๋ค. ๊ทธ๋ฌ๋ ๋ ๋ง์ ๊ฒฝ์ฐ(์: ๋ง์ด๊ทธ๋ ์ด์ ์์ฑ ๋๋ ๊ธฐ๋ณธ ์์น์์ knexfile ํด๊ฒฐ)์์ TS ํ์ฅ์ ๋ณด๋ค ์ ์์ ์ผ๋ก ์ฒ๋ฆฌํ๋๋ก ๊ฐ์ ๋์์ต๋๋ค. ์ด๋ค ํน์ ๋ฌธ์ ๊ฐ ์์ต๋๊น?
์ด์จ๋ ์ด ๋ฌธ์ ์ ๋ํด ์๊ธฐ์์ผ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ๋๋ ์ฃผ๋ง์ ๋ ๋ค๋ฅธ ์ค์์ ์๋ํ ๊ฒ์ ๋๋ค. ์ํ๋ฉด ์ ์ด๋ ๊ณผ๊ฑฐ์ ํจ๊ณผ๊ฐ ์์๋ ์ด์ ๋ฅผ ์ดํดํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.:D
๋ด๊ฐ ๊ทธ PR์ ๋ง๋ค ๋ TypeScript๋ฟ๋ง ์๋๋ผ babel ๋ฐ ๊ธฐํ ๋ค๋ฅธ ๊ฒ๋ค๊ณผ๋ ์๋ํด์ผ ํ๋ค๋ ๊ฒ์ ์์์ต๋๋ค. ์ ๊ธฐ์ต์ด ๋ง๋ค๋ฉด ์ด ๋ชจ๋ ๊ฒ์ ์ฒ๋ฆฌํ๋ ํจํค์ง๊ฐ ์์ต๋๋ค.
๋ด PR์ ์ ์ฉํ ํํธ๊ฐ ์์ ์ ์์ต๋๋ค. https://github.com/tgrisser/knex/pull/3005/files
๋ด๊ฐ ๊ฐ์ง ๋ฌธ์ ๋ npm run knex migrate:latest
์คํํ ๋ unexpected token '{'
์
๋๋ค. ์ด API์๋ง ts-node๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋๋ ๋ฒ๋ค๋ฌ๋ฅผ ํตํด ์คํํ์ง ์์ผ๋ฉฐ TS๋ฅผ ์ปดํ์ผํ์ง๋ ์์ต๋๋ค. ๊ทธ๋ ๊ฒ ํ๋ ๊ฒ์ ์๋ง๋ ์ข์ ์ผ์ด ์๋ ๊ฒ์
๋๋ค. ํ์ง๋ง ์ง๊ธ์ ๊ทธ๋ ๊ฒ ํ๊ณ ์์ต๋๋ค. ๊ทธ๋ฌ๋ Typescript๋ ํ์ฌ typescript ํ์ผ์ ๊ฐ์ ธ์ฌ ์ ์๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. ๋จผ์ ๊ตฌ์ถํด์ผ ํฉ๋๋ค. Knex๋ฟ๋ง ์๋๋ผ ๋ค๋ฅธ ๊ณณ์์๋ ๊ฒฝํํ์ต๋๋ค.
๊ทธ๋ฌ๋ Typescript๋ ํ์ฌ typescript ํ์ผ์ ๊ฐ์ ธ์ฌ ์ ์๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค.
ts-node
๊ฐ require()
typescript ํ์ผ์ ๋ก๋ํ ์ ์๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๊น? Migrator๋ require()
๋ฅผ ์ฌ์ฉํ์ฌ ํด๋น ๋ง์ด๊ทธ๋ ์ด์
ํ์ผ์ ๋์ ์ผ๋ก ๋ก๋ํฉ๋๋ค...
๋ค๋ฅธ ์ฌ๋์ด ๋์ ๊ฐ์ ๋ฌธ์ ๊ฐ ์๋ ๊ฒฝ์ฐ ์ฌ๊ธฐ์์ ์๋ฆฌ๋ฅผ ์ง๋ฅด์ธ์. [email protected]
์๊ณ ๋ณธ์ง์ ์ผ๋ก* knex --knexfile src/knexfile.ts
๋ฅผ ์คํํ๋ ค๊ณ ํ์ผ๋ ๋ถ๋ช
ํ knexfile์ JS๋ก ์ฝ์ผ๋ ค๊ณ ์๋ํ๊ธฐ ๋๋ฌธ์ ์คํจํ์ต๋๋ค. knex --cwd src
์ฌ์ฉํ๋ฉด ์๋ํ ๋๋ก ์๋ํฉ๋๋ค.
*) ์ค์ ๋ช
๋ น์ค์ node -r dotenv/config node_modules/knex/bin/cli [...]
์ด์ง๋ง ์๋ง๋ ์ค์ํ์ง ์์ ๊ฒ์
๋๋ค.
@ilkka ์ด ๋งฅ๋ฝ์์ "์๋ํ ๋๋ก ์๋ํจ"์ด ๋ฌด์์ ์๋ฏธํ๋์ง ๋ช
ํํ node
๊ฐ ์๋๋ผ ts-node
์คํํ๊ณ ์๋ค๋ ์ ์ ๊ณ ๋ คํ ๋ knexfile.ts ๊ตฌ๋ฌธ ๋ถ์์ ์คํจํ ๊ฒ์ Knex๊ฐ ์๋๋ผ Node.js์
๋๋ค. ํ์ผ ์ด๋ฆ ํ์ธ์ด ์๋ชป ์๋ํ๋ค๋ ๊ฒ์ ์๋ฏธํ์ง ์๋ ํ.
knex --cwd src
์ค์ ๋ก ๋ฌธ์ ์ knexfile์ ์ด ์ ์๊ณ ๊ตฌ์ฑ ๋ณ๊ฒฝ์ ์ฌ๋ฐ๋ฅด๊ฒ ๋ฐ์ํฉ๋๊น?
์, ๋ถ๋ถ๋ช
ํด์ ์ฃ์กํฉ๋๋ค. npm ์คํฌ๋ฆฝํธ์์ knex๋ฅผ ์คํํ ๋ --cwd
๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ๋ฉด "์ธ๋ถ ๋ชจ๋ ts-node/register ํ์"๋ฅผ ๋ณด๊ณ ํ๊ณ knexfile์ ์ฝ๊ณ ์๋ํฉ๋๋ค. npm ์คํฌ๋ฆฝํธ ์ธ๋ถ์์ npx knex
๋ก ์คํํ๋ฉด ๋์์ ๋์ผํฉ๋๋ค.
@ilkka ํฅ๋ฏธ
๋ชจ๋ ์๊ตฌ์ ๋ํ ๋ฉ์์ง๋ Liftoff ์ด๋ฒคํธ('require'๊ฐ Liftoff์์ ๋ค๋ฅธ ์ด๋ฆ์ผ๋ก ์ด๋ฆ์ด ๋ณ๊ฒฝ๋๊ธฐ ์ )๋ก ์ธํด ์ฌ๊ธฐ ์ coffee-script
์ ๊ฐ์ ํธ๋์คํ์ผ๋ฌ๋ฅผ ์๋์ผ๋ก ๋ก๋ ๋ฐ ๋ฑ๋ก"ํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๋ฉ๋ชจ๊ฐ ์์ต๋๋ค. ๊ทธ๋์... ์ด ํน์ ์ธ์คํด์ค์์ ๋ด ๊ฒฝ๋ก์ ts-node
๊ฐ ์์ผ๋ฉด ์ด ์์
์ ์ํํ๊ธฐ์ ์ถฉ๋ถํ ๊น์? ์๋นํ ๋ณต์กํ ์์คํ
์
๋๋ค.
์ด์จ๋ , ์ด์ npm ์คํฌ๋ฆฝํธ์์ node
๋ฅผ ts-node
๋ก ๋ณ๊ฒฝํ ์ ์์๊ณ ๋ํ ์๋ํ์ ๊ฒ์ด๋ผ๋ ๊ฒ์ ๊นจ๋ฌ์์ต๋๋ค.
์กฐ์ฌํด ์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค. ์ด ๊ฒฝ์ฐ ๋ฆฌํํธ์คํ ๋์์ ์ํํ ์ ์๋์ง ์์๋ณด๊ฒ ์ต๋๋ค. D
ํ์ง๋ง ์, ts-node๋ฅผ ์ง์ ์ฌ์ฉํ๋ฉด ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ํฉ๋๋ค.
๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค. ์๋ชป๋ tsconfig.json
๋ณต์ฌํ ๊ฒ์ผ๋ก ๋ํ๋ฌ์ต๋๋ค. ์ด์ ์๋ํฉ๋๋ค. ๊ด๋ จ ๊ตฌ์ฑ:
package.json(์์ ๊ณต๊ฐ)
"scripts": {
"migrate:make": "knex --cwd src migrate:make -x ts"
},
"dependencies": {
"knex": "0.19.0",
"pg": "7.11.0"
}
package.json(๋ฃจํธ):
"ts-node-dev": "1.0.0-pre.40",
(ts-node ๋ฒ์ : 8.3.0)
tsconfig.json(์์ ๊ณต๊ฐ):
{
"extends": "../../tsconfig.node.json",
"compilerOptions": {
"rootDir": "./src",
"outDir": "./build",
}
}
tsconfig.node.json(๋ฃจํธ):
{
"compilerOptions": {
"target": "es2015",
"moduleResolution": "node",
"esModuleInterop": true,
"strict": true,
"alwaysStrict": true,
"declaration": true,
}
}
src/knexfile.ts:
import { Config } from 'knex'
export = {
client: 'pg',
connection: {
database: 'db',
user: 'user',
},
} as Config
์คํํ ๋ช ๋ น:
yarn migrate:make my_migration_name
[email protected]
์์ ๋ฌธ์ ๊ฐ ๊ณ์ ๋ฐ์ํฉ๋๋ค.
git clone [email protected]:brunolm/knex16bug.git
cd knex16bug
git checkout knex19
npm run api-i
docker-compose up
api_1 | /usr/src/app/src/db/knexfile.ts:1
api_1 | (function (exports, require, module, __filename, __dirname) { import { database } from '../config'
api_1 | ^^^^^^
@brunolm ์ ๊ทธ๋ ๊ฒ ๋ฌด์งํฉ๋๊น?
diff --git a/api/package.json b/api/package.json
index c0f8bff..0906f51 100644
--- a/api/package.json
+++ b/api/package.json
@@ -8,7 +8,7 @@
"dev": "ts-node-dev --respawn --poll --no-notify src/index.ts",
"\n# Database": "",
"migrate": "knex migrate:latest --knexfile ./src/db/knexfile.ts",
- "migrate-make": "knex migrate:make --knexfile ./src/db/knexfile.ts",
+ "migrate-make": "knex migrate:make --cwd src/db",
"seed": "knex seed:run --knexfile ./src/db/knexfile.ts",
"seed-make": "knex seed:make --knexfile ./src/db/knexfile.ts",
"\n# Testing": "",
api_1 | > [email protected] migrate-make /usr/src/app
api_1 | > knex migrate:make --cwd src/db "test"
api_1 |
api_1 | Requiring external module ts-node/register
api_1 | Working directory changed to /usr/src/app/src/db
api_1 | Created Migration: /usr/src/app/src/db/migrations/20190723173751_test.ts
--knexfile
์ง์ ํด๋ ์ฌ์ ํ ์๋ํ์ง ์์ต๋๋ค.
๋์ --cwd src/db
์ฌ์ฉํ๋ฉด ์๋ํฉ๋๋ค.
cwd
๋ณด๋ค knexfile
cwd
๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค๋ ๋ฌธ์๊ฐ ๋ช
ํํ์ง ์์ต๋๋ค.
ํจ์ ์๋ช ์ ํ์ธํ์ง ์์์ต๋๋ค. ์ฌ๋ฐ๋ฅธ ๋งค๊ฐ๋ณ์๋ฅผ ์ ๋ฌํ๋๋ก PR์ ๋ณ๊ฒฝํ์ ๋ ์ฌ์ ํ ์๋ชป๋ ๋งค๊ฐ๋ณ์๋ฅผ ์ ๋ฌํ๊ณ ์์ ์ ์์ต๋๋ค.
์๋ ์๋ค์
๋๋ ๋ํ์ด ์ค๋ฅ๊ฐ ์์๋ค
๋ด ์๊ฐ์ ๋ฌธ์ ๋ --knexfile
์ต์
์ด knexfile.ts์ ๋๋ ํ ๋ฆฌ๋ฅผ ์๋ชป ์ค์ ํ๋ค๋ ๊ฒ์
๋๋ค.
๋๋์ ๋ช
์ ์ ๋ฐฉํฅ ์ค์ ๊ทธ๋์ --cwd
๊ฐ์ง ๋๋ ํ ๋ฆฌ knexfile.ts
๊ทธ๊ฒ์ ๋๋ฅผ ์ํด ์๋ํฉ๋๋ค: "knex migrate:make --cwd src"
(์ด๊ฒ์ ๋์ผํฉ๋๋ค: "cd src knex migrate:make"
)
knex migrate:make --knexfile knexfile.ts -x ts new_script
์๋ํ์ต๋๋ค
๋ค์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
'knex'์์ knex ๊ฐ์ ธ์ค๊ธฐ;
^^^^
๊ตฌ๋ฌธ ์๋ฌ : ์๊ธฐ์น ์์ ์๋ณ์
cwd๋ฅผ ์ถ๊ฐํ ๋
๋ด๋ถ/ํ๋ก์ธ์ค/main_thread_only.js:29
๋ฐ์ธ๋ฉ.chdir(๋๋ ํ ๋ฆฌ);
๋ด knexfile.ts๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค
import knex from 'knex';
export const database: knex.Config = {
client: 'postgresql',
connection: process.env.databaseURL,
migrations: {
extension: 'ts',
directory: './ds/migrations',
},
seeds: {
directory: './ds/seed',
},
};
์ด๋ค ๋จ์?
๋๋ฃ Google ์ง์์ ๊ฒฝ์ฐ ์ ์ฒด ์ ํ ์คํฌ๋ฆฝํธ ๋ชจ๋์์ ์ต์ knex 0.19๋ก ์/์๋๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๋ ค๊ณ ํ ๋ "์๊ธฐ์น ์์ ํ ํฐ ๋ด๋ณด๋ด๊ธฐ" ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค.
์์
๋๋ ํ ๋ฆฌ์ tsconfig.json
์ .babelrc
๊ฐ ๋ชจ๋ ์๋ ๊ฒ์ผ๋ก ๋ํ๋ฌ์ต๋๋ค. ๊ทธ ์ค ํ๋๊ฐ ํธ๋์คํ์ผ์ ๋ฐฉํดํ ๊ฒ ๊ฐ์ต๋๋ค.
๋ง์ด๊ทธ๋ ์ด์
ํด๋์ knexfile.ts
๋ฅผ ๊นจ๋ํ ๋๋ ํ ๋ฆฌ๋ก ์ฎ๊ธฐ๋ฉด ๋ค์ ์๋ํ์ต๋๋ค โ
.
์๋ ์๋ค์. @mikl์ด ๋งํ๋ฏ์ด ๋ฌธ์ ๋ ๋ ธ๋ ์ธํฐํ๋ฆฌํฐ์์ typescript ์ฝ๋๋ฅผ ์คํํ๋ ค๊ณ ํ๋ค๋ ๊ฒ์ ๋๋ค. ์ค๋ ์ ๋ง์ด๊ทธ๋ ์ด์ ์ ๋ง๋ค๋ ค๊ณ ํ ๋ ์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.
ts-node
(https://npmjs.com/package/ts-node)๋ฅผ ํตํด knex๋ฅผ ์คํํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค.
์ด ์์
์ ์ํํ๋ ค๋ฉด package.json
ํ์ผ ์์ ์ด ์คํฌ๋ฆฝํธ๋ฅผ ์ถ๊ฐํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. :)
"migrate:make": "ts-node ./node_modules/.bin/knex migrate:make --knexfile <PATH_TO_YOUR_KNEXFILE>"
์ด๊ฒ์ migrate:latest
, seed:run
๋ฑ์ ๋ณต์ ํ์ญ์์ค ... :)
๊ทธ๋ฐ ๋ค์ ์ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค!
--knexfile
๋์ --cwd
- "migrate-make": "knex migrate:make --knexfile ./src/db/knexfile.ts",
+ "migrate-make": "knex migrate:make --cwd src/db",
ํด๊ฒฐ์ฑ
--knexfile
๋์--cwd
- "migrate-make": "knex migrate:make --knexfile ./src/db/knexfile.ts", + "migrate-make": "knex migrate:make --cwd src/db",
๊ฐ์ฌ ํด์ !! ๋ง์ ๋์์ด ๋ฉ๋๋ค.
ํ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? knexfile.ts๋ก ์์ ํ ๋ ์์ ํ ๊ณ ์ฅ๋ฌ์ต๋๋ค. ์ด ์ค๋ ๋์์ ํ ์ ์๋ ๋ชจ๋ ๊ฒ์ ์๋ํ์ต๋๋ค... (์ต์ ๋ฒ์ + typescript 3.6.4)
ํ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? knexfile.ts๋ก ์์ ํ ๋ ์์ ํ ๊ณ ์ฅ๋ฌ์ต๋๋ค. ์ด ์ค๋ ๋์์ ํ ์ ์๋ ๋ชจ๋ ๊ฒ์ ์๋ํ์ต๋๋ค... (์ต์ ๋ฒ์ + typescript 3.6.4)
์ ๋ฌธ์ ๋ฅผ ์ด๊ณ ์ฌ์์ฐ ์ฝ๋๋ฅผ ์ ๊ณตํฉ๋๋ค(์: ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์์ ํ๋ก์ ํธ์ ๋ํ ๋งํฌ). @brunolm ์ด ๋ฌธ์ ์ ๋ํ ํด๊ฒฐ์ฑ ์ ์ฐพ์๊ธฐ ๋๋ฌธ์
์ฌ์ ํ --cwd
๊นจ์ก์ต๋๋ค.
knexfile.ts:6
export default {
^^^^^^
SyntaxError: Unexpected token export
๊ทธ๋์ ๋๋ ๊ทธ๊ฒ์ด ์ด๋ป๊ฒ ์๋ํด์ผ ํ๋์ง๋ ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์ ์๋ก์ด ๋ฌธ์ ๋ฅผ ์ ๊ธฐํ์ง ์์ ๊ฒ์
๋๋ค. ๋ฌธ์์ ์๋ ์ต์ํ์ ์ ์ฒด ํ์ดํ์คํฌ๋ฆฝํธ ์์ ๋ ... godsend
Objectin.js typescript ์์ ๋ typescript์์ knex๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ท์ฐฎ๊ฒํ์ง ์์์ผ๋ฏ๋ก ๋์ผํ ๋ฌธ์ ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค ...
์ ... ๋ด๊ฐ ๊ฐ๊ณ ์ถ์๋ ๊ฒ :
์ด ๋ง์ง๋ง ํฌ์ธํธ๊ฐ ๋ ์ํ ๋ ๊ฒ ๊ฐ์์...
๋ชจ๋ ์์ ์ ์ํํ๊ธฐ ์ํด ์ํํด์ผ ํ๋ ์์ :
export =
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ํ์์ธ ๊ฒ ๊ฐ์ต๋๋ค. ์, ts ํ์ผ์ด ์์ง๋ง ๋ด app.ts์์๋ ๊ฐ์ ธ์ฌ ์ ์๊ณ ์๊ตฌํด์ผ ํ์ต๋๋ค.knex.migrate.latest({
loadExtensions: ['.js'],
});
"db:migrate": "knex migrate:latest --cwd ./dist/config --env development --knexfile knexfile.js"
๊ทธ๋ฆฌ๊ณ ๋๋ ๋ช ๊ฐ์ง๋ฅผ ์์ด ๋ฒ๋ ธ์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ ํ์ ํฉ๋๋ค ..
์ง๊ธ์ ์์ ํ ํดํน ๋ ๋๋์ผ๋ก ๋ง์กฑํ์ง ์์ต๋๋ค.
@ctiaffay-conserto ๋น์ ์ ์ด ์๋ฅผ ์๋ํ ์ ์์ต๋๋ค ( knexfile
๋ฅผ cwd
๋ฐ๊พธ์ญ์์ค)
https://github.com/brunolm/knex16bug/tree/knex16
ํด๊ฒฐ์ฑ
--knexfile
๋์--cwd
- "migrate-make": "knex migrate:make --knexfile ./src/db/knexfile.ts", + "migrate-make": "knex migrate:make --cwd src/db",
์๋ํ์ง๋ง... ์? --knexfile
๊ฐ ์๋ํ๊ธฐ ๋๋ฌธ์ ์ฌ๋ฐ๋ฅธ ์๋ฃจ์
์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
@ShGKme ๋ค์์ ์๋ํ๋ ๋ฐ ํ์ํ ๋ณ๊ฒฝ ์ฌํญ์ ๋๋ค. https://github.com/knex/knex/pull/3005
๊ทธ๋ฌ๋ ์๋ฌด๋ ๊ทธ๊ฒ์ ํด๊ฒฐํ๊ณ ์ถ์ดํ์ง ์์ต๋๋ค. cwd
์๋ํ๊ธฐ ๋๋ฌธ์ ์ ๋ ๊ทธ๊ฒ์ ๋ฐ์๋ค์ผ ๋งํผ ์ถฉ๋ถํ ํ๋ณตํฉ๋๋ค.
๋๋ ๋ฐ์ ํ๊ฒ ๊ด๋ จ๋ ์ด๊ธฐํ ๋ฌธ์ ์ ์ง๋ฉดํ๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ์กฐ์ฌํ๋ ๋ฐ ์คํ๋ฅผ ๋ณด๋์ต๋๋ค. @brunolm ์ ํ๊ฐ๊ฐ ์ ํํ๋ค๊ณ ์๊ฐํฉ๋๋ค. Liftoff#launch(..)
๋ฉ์๋๊ฐ ์๋ชป๋ ๋งค๊ฐ๋ณ์๋ก ํธ์ถ๋๊ณ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ #3005์์ ํ์ธํ ์ ์์ต๋๋ค.
๋๋ต์ ์ผ๋ก ๋งํ๋ฉด Liftoff
๋ ๋ค์๊ณผ ๊ฐ์ด ๋์ํ๋ ๊ฒ์ผ๋ก ๋ณด์
๋๋ค.
// If the configPath was specified, then use it. Otherwise, try to infer it.
const configPath = opts.configPath || inferConfigPath(opts);
function inferConfigPath(opts) {
// configName represents the expected name of the config file, minus its extension.
// For example: "knexfile"
// If no configName was specified, then attempt to infer it from the name instead.
// In our case, since `name === "knex"`, this will result in `configName = "knexfile"`
const configName = opts.configName || (opts.name + "file");
return findPathFor(configName, {
withPossibleExtensions: [".js", ".ts"],
inDirectory: opts.cwd,
});
}
ํ์ฌ Liftoff#launch(..)
๊ฐ ํธ์ถ๋๋ ๋ฐฉ์์ ๋ฒ๊ทธ๊ฐ ์์ผ๋ฏ๋ก configPath
์ ๊ฐ์ _ํญ์_ ์ ์ถ๋ฉ๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก Liftoff
๋ ์ ์ ํ preload
์คํฌ๋ฆฝํธ๋ฅผ ์์ํ์ง ์์ต๋๋ค. (๊ตฌ์ฒด์ ์ผ๋ก: ts-node/register
๋ก๋ ์คํจ)
@briandamaged ๊ธฐ์กด ํ ์คํธ๋ฅผ ์ค๋จํ์ง ์๋ ์์ ํ๋ก๊ทธ๋จ์ ์ ๊ณตํ ์ ์์ต๋๊น?
@kibertoad + @brunolm : ์ค๋์ด๋ ๋ด์ผ์ค์ ์ ๋ฆฌ๋ฅผ ํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ๋๋ ์ฌ์ ํ ํฐ ๊ทธ๋ฆผ์ ๋จผ์ ์ดํดํ๊ณ ์๋์ง ํ์ธํ๊ณ ์์ต๋๋ค. ๋ด๊ฐ ์ ์ ์๋ ๋ฐ๋ก๋ Knex CLI๊ฐ Liftoff
๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ด๋ฏธ ์ ๊ณตํ๋ ์ผ๋ถ ๊ธฐ๋ฅ์ ๋ณต์ ํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
@briandamaged ์ ์์ต๋๋ค. cli ํ ์คํธ๋ฅผ ํต๊ณผํ์ฌ ์ฌ์ฉ์๋ฅผ ์ํ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ ๋์ ํ์ง ์๋๋ค๋ ๊ฒ์ ์๊ณ ์๋ ํ ํ์์ ๋ฐ๋ผ ์์ ๋กญ๊ฒ ๋ฆฌํฉํ ๋งํ ์ ์์ต๋๋ค.
@brunolm @ShGKme @mmiszy @ilkka @briandamaged์ ๋๋ผ์ด ์์ ๋๋ถ์ 0.20.9์์ ๋ ์ ์๋ํฉ๋๋ค. ์๋ํด ๋ณด๊ณ ๋ณ๊ฒฝ ์ฌํญ์ด ๋์์ด ๋์๋์ง ์๋ ค์ฃผ์ธ์.
@kibertoad ๋ชจ๋ ๊ฒ์ด ์๋ํฉ๋๋ค, ๊ฐ์ฌํฉ๋๋ค ๐
@kibertoad ์ ๋ง ๊ฐ์ฌํฉ๋๋ค ! ์ด์ 100% ์๋ํ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค!
api_1 | > knex migrate:make --knexfile ./src/db/knexfile.ts "test"
api_1 |
api_1 | Requiring external module ts-node/register
api_1 | Working directory changed to /usr/src/app/src/db
api_1 | Created Migration: /usr/src/db/migrations/20200210194631_test.ts
@brunolm ํํ, @briandamaged ๊ฐ ์ง์ ํ ์์ ์ ๋๋ค. ์ด์ ์ ์๋ํด์ ๋คํ์ ๋๋ค!
NodeJS 14.0.0, knex migrate:make test
๋ช
๋ น ๋ฐ ๋ค์ ํ์ผ์์ ์ฌ์ ํ ์ด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
// knexfile.ts
export const config = {
development: {
client: "postgres",
connection: {
filename: "./dev.sqlite3"
}
},
staging: {
client: "postgresql",
connection: {
database: "my_db",
user: "username",
password: "password"
},
pool: {
min: 2,
max: 10
},
migrations: {
tableName: "knex_migrations"
}
},
production: {
client: "postgresql",
connection: {
database: "my_db",
user: "username",
password: "password"
},
pool: {
min: 2,
max: 10
},
migrations: {
tableName: "knex_migrations"
}
}
};
์ด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
Failed to load external module ts-node/register
Failed to load external module typescript-node/register
Failed to load external module typescript-register
Failed to load external module typescript-require
Failed to load external module @babel/register
(node:6468) UnhandledPromiseRejectionWarning: C:\Users\Flori\WebstormProjects\OragesAuthentication-Backend\knexfile.ts:3
export const config = {
^^^^^^
SyntaxError: Unexpected token 'export'
at wrapSafe (internal/modules/cjs/loader.js:1101:16)
at Module._compile (internal/modules/cjs/loader.js:1149:27)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1205:10)
at Module.load (internal/modules/cjs/loader.js:1034:32)
at Function.Module._load (internal/modules/cjs/loader.js:923:14)
at Module.require (internal/modules/cjs/loader.js:1074:19)
at require (internal/modules/cjs/helpers.js:72:18)
at openKnexfile (C:\Users\Flori\WebstormProjects\OragesAuthentication-Backend\node_modules\knex\bin\cli.js:26:16)
ํธ์ง: ์ด๊ฒ์ ts-node๋ฅผ ์ข ์์ฑ์ผ๋ก ์ถ๊ฐํ์ฌ ์์ ๋์์ต๋๋ค. ๋ถํธ์ ๋๋ ค ์ฃ์กํฉ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
Knex ๋ฒ์
0.16.3
์์ ๋์ผํ ๋ฌธ์ ์ ์ง๋ฉดํ์ต๋๋ค.์ด ์๋ฃจ์ ์ ๊ถ์ฅ๋์ง ์์ง๋ง
knexfile.ts
ํ์ผ์ ์์ ๋ถ๋ถ์ts-node/register
๋ฅผ ์ถ๊ฐํ์ฌ ๊ฐ๋จํ ํด๊ฒฐํ์ต๋๋ค.