Knex: Knex cli๋Š” ๊ตฌ์„ฑ ๋ฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์œ„ํ•ด es6์„ ์ง€์›ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2016๋…„ 02์›” 26์ผ  ยท  42์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: knex/knex

knex cli๊ฐ€ ๊ตฌ์„ฑ ๋ฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์œ„ํ•ด es6์„ ์ง€์›ํ•œ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํ”Œ๋ž˜๊ทธ ๋’ค์— ์žˆ๊ฑฐ๋‚˜ ํ˜„์žฌ ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ์— .babelrc ํŒŒ์ผ์ด ์žˆ๋Š” ๊ฒฝ์šฐ์—๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

PR please feature request

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

@jeremejev ์ข‹์€ ์ƒ๊ฐ...

{
  "scripts": {
    "knex": "babel-node node_modules/.bin/knex"
  }
}

๋‹น์‹ ์€์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

npm run knex migrate:latest

๋ชจ๋“  Knex ๋ช…๋ น์— ๋Œ€ํ•ด ๋ณ„๋„์˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋งŒ๋“ค ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

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

ํ™•์‹คํžˆ ์ด๊ฒƒ์€ ํ›Œ๋ฅญํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ PR์„ ์ˆ˜๋ฝํ•˜๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค.

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์ด์ „ ๋Œ“๊ธ€์€ 1220ํ˜ธ์— ๋Œ€ํ•œ ๊ฒƒ์ด์—ˆ์ง€๋งŒ ์—ฌ๊ธฐ์— ๋Œ“๊ธ€์„ ์‹ค์ˆ˜๋กœ ๋„ฃ์—ˆ์Šต๋‹ˆ๋‹ค.

@rhys-vdw ๋ฌด์Šจ ์ผ์ด ํ•„์š”ํ•œ์ง€ ์•Œ๊ณ  ๊ณ„์‹ญ๋‹ˆ๊นŒ?

@rhys-vdw @jmfurlott . ๋‚˜๋Š” ์ด๊ฒƒ์ด ์ •๋ง ๋ฉ‹์ง„ ๊ธฐ๋Šฅ์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ๋กœ ์ด๊ฒƒ์„ ์ถ”๊ตฌํ•˜๋Š” ๋ฐ ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ํƒ์ƒ‰ํ•ด์•ผ ํ•˜๋Š” ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์•Œ๋ ค์ค„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ? ์•ฝ๊ฐ„์˜ ํ†ต์ฐฐ๋ ฅ์ด ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค

CLI ์ง„์ž…์ ์— require("babel-register") ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ํšจ๊ณผ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ™•์ธ๋จ - ์ด๋ฅผ ๋‚ด ์‹œ๋“œ ํŒŒ์ผ์— ์ถ”๊ฐ€ํ•˜๊ณ  ES2015๋ฅผ ์‹คํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค! mocha๊ฐ€ CLI์—์„œ ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ knexfile.js ์— compiler ๋ฅผ ์„ค์ •ํ•˜๋Š” ์˜ต์…˜์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

๋งˆ์นจ๋‚ด ๋‚ด ์ผ์„ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค.

db.config.js

export default {
    devDB: {
        client: 'sqlite3',
        connection: {
            filename: './db.sqlite3',
        },
        pool: {
            min: 1,
            max: 1,
        },
    },
    migrations: {
        directory: './migrations',
        tableName: '_migrations',
    },
    seeds: {
        directory: './seeds/dev'
    },
    pool: {
        min: 1,
        max: 1,
    }
}

knexfile.js

require('babel-register')
const config = require('./db.config').default // <- this -.-

module.exports = config

.babelrc

{
    "env": {
        "devDB": {
            "plugins": ["transform-es2015-modules-commonjs"]
        }
    }
}

๊ทธ๋Ÿฌ๋‚˜ ./seeds์— ์žˆ์ง€ ์•Š์œผ๋ฉด ์‹œ๋“œ ๊ฒฝ๋กœ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

No seed files exist

๋งˆ์ด๊ทธ๋ ˆ์ด์…˜๋„ ๋งˆ์ฐฌ๊ฐ€์ง€..

