<p>knex 0.16์€ TypeScript๋กœ ์ž‘์„ฑ๋œ knexfile์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.</p>

์— ๋งŒ๋“  2019๋…„ 01์›” 14์ผ  ยท  85์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: knex/knex

ํ™˜๊ฒฝ

Knex ๋ฒ„์ „: 0.16.3
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค + ๋ฒ„์ „: ๋„์ปค postgres:10.4
OS: Windows 10 Pro ๋ฐ Docker node:8.14.0

๋ฒŒ๋ ˆ

  1. knex migrate:make --knexfile knexfile.ts
  2. ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€: Unexpected token import

0.15.x ์—์„œ ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

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');
//

๋ชจ๋“  85 ๋Œ“๊ธ€

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์—์„œ ์‹คํŒจํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค).

์žฌ์ƒ์‚ฐํ•˜๊ธฐ ์–ด๋ ค์šด ๊ฒƒ์€ ์‹ค์ œ๋กœ ๊ณต์ •ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋’ค๋ฅผ ๋Œ์•„๋ณด๊ณ  ๋‚˜๋ฅผ ํฌํ•จํ•˜์—ฌ ์•„๋ฌด๋„ ์žฌ์ƒ์‚ฐ ๋‹จ๊ณ„๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์€ ๊ฒƒ์„ ๋ณด์•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

  1. ์ข…์†์„ฑ์— [email protected] ์ถ”๊ฐ€
  2. knexfile.ts
  3. (์„ ํƒ์ ์œผ๋กœ ObjectionJS ์‚ฌ์šฉ) Model.knex ์—์„œ knex ๊ตฌ์„ฑ์„ ์ธ์Šคํ„ด์Šคํ™”ํ•ฉ๋‹ˆ๋‹ค.
  4. package.json ๋‹ค์Œ ์Šคํฌ๋ฆฝํŠธ ์ถ”๊ฐ€

    • "knex": "knex --knexfile ./path/to/Knexfile.ts"

  5. ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜

    • yarn knex migrate:latest

  6. 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์€ ๊ทธ๊ฒƒ์„ ๊ณ ์ณค์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๊ทธ๊ฒƒ์„ ์กฐ์‚ฌ ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ทธ๊ฒƒ์„ ์™„์ „ํžˆ ํ…Œ์ŠคํŠธ ํ•  ์ง€์‹์ด ์—†์Šต๋‹ˆ๋‹ค ...

https://github.com/tgrisser/knex/pull/3005

๋‚˜๋Š” ์ฃฝ์€ ๋ง์„ ์ด๊ธฐ๊ณ  ์‹ถ์ง€ ์•Š์ง€๋งŒ @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๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ท€์ฐฎ๊ฒŒํ•˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค ...

์Œ ... ๋‚ด๊ฐ€ ๊ฐ–๊ณ  ์‹ถ์—ˆ๋˜ ๊ฒƒ :

  • ts์˜ ๋ชจ๋“  ์†Œ์Šค ์ฝ”๋“œ
  • ํƒ€์ดํ”„์Šคํฌ๋ฆฝํŠธ์˜ knexfile.ts
  • typescript์˜ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜(์ฝ”๋”ฉํ•˜๋Š” ๋™์•ˆ createTable ์ž๋™ ์™„์„ฑ API ์‚ฌ์šฉ)
  • CLI(knex migrate)์—์„œ ์ด ๋ชจ๋“  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋‚ด app.ts ๋‚ด์—์„œ api๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋Šฅ(์„œ๋ฒ„ ์‹œ์ž‘ ์‹œ ์ž๋™ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜)

์ด ๋งˆ์ง€๋ง‰ ํฌ์ธํŠธ๊ฐ€ ๋” ์•„ํŒ ๋˜ ๊ฒƒ ๊ฐ™์•„์š”...

๋ชจ๋“  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ์ž‘์—…:

  • tsconfig์—์„œ allowJs=true + Declaration=false ์„ค์ •(์ด knex๊ฐ€ ์—†์œผ๋ฉด .d.ts ํŒŒ์ผ์„ ์‹คํ–‰ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค...)
  • knexfile.ts : typescripts ๋‚ด๋ณด๋‚ด๊ธฐ ๋Œ€์‹  export = ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ•„์ˆ˜์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์˜ˆ, ts ํŒŒ์ผ์ด ์žˆ์ง€๋งŒ ๋‚ด app.ts์—์„œ๋Š” ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†๊ณ  ์š”๊ตฌํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • app.ts : .js ์ปดํŒŒ์ผ๋œ ํŒŒ์ผ๋งŒ ๋กœ๋“œ ์ž‘์—…: knex.migrate.latest({ loadExtensions: ['.js'], });
  • package.json : ๋˜ํ•œ js ์ปดํŒŒ์ผ๋œ ํŒŒ์ผ๋งŒ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค(๋‚ด /dist ๋‚ด๋ถ€) : "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๋ฅผ ์ข…์†์„ฑ์œผ๋กœ ์ถ”๊ฐ€ํ•˜์—ฌ ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ถˆํŽธ์„ ๋“œ๋ ค ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