๋˜ ๋‹ค๋ฅธ ์˜ต์…˜์€ babel-node Knex๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. babel-cli ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

{
  "scripts": {
    "db:migrate:latest": "babel-node node_modules/.bin/knex migrate:latest"
  }
}

์•ฑ์ด ์ด๋ฏธ Babel์—์„œ ์ฒ˜๋ฆฌ๋˜๋Š” ๋™์•ˆ knexfile.js ๋ฅผ ๊ฐ€์ ธ์™€์„œ require('babel-register') ์˜ต์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@jeremejev ์ข‹์€ ์ƒ๊ฐ...

{
  "scripts": {
    "knex": "babel-node node_modules/.bin/knex"
  }
}

๋‹น์‹ ์€์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

npm run knex migrate:latest

๋ชจ๋“  Knex ๋ช…๋ น์— ๋Œ€ํ•ด ๋ณ„๋„์˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋งŒ๋“ค ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

@olalonde ๋„ค, ๊ทธ๊ฒƒ๋„ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค! ๋ฐ˜๋…„ ํ›„์— ์ •ํ™•ํ•œ ๋ฌธ๊ตฌ๋ฅผ ์žŠ์–ด๋ฒ„๋ฆฐ ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ ๋ช…์‹œ์ ์ธ "db: migrate:make " ๋ฐ "db: migrate:latest " ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค("make"? ๋˜๋Š” "make-migration"์ž…๋‹ˆ๊นŒ? ๋˜๋Š” "migrate: make"? ๋˜๋Š” "migrate:new"? ๋˜๋Š”...) ๐Ÿ™‚

@olalonde ํ›Œ๋ฅญํ•œ ์ œ์•ˆ์ž…๋‹ˆ๋‹ค! ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด npm ์Šคํฌ๋ฆฝํŠธ "๊ตฌ์„ฑ"์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

{
    "knex": "babel-node node_modules/.bin/knex",
    "migrate": "npm run knex -- migrate:latest --env ",
}

์–ด์ฉŒ๋ฉด ์ด๊ฒƒ์ด ๋„์›€์ด ๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค: https://github.com/standard-things/esm

์šด์˜์ฒด์ œ: ์œˆ๋„์šฐ
[email protected]
[email protected]

// migrations/contacts.js
export function up (knex) {
  return knex.schema
    .createTable('contacts', table => {
      table.increments('id').primary()
      table.string('firstName')
      table.string('lastName')
      table.string('emailAddress')
    })
}

export function down(knex) {
  return knex.schema
    .dropTable('contacts')
}
$ npx knex migrate:latest
Using environment: development
migrations/contacts.js:1
(function (exports, require, module, __filename, __dirname) { export function up (knex) {
                                                              ^^^^^^
SyntaxError: Unexpected token export
    at Object.exports.runInThisContext (vm.js:73:16)
    at Module._compile (module.js:543:28)
    ...
$ npx babel-node node_modules/.bin/knex migrate:latest
./node_modules/.bin/knex:2
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
          ^^^^^^^
SyntaxError: missing ) after argument list
    at Object.exports.runInThisContext (vm.js:73:16)
    at Module._compile (module.js:543:28)
    ...
$ npx babel-node node_modules/knex/bin/cli.js migrate:latest
Using environment: development
Batch 1 run: 1 migrations
migrations/contacts.js

@olalonde ์˜ ์ œ์•ˆ, npm run knex migrate:make ๋˜๋Š” npm run knex ๋ฅผ ์ถ”๊ฐ€ ์ธ์ˆ˜์™€ ํ•จ๊ป˜ ์‹œ๋„ํ•˜๋ฉด ์•„๋ฌด ๊ฒƒ๋„ ํ‘œ์‹œํ•˜์ง€ ์•Š๊ณ  ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค. npm run knex ์‹คํ–‰ํ•˜๋ฉด ์ •์ƒ์ ์œผ๋กœ ์‚ฌ์šฉ๋Ÿ‰์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. npm ๋ฌธ์„œ์— ๋”ฐ๋ฅด๋ฉด npm run knex -- migrate:make ์™€ ๊ฐ™์€ ์Šคํฌ๋ฆฝํŠธ ์ธ์ˆ˜ ์•ž์— -- ๋ฅผ ๋„ฃ์–ด์•ผ ํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ์ถœ๋ ฅ ์—†์ด ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

*nix์—์„œ reify (๋น ๋ฅธ!) ์‚ฌ์šฉ(Windows์˜ ๋ณ„์นญ ๋™์˜์–ด์— ๋Œ€ํ•ด ์ž˜ ๋ชจ๋ฆ…๋‹ˆ๋‹ค. ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค!)

/*

  npm install --save-dev reify
  echo '.reify-cache/' >> .gitignore
  alias knex='node -r reify ./node_modules/.bin/knex

  knex migrate:latest # โ€ฆetc

*/

const table = 'foo';

export const up = knex => {
  return knex.schema.createTable(table, t => {
    t.increments();
    // โ€ฆetc
    t.timestamps();
  });
};

export const down = knex => knex.schema.dropTable(table);

// OR

// export function up (knex) {
//   return knex.schema.createTable(table, t => {
//     t.increments();
//     // โ€ฆetc
//     t.timestamps();
//   });
// }

// export function down (knex) {
//   knex.schema.dropTable(table);
// }

๋ชจ๋“  es6ifying knexfile.js ์‹œ๋„๋Š” ์ถ”์•…ํ•˜์ง€๋งŒ module.exports๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹จ์ผ ์ด์ƒ์œผ๋กœ ์‚ด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ํ•จ๊ป˜ No knexfile found in this directory. Specify a path with --knexfile ๋ฅผ ๊ณ„์† ๋ฐ›์œผ์‹ญ์‹œ์˜ค.

// src/knexfile.js
import config from 'config'

export default {
  debug: false,
  settings: config.get('dbConfig'),
  seeds: {
    directory: './seeds/'
  }
}
//package.json
 "scripts": {
    "knex": "babel-node node_modules/.bin/knex"
  }

```
yarn knex migrate:make lol
````

์–ด๋–ค ํฌ์ธํ„ฐ? ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ ๋ฌธ์ œ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค(๋‚ด ์ƒ๊ฐ์—๋Š”) ๐Ÿค”

@haywirez ์ด๊ฒƒ์ด ์ด ํ‹ฐ์ผ“์˜ ์ฃผ์ œ์™€ ๊ด€๋ จ์ด ์žˆ๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๊นŒ?.. ์–ด์จŒ๋“ , ๊ทธ๊ฒƒ์ด ์š”๊ตฌํ•˜๋Š” ๊ฒƒ์„ ์ •ํ™•ํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ•˜๊ณ  knexfile.js๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” --knexfile์„ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค.

@haywirez ' ๋ฌธ์ œ๋Š” ESM interop์— ๋Œ€ํ•ด export default { ... } ๊ฐ€ const file = require('/path/to/knexfile').default ์—ฌ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ knex cli์—์„œ ์‚ฌ์šฉํ•˜๋Š” Liftoff๋Š” esm ๋˜๋Š” babel-register ์™€ ๊ฐ™์€ ๊ฒƒ์„ ์š”๊ตฌํ•˜๋Š” --require ํ”Œ๋ž˜๊ทธ๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ ์ด ๋ช…๋ น์€ Commander์— ๋“ฑ๋ก๋˜์–ด ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— esm ์—์„œ ์š”๊ตฌํ•œ ํ›„ knex cli๊ฐ€ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

ยฑ |master ?:18 โœ—| โ†’ npx knex --require esm seed:make admin_user
Requiring external module esm

  error: unknown option `--require'

๋ชจ๋“  ๋ช…๋ น์—์„œ --require ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๊ณ  knexfile ์— ๋Œ€ํ•œ ์ƒํ˜ธ ์šด์šฉ์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ํ”„๋กœ์ ํŠธ๊ฐ€ PR์— ์—ด๋ ค ์žˆ์Šต๋‹ˆ๊นŒ?

https://github.com/tgrisser/knex/issues/1232#issuecomment -411775132 ์—์„œ๋Š” ๋ณ„์นญ ๊ฒฝ๋กœ ์ด๋ฆ„์— ๋Œ€ํ•œ tsconfg-paths ๋ฅผ ๋“ฑ๋กํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” typescript๋กœ ์‹œ๋“œ๋ฅผ ๋งŒ๋“ค ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ts-node ๋Š” ๋ณ„์นญ ๊ฒฝ๋กœ๋ฅผ ์ง€์›ํ•  ๊ณ„ํš ์ด ์•„๋‹ˆ๋ฏ€๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ฐ์ดํ„ฐ๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์ „์— ๋ณต์žกํ•œ ๋ณ€ํ™˜์ด ํ•„์š”ํ•œ ์‹œ๋“œ๋ฅผ ๋งŒ๋“ค ๋•Œ ๋ฌธ์ œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. --require ํ”Œ๋ž˜๊ทธ๋ฅผ ๋…ธ์ถœํ•˜๋ฉด ์ด ๋ฌธ์ œ๋ฅผ ์ง์ ‘ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์ด ๋ฌธ์ œ์— ๋ถ€๋”ชํžŒ ๊ฒฝ์šฐ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜์—ฌ --require ํ”Œ๋ž˜๊ทธ ์—†์ด ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

node -r tsconfig-paths/register node_modules/.bin/knex seed:run

@olalonde ์ด๊ฒƒ์€ ๋ชจ๋“  ์ธ๊ธฐ ์žˆ๋Š” Node.js ๋ฒ„์ „์ด

@kibertoad ๋…ธ๋“œ๋Š” ์•„์ง ESModules๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@mAAdhaTTah ๊ทธ๊ฒƒ์€ ์ผ์ข…์˜ ์ผ์ข…์˜ ์•Š์Šต๋‹ˆ๋‹ค : https://nodejs.org/api/esm.html

@kibertoad ์˜ˆ, ํ•˜์ง€๋งŒ ๋งค์šฐ ์‹คํ—˜์ ์ด๊ณ  ๋ถˆ์•ˆ์ •ํ•˜๋ฏ€๋กœ ์‹ ๋ขฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

Windows์—์„œ esm ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ์„ ์‹œ๋„ํ•˜์‹ญ์‹œ์˜ค.
node -r esm node_modules/knex/bin/cli.js migrate:make migration_name .

Linux ๋ฐ Mac์—์„œ๋Š” ๋‹ค์Œ์„ ์‹œ๋„ํ•˜์‹ญ์‹œ์˜ค.
node -r esm node_modules/.bin/knex migrate:make migration_name

๊ทธ๋ž˜์„œ ์ด ํ‹ฐ์ผ“์—์„œ ๋‚ด๊ฐ€ ๋ณธ ๋งˆ์ง€๋ง‰ ์—…๋ฐ์ดํŠธ๋Š” esm์„ ํฌํ•จํ•˜๊ณ  ๋ฐ˜๋…„์ด ๋„˜์—ˆ์Šต๋‹ˆ๋‹ค... ๊ทธ ์ดํ›„๋กœ Babel๊ณผ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋„๋ก ๊ด€๋ฆฌํ•œ ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” Babel์— ๋Œ€ํ•œ ๋ชจ๋“  ๋ณ€๊ฒฝ ์‚ฌํ•ญ๊ณผ babel-node ๋Œ€์‹  @babel/register๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ƒˆ๋กœ์šด ๊ธฐ๋ณธ ์„ค์ •์ด ํŠนํžˆ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

@machineghost ์ตœ์‹  ๋งˆ์Šคํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด ๋ณผ ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ณ€ํ™˜์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋” ์ž˜ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚จ์€ ์ œํ•œ ์‚ฌํ•ญ์ด ์žˆ์œผ๋ฉด ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค.

์—ฌ์ „ํžˆ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚ด package.json ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

"knex": "npx @babel/node node_modules/.bin/knex --knexfile=src/database/knexfile.js",
"migrate": "npm run knex migrate:latest",

// ...
"dependencies": {
// ...
"knex": "git://github.com/tgriesser/knex.git#master",
// ...

๋‚ด knexfile.js ๋Š” ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

import { development } from './realKnexFile';
module.exports = {
    development
};

๊ทธ๋Ÿฌ๋‚˜ ์ฒซ ๋ฒˆ์งธ ์ค„์„ ๋„˜์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. npm run migrate ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ์„ ์–ป์Šต๋‹ˆ๋‹ค.

knexfile.js:1
import { development } from './realKnexFile';
       ^

SyntaxError: Unexpected token {
    at Module._compile (internal/modules/cjs/loader.js:760:23)

๋†€๋ผ์šด "esm" ๋ชจ๋“ˆ (Lodash ์ฐฝ์‹œ์ž๋กœ๋ถ€ํ„ฐ)์„ ๋ฐœ๊ฒฌํ•˜๋ฉด ๋” ์ด์ƒ Babel์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ๋ชจ๋“  Knex๊ฐ€ ES6 ๋ชจ๋“ˆ์„ ์ง€์›ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ฒƒ์€ ๋งค์šฐ ์‰ฝ๊ฒŒ --require esm ๋ฅผ node ๋กœ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

knex ๋ช…๋ น์ค„์—์„œ -r ๋ฅผ ๊ฐ€์ ธ์™€์„œ Node์— ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ด ํ‹ฐ์ผ“๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ˆ„๊ตฐ๊ฐ€ Knex๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— Node ๋ชจ๋“ˆ์„ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋Š” ๋‹ค๋ฅธ ๋ฌธ์ œ๋„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

-ํŽธ์ง‘ํ•˜๋‹ค-

-r ์ธ์ˆ˜๊ฐ€ ์กด์žฌํ•  ๋•Œ๊นŒ์ง€ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ๋ชจ๋“  _required_ ๋ชจ๋“ˆ( knexfile.js ์ž์ฒด๋Š” ์•„๋‹˜)์—์„œ ES6 ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

require = require("esm")(module);
const importedContent = require('./someFile.js');

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด require ์ž์ฒด๊ฐ€ ES6 ๋ชจ๋“ˆ์„ ์ž˜ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ knexfile.js ์—ฌ์ „ํžˆ require ๋ฐ module.exports ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. -r ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ฐพ๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ esm ์„ ์‚ฌ์šฉํ•˜์—ฌ knex๋กœ ์ž‘์—…ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ „์ฒด ์˜ˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

knexfile.js

const config = {
}

// Knex will fail if you use "exports default"
module.exports = config

ํŒจํ‚ค์ง€.json

{
  "scripts": {
    "knex": "node -r esm node_modules/.bin/knex",
    "db:migrate": "yarn knex migrate:latest"
  }
}

ESM์ด ๋” ๋Œ€์ค‘ํ™”๋จ์— ๋”ฐ๋ผ Knex๊ฐ€ Node >12์—์„œ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋„๋ก ์•ฝ๊ฐ„์˜ ๊ธฐ์—ฌ๋ฅผ ํ•  ์˜ํ–ฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” Node์—์„œ ESM์œผ๋กœ ์ž‘์—…ํ•œ ๊ฒฝํ—˜์ด ์žˆ์œผ๋ฏ€๋กœ ์›ํ™œํ•˜๊ฒŒ ์ง„ํ–‰๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ ์—…๋ฌด ์‹œ๊ฐ„(์—…๋ฌด์™€ ๊ด€๋ จ์ด ์—†์Œ)์—๋Š” ์ž‘์—…์„ ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์–ธ์ œ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์„์ง€ ๋ง์”€๋“œ๋ฆด ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. knex ์ฝ”๋“œ๋ฒ ์ด์Šค์— ์ต์ˆ™ํ•ด์ง€๋Š” ๋ฐ์—๋„ 1๋ถ„์ด ๊ฑธ๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž‘์„ฑ์ž๊ฐ€ ์ƒˆ ์ข…์†์„ฑ์— ๋Œ€ํ•ด ๊ดœ์ฐฎ๋‹ค๋ฉด require('esm') ๋ฅผ ์ƒˆ ์ค„์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๋งŒ ํผ ๊ฐ„๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@jhechtf @machineghost ์ด๊ฒƒ์„ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค:
https://github.com/knex/knex/pull/3616
https://github.com/knex/knex/pull/3639
https://github.com/knex/knex/pull/3638

๋˜ํ•œ Liftoff ์ง€์›์ด ์ˆ˜์ •๋˜์—ˆ์œผ๋ฏ€๋กœ ๋” ๋งŽ์€ ๋ณ€๊ฒฝ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์ „์— ํ˜„์žฌ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ๊ณผ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ํŒŒ์•…ํ•˜๊ธฐ ์œ„ํ•ด ๋ช‡ ๊ฐ€์ง€ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ฆ‰, ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ด ๋ชจ๋“  ๊ฒƒ์„ ์กฐ์‚ฌํ•˜๊ณ  ์–ด๋–ค ์ž‘์—…(์žˆ๋Š” ๊ฒฝ์šฐ)์ด ์—ฌ์ „ํžˆ ํ•„์š”ํ•œ์ง€ ๊ฒฐ์ •ํ•˜๊ณ  ๋ช‡ ๊ฐ€์ง€ ํ…Œ์ŠคํŠธ์— ๊ธฐ์—ฌํ•œ๋‹ค๋ฉด ํฐ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ˆ, ์—ฌ๋Ÿฌ๋ถ„์€ ์•„์ง ์™„์ „ํžˆ ๊ตฌ์›Œ์ง€์ง€ ์•Š์€ ๊ณต์‹ Node ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

IMHO "esm" ๋ชจ๋“ˆ ์†”๋ฃจ์…˜์€ ํ›จ์”ฌ ๊ฐ„๋‹จํ•˜๊ณ  ํŠน๋ณ„ํ•œ ํ”Œ๋ž˜๊ทธ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๋…ธ๋“œ ํ™˜๊ฒฝ์—์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ES ๋ชจ๋“ˆ์„ ๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ ์นœ์ˆ™ํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค(๋‚ด๊ฐ€ ๋งํ–ˆ๋“ฏ์ด ๋‹จ์ผ ์š”๊ตฌ ๋ผ์ธ์ด ์žˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Œ) .

Lodash๋ฅผ ๋งŒ๋“  ์‚ฌ๋žŒ์ด ๋งŒ๋“  ๊ฒƒ์ž…๋‹ˆ๋‹ค. JDD ๋ฐ”์œ„.

@machineghost https://github.com/knex/knex/pull/3639 ๋Š” babel์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. esm ๋ชจ๋“ˆ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‹œ๋„ํ•˜๋Š” ์‚ฌ๋žŒ์„ ๋ณด์•˜์ง€๋งŒ ์–ด๋–ค ์ด์œ ์—์„œ์ธ์ง€ ์ง€๊ธˆ์€ PR์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ธ€์Ž„, FWIW ๊ทธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ํ˜„์žฌ ๊ฐ€์žฅ ๋น ๋ฅธ ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ ํฌ์ธํŠธ ์†Œ์Šค์ž…๋‹ˆ๋‹ค ;)

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๋ฐœ๊ฒฌํ•˜๊ณ  ์—ฌ๊ธฐ์— ๋‹ค๋ฅธ ์‚ฌ๋žŒ์—๊ฒŒ ์ถ”์ฒœ : https://stackoverflow.com/questions/47277887/node-experimental-modules-requested-module-does-not-provide-an-export-named/54302557#54302557

๊ทธ๋ฆฌ๊ณ  ์ง€๊ธˆ์€ ESM์„ ์œ„ํ•œ ์ •๋ง ํ›Œ๋ฅญํ•œ(์ง€๊ธˆ ๋‹น์žฅ ์€ ์ตœ๊ณ ์˜ ) ์†”๋ฃจ์…˜์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฉฐ์น ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ์ฐฌ์„ฑ ํˆฌํ‘œ๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค.

@machineghost ๊ธฐ์กด ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ๋„์ž…์ด ์–ผ๋งˆ๋‚˜ ๊ฑฐ์Šฌ

๋‚˜๋Š” ์ด๊ฒƒ์ด "์•„๋ฌด๋Ÿฐ ํšจ๊ณผ๊ฐ€ ์—†์–ด์•ผ ํ•˜์ง€๋งŒ ๋ชจ๋“  ๊ฒƒ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹น์‹ ์ด ํ™•์‹คํžˆ ํ…Œ์ŠคํŠธํ•ด์•ผ ํ•˜๋Š”" ๊ฑฐ๋ž˜ ์ค‘ ํ•˜๋‚˜๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๋ถ€๋ฅผ ์‚ดํŽด ๋ณด์ง€๋Š” ์•Š์•˜์ง€๋งŒ ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ์ด ํ”„๋กœ์ ํŠธ์˜ ํ”„๋กœํ•„์„ ๊ฐ์•ˆํ•  ๋•Œ ๋ˆ„๊ตฐ๊ฐ€ ๋ณด๋ฉด ์œ„ํ—˜์— ๋Œ€ํ•ด ๋ฌด๊ฒŒ๋ฅผ ํ›จ์”ฌ ๋” ๋งŽ์€ ์ •๋ณด์— ์ž…๊ฐํ•œ ์˜๊ฒฌ์œผ๋กœ?) :crossed_fingers:

@machineghost https://github.com/knex/knex/pull/3616 ์—์„œ ์›๋ž˜ ๊ตฌํ˜„์˜ ์˜ํ–ฅ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. esm ๊ฐ€ ๋„์ž…๋˜๋ฉด ์•„๋งˆ๋„ ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜ ๊ต์ฒดํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋Œ€์—ญํญ ATM์ด ์—†์ง€๋งŒ ์‹œ๊ฐ„์ด ๋‚˜๋ฉด ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ @jhechtf ๊ฐ€ ๋” ๋นจ๋ฆฌ ํ•  ์ˆ˜ โ€‹โ€‹์žˆ์„๊นŒ์š”?

์˜ˆ, ์—ฌ๋Ÿฌ๋ถ„์€ ์•„์ง ์™„์ „ํžˆ ๊ตฌ์›Œ์ง€์ง€ ์•Š์€ ๊ณต์‹ Node ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

@machineghost : ํ ... --esm ํ”Œ๋ž˜๊ทธ๊ฐ€ ์‹ค์ œ๋กœ ์–ธ๊ธ‰ํ•œ esm ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

https://github.com/knex/knex/blob/0f523db957138cc0423723c699c9ce52db5feb14/bin/cli.js#L52 -L55

๊ด€๋ จ ์ฐธ๊ณ  ์‚ฌํ•ญ: Liftoff ๊ฐœ์„  ์‚ฌํ•ญ์ด ๋ณ‘ํ•ฉ๋œ ํ›„ --require ํ”Œ๋ž˜๊ทธ๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ๋ ค์ฃผ์…จ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ ํ•˜๋Ÿฌ ๊ฐ€์•ผ ํ•˜๋Š”๋ฐ...

์•„, ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค! ๋„ˆ๋ฌด ๋นจ๋ฆฌ ์Šค์บ”ํ•˜๊ณ  " node ${KNEX} --esm "๋ฅผ ๋ณด๊ณ  ๊ฑฐ๊ธฐ์— ์žˆ๋Š” ๋ณ€์ˆ˜๋ฅผ ์‚ดํŽด๋ณด๊ณ  Node์— arg๋ฅผ ์ง์ ‘ ์ „๋‹ฌํ•˜์—ฌ Node์˜ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๋„๋ก ์ง€์‹œํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ด๋ฏธ ํ•ด๊ฒฐ๋œ ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฌ๋ฉฐ ๋ฌธ์ œ ์Šค๋ ˆ๋“œ์—์„œ ๋ช…ํ™•ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ž˜ํ–ˆ์–ด :+1:

๋„ต! ์ด PR์—์„œ @D10221 ์ด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

https://github.com/knex/knex/pull/3616

๋”ฐ๋ผ์„œ ๊ทธ๋“ค์€ ํฌ๋ ˆ๋”ง์„ ๋ฐ›์„ ์ž๊ฒฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค ๐ŸŽ‰

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