Knex: webpackκ³Ό ν•¨κ»˜ knexλ₯Ό μ‚¬μš©ν•  λ•Œ "λͺ¨λ“ˆμ„ 찾을 수 μ—†μŒ" 였λ₯˜

에 λ§Œλ“  2016λ…„ 01μ›” 06일  Β·  23μ½”λ©˜νŠΈ  Β·  좜처: knex/knex

μž‘μ—… 쀑인 ν”„λ‘œμ νŠΈμ—μ„œ knexλ₯Ό μ‚¬μš©ν•˜λ €κ³  ν•©λ‹ˆλ‹€. λ‚΄κ°€ κ²ͺκ³  μžˆλŠ” λ¬Έμ œλŠ” webpack을 μ‹€ν–‰ν•˜λ €κ³  ν•  λ•Œ μš”κ΅¬ 사항을 μΆ”μ ν•˜κ³  μ‚¬μš©ν•˜μ§€ μ•Šκ³  μ„€μΉ˜ν•˜μ§€ μ•Šμ€ λ“œλΌμ΄λ²„/방언을 κ°€μ Έμ˜€λ €κ³  ν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

이 문제λ₯Ό ν•΄κ²°ν•˜λŠ” 방법에 λŒ€ν•œ 생각이 μžˆμŠ΅λ‹ˆκΉŒ?

`````` 둜그
./~/mariasql/lib/Client.js의 였λ₯˜
λͺ¨λ“ˆμ„ 찾을 수 μ—†μŒ: 였λ₯˜: ~/project/node_modules/mariasql/lib의 'file' λ˜λŠ” 'directory' ../build/Debug/sqlclientλ₯Ό 확인할 수 μ—†μŠ΅λ‹ˆλ‹€.
@ ./~/mariasql/lib/Client.js 17:10-45

./~/knex/lib/dialects/sqlite3/index.js의 였λ₯˜
λͺ¨λ“ˆμ„ 찾을 수 μ—†μŒ: 였λ₯˜: ~/project/node_modules/knex/lib/dialects/sqlite3μ—μ„œ 'sqlite3' λͺ¨λ“ˆμ„ 확인할 수 μ—†μŠ΅λ‹ˆλ‹€.
@ ./~/knex/lib/dialects/sqlite3/index.js 33:11-29

./~/knex/lib/dialects/mysql2/index.js의 였λ₯˜
λͺ¨λ“ˆμ„ 찾을 수 μ—†μŒ: 였λ₯˜: ~/project/node_modules/knex/lib/dialects/mysql2μ—μ„œ 'mysql2' λͺ¨λ“ˆμ„ 확인할 수 μ—†μŠ΅λ‹ˆλ‹€.
@ ./~/knex/lib/dialects/mysql2/index.js 33:11-28

./~/knex/lib/dialects/mysql/index.js의 였λ₯˜
λͺ¨λ“ˆμ„ 찾을 수 μ—†μŒ: 였λ₯˜: ~/project/node_modules/knex/lib/dialects/mysqlμ—μ„œ 'mysql' λͺ¨λ“ˆμ„ 확인할 수 μ—†μŠ΅λ‹ˆλ‹€.
@ ./~/knex/lib/dialects/mysql/index.js 35:11-27

./~/knex/lib/dialects/oracle/index.js의 였λ₯˜
λͺ¨λ“ˆμ„ 찾을 수 μ—†μŒ: 였λ₯˜: ~/project/node_modules/knex/lib/dialects/oracleμ—μ„œ 'oracle' λͺ¨λ“ˆμ„ 확인할 수 μ—†μŠ΅λ‹ˆλ‹€.
@ ./~/knex/lib/dialects/oracle/index.js 40:11-28

./~/knex/lib/dialects/postgres/index.js의 였λ₯˜
λͺ¨λ“ˆμ„ 찾을 수 μ—†μŒ: 였λ₯˜: ~/project/node_modules/knex/lib/dialects/postgresμ—μ„œ 'pg' λͺ¨λ“ˆμ„ 확인할 수 μ—†μŠ΅λ‹ˆλ‹€.
@ ./~/knex/lib/dialects/postgres/index.js 46:11-24

./~/knex/lib/dialects/postgres/index.js의 였λ₯˜
λͺ¨λ“ˆμ„ 찾을 수 μ—†μŒ: 였λ₯˜: ~/project/node_modules/knex/lib/dialects/postgresμ—μ„œ 'pg-query-stream' λͺ¨λ“ˆμ„ 확인할 수 μ—†μŠ΅λ‹ˆλ‹€.
@ ./~/knex/lib/dialects/postgres/index.js 132:50-76

./~/knex/lib/dialects/strong-oracle/index.js의 였λ₯˜
λͺ¨λ“ˆμ„ 찾을 수 μ—†μŒ: 였λ₯˜: ~/project/node_modules/knex/lib/dialects/strong-oracleμ—μ„œ 'strong-oracle' λͺ¨λ“ˆμ„ 확인할 수 μ—†μŠ΅λ‹ˆλ‹€.
@ ./~/knex/lib/dialects/strong-oracle/index.js 15:9-33```
``````

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

λ˜ν•œ 이것에 λΆ€λ”ͺμ³€λ‹€. λ‚˜λ₯Ό μœ„ν•΄ μΌν•˜λŠ” 것;

externals: {
  knex: 'commonjs knex'
}

λͺ¨λ“  23 λŒ“κΈ€

이 λ¬Έμ œκ°€ μžˆμ—ˆμ§€λ§Œ webpack κ΅¬μ„±μ˜ 외뢀에 Regexλ₯Ό μΆ”κ°€ν•˜λ©΄ λ¬Έμ œκ°€ ν•΄κ²°λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

const commonLoaders = [
  { test: /\.js$/, loader: 'babel', exclude: [/node_modules/] },
  { test: /\.json$/, loader: 'json' },
];

module.exports = [
  {
    name: 'browser',
    entry: './js/entry.js',
    output: {
      path: './build',
      filename: 'bundle.js',
    },
    module: {
      loaders: commonLoaders.concat([
        { test: /\.styl$/, loader: 'style!css!stylus' },
      ]),
    },
  },
  {
    name: 'server',
    entry: './server.js',
    target: 'node',
    output: {
      path: './build',
      filename: 'server.js',
      libraryTarget: 'commonjs2',
    },
    externals: [
      {
        'socket.io': 'socket.io',
      },
      /^[a-z\-0-9]+$/,
    ],
    module: {
      loaders: commonLoaders.concat([
        { test: /\.styl$/, loader: 'css!stylus' },
      ]),
    },
  },
];

+1

@joeketchi node_modules 디렉토리λ₯Ό λ¬΄μ‹œν•΄λ„ λ¬Έμ œκ°€ μ‹€μ œλ‘œ ν•΄κ²°λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 문제λ₯Ό ν•΄κ²°ν•˜λŠ” 쀑일 λΏμž…λ‹ˆλ‹€. μ½”λ“œκ°€ 였λ₯˜λ₯Ό λ°œμƒμ‹œν‚€μ§€ μ•ŠλŠ” 보닀 지λŠ₯적인 λ°©μ‹μœΌλ‘œ μ΄λŸ¬ν•œ μš”κ΅¬ 사항을 μˆ˜ν–‰ν•œλ‹€λ©΄ 정말 쒋을 κ²ƒμž…λ‹ˆλ‹€.

λ˜ν•œ 이것에 λΆ€λ”ͺμ³€λ‹€. node_modules λ¬΄μ‹œκ°€ μž‘λ™ν•˜μ§€ μ•ŠλŠ” 이유λ₯Ό 잘 λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€.

λ˜ν•œ 이것에 λΆ€λ”ͺμ³€λ‹€. λ‚˜λ₯Ό μœ„ν•΄ μΌν•˜λŠ” 것;

externals: {
  knex: 'commonjs knex'
}

λ‚˜λŠ” mariasql λ¬Έμ œμ— λŒ€ν•΄ ꡬ체적으둜 μ–ΈκΈ‰ν•  수 μ—†μ§€λ§Œ λ‚΄ 문제λ₯Ό ν•΄κ²°ν•œ 것은 λ‚΄κ°€ μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” λͺ¨λ“  λ“œλΌμ΄λ²„λ₯Ό μ™ΈλΆ€λ‘œ μ •μ˜ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, λ‚΄ ν”„λ‘œμ νŠΈμ— mysql2 λ“œλΌμ΄λ²„λ₯Ό μ‚¬μš©ν•˜λ―€λ‘œ 외뢀에 λ‹€μŒμ΄ μžˆμŠ΅λ‹ˆλ‹€.

  externals: {
    // Possible drivers for knex - we'll ignore them
    'sqlite3': 'sqlite3',
    'mariasql': 'mariasql',
    'mssql': 'mssql',
    'mysql': 'mysql',
    'oracle': 'oracle',
    'strong-oracle': 'strong-oracle',
    'oracledb': 'oracledb',
    'pg': 'pg',
    'pg-query-stream': 'pg-query-stream'
  }

κ·Έ κ²°κ³Ό knexλŠ” 였λ₯˜λ‚˜ κ²½κ³  없이 λ²ˆλ“€λ‘œ μ œκ³΅λ©λ‹ˆλ‹€.

이 λ¬Έμ œλŠ” knexλ₯Ό 포함할 λ•Œ webpack ꡬ성을 μ„€μ •ν•˜λŠ” λ°©λ²•μ˜ 문제인 것 κ°™μŠ΅λ‹ˆλ‹€... webpack을 더 잘 μ§€μ›ν•˜κΈ° μœ„ν•΄ knexμ—μ„œ 변경이 ν•„μš”ν•œ 경우 λ‹€μ‹œ μ—΄ 수 μžˆμŠ΅λ‹ˆλ‹€.

사싀, λ‚˜λŠ” 이 λ¬Έμ œκ°€ 아직 λ‹«ν˜€μ•Ό ν•œλ‹€κ³  μƒκ°ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 및 μ‹œλ“œμ™€ ν•¨κ»˜ webpackμ—λŠ” μ—¬μ „νžˆ ν•΄κ²°λ˜μ§€ μ•Šμ€ λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€.

WARNING in ./node_modules/knex/lib/migrate/index.js
342:20-81 Critical dependency: the request of a dependency is an expression

WARNING in ./node_modules/knex/lib/migrate/index.js
447:18-49 Critical dependency: the request of a dependency is an expression

WARNING in ./node_modules/knex/lib/seed/index.js
113:13-74 Critical dependency: the request of a dependency is an expression

WARNING in ./node_modules/knex/lib/seed/index.js
150:11-24 Critical dependency: the request of a dependency is an expression

λ‚˜λŠ” 이것듀을 κ³ μΉ  수 μ—†μ—ˆλ‹€

@ifullgaz λŠ” 였λ₯˜κ°€ μ•„λ‹Œ 것 κ°™μ§€λ§Œ λ¬Έμžμ—΄ λ¦¬ν„°λŸ΄κ³Ό ν•¨κ»˜ require()κ°€ μ‚¬μš©λ˜μ§€ μ•Šμ•˜λ‹€λŠ” κ²½κ³ ? https://github.com/webpack/webpack/issues/196

@ifullgaz , κ·€ν•˜μ˜ μ†”λ£¨μ…˜μ„ μ‹œλ„ν–ˆμ§€λ§Œ μ•„λž˜μ™€ 같은 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. λΉ„μŠ·ν•œ λ¬Έμ œκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆκΉŒ?

  Error --------------------------------------------------
  Command failed: npm install
gyp ERR! UNCAUGHT EXCEPTION
gyp ERR! stack Error: spawn EACCES
gyp ERR! stack     at exports._errnoException (util.js:1018:11)
gyp ERR! stack     at ChildProcess.spawn (internal/child_process.js:319:11)
gyp ERR! stack     at exports.spawn (child_process.js:378:9)
gyp ERR! stack     at exports.execFile (child_process.js:143:15)

@brianhuangyl 은 node_modules 디렉토리와 λͺ¨λ“  ist μ½˜ν…μΈ μ— λŒ€ν•œ μ†Œμœ κΆŒ 등을 μ˜¬λ°”λ₯΄κ²Œ 가지고 μžˆμŠ΅λ‹ˆκΉŒ?

     [EACCES]       Permission bits of the file mode do not permit the
            requested access, or search permission is denied on a
            component of the path prefix.

@ifullgaz https://www.laurivan.com/make-electron-work-with-knex-js/ μ—μ„œ μ œμ•ˆμ„ μ°Ύμ•˜κ³  λ‹€μŒ 였λ₯˜λ₯Ό μˆ˜μ •ν–ˆμŠ΅λ‹ˆλ‹€.

WARNING in ./node_modules/knex/lib/migrate/index.js
342:20-81 Critical dependency: the request of a dependency is an expression

WARNING in ./node_modules/knex/lib/migrate/index.js
447:18-49 Critical dependency: the request of a dependency is an expression

WARNING in ./node_modules/knex/lib/seed/index.js
113:13-74 Critical dependency: the request of a dependency is an expression

WARNING in ./node_modules/knex/lib/seed/index.js
150:11-24 Critical dependency: the request of a dependency is an expression

특히 이 뢀뢄은 μ €μ—κ²Œ νš¨κ³Όμ μ΄μ—ˆμŠ΅λ‹ˆλ‹€.

config.plugins = [
  // ...
  new NormalModuleReplacementPlugin(/\.\.\/migrate/, '../util/noop.js'),
  new NormalModuleReplacementPlugin(/\.\.\/seed/, '../util/noop.js'),
];

이것은 λ‚˜λ₯Ό μœ„ν•œ ν‹°μΌ“μ΄μ—ˆμŠ΅λ‹ˆλ‹€ libraryTarget: 'commonjs2',

webpack이 knex νŒŒμΌμ—μ„œ λŒ€λΆ€λΆ„μ˜ $ require require 문을 μ²˜λ¦¬ν•  수 μžˆλ„λ‘ ν•˜λŠ” μ•½κ°„ λ‹€λ₯Έ μ ‘κ·Ό 방식을 λ³΄μ•˜μ§€λ§Œ μ‚¬μš©μžκ°€ μ œκ³΅ν•œ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 및 μ‹œλ“œ 파일이 라이브러리λ₯Ό μ°Ύμ•˜μŠ΅λ‹ˆλ‹€. λ‚΄κ°€ μ·¨ν•œ μ ‘κ·Ό 방식은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

config.module.rules = [
  {
    include: [
      /knex\/lib\/migrate\/index/,
      /knex\/lib\/seed\/index/
    ],
    loader: 'string-replace-loader',
    options: {
      search: 'require(\\([^\'"])',
      replace: '__non_webpack_require__$1',
      flags: 'g'
    }
  }
];

μ•ˆλ…•ν•˜μ„Έμš” μ—¬λŸ¬λΆ„, μ €λŠ” knexλ₯Ό μ‚¬μš©ν•˜μ—¬ μ„œλΉ„μŠ€μ— λŒ€ν•œ μ™„μ „ν•œ μ›ΉνŒ© λ²ˆλ“€μ„ μƒμ„±ν•˜λŠ” 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ λ…Έλ ₯ν•˜κ³  μžˆμ—ˆκ³  ν•΄λ‹Ή λ²ˆλ“€μ—μ„œ ν”„λ‘œκ·Έλž˜λ° λ°©μ‹μœΌλ‘œ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜μ„ μ‹€ν–‰ν•˜λ €κ³  ν•  λ•Œ 이 λ¬Έμ œμ— λΆ€λ”ͺμ³€μŠ΅λ‹ˆλ‹€. @mdlavin 의 μ œμ•ˆμ€ μš”κ΅¬ 사항을 μ‹€ν–‰ν•˜λ„λ‘ ν–ˆμ§€λ§Œ webpack이 μ†ŒμŠ€ νŒŒμΌμ„ λ³€ν™˜ν•˜μ§€ μ•ŠλŠ” κ²°κ³Όλ₯Ό κ°€μ Έμ™”μŠ΅λ‹ˆλ‹€. 그것은 λ˜ν•œ λ‚΄κ°€ webpack λ²ˆλ“€μ˜ out of band λ²ˆλ“€κ³Ό ν•¨κ»˜ ν•΄λ‹Ή 디렉토리λ₯Ό 포함해야 ν•œλ‹€λŠ” 것을 μ˜λ―Έν–ˆμŠ΅λ‹ˆλ‹€.

webpack의 ContextReplacementPlugin λ₯Ό μ‚¬μš©ν•˜μ—¬ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 및 μ‹œλ“œ 문제λ₯Ό ν•΄κ²°ν•  수 μžˆλ‹€λŠ” 것을 μ•Œμ•˜μŠ΅λ‹ˆλ‹€. λ‹€μŒμ€ λ‚΄ κ΅¬μ„±μ˜ μƒ˜ν”Œμž…λ‹ˆλ‹€(typescript둜 μž‘μ„±).

plugins: [
  //...
  fs.existsSync(path.join(params.targetPackageFilePath, 'migrations')) && new webpack.ContextReplacementPlugin(
    /knex\/lib\/migrate/,
    '.',
    fs.readdirSync(path.join(params.targetPackageFilePath, 'migrations'))
      .reduce((result, file) => {
        return Object.assign(result, {
          [path.join(params.targetPackageFilePath, 'migrations', file)]: path.relative(
            path.dirname(require.resolve('knex/lib/migrate')),
            path.join(params.targetPackageFilePath, 'migrations', file)
          )
        });
      }, {})),

  fs.existsSync(path.join(params.targetPackageFilePath, 'seeds')) && new webpack.ContextReplacementPlugin(
    /knex\/lib\/seed/,
    '.',
    fs.readdirSync(path.join(params.targetPackageFilePath, 'seeds'))
      .reduce((result, file) => {
        return Object.assign(result, {
          [path.join(params.targetPackageFilePath, 'seeds', file)]: path.relative(
            path.dirname(require.resolve('knex/lib/seed')),
            path.join(params.targetPackageFilePath, 'seeds', file)
          )
        });
      }, {}))
  //...
]

λ‚΄ κ΅¬μ„±μ—μ„œ params.targetPackageFiletPath λŠ” μ»΄νŒŒμΌλ˜λŠ” νŒ¨ν‚€μ§€μ˜ ν™•μΈλœ κ²½λ‘œμž…λ‹ˆλ‹€(예: /Users/yourusername/yourproject ). λ”°λΌμ„œ ν•΄λ‹Ή 경둜의 ν”„λ‘œμ νŠΈμ— migrations 및 seeds 디렉토리가 μžˆλŠ” 경우 κ²°κ³Ό ν”ŒλŸ¬κ·ΈμΈ ꡬ성은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  fs.existsSync(path.join(params.targetPackageFilePath, 'migrations')) && new webpack.ContextReplacementPlugin(
    /knex\/lib\/migrate/,
    '.',
    {
      '/Users/yourusername/yourproject/201706261234_migration.ts': '../../../migrations/201706261234_migration.ts'
    }),

  fs.existsSync(path.join(params.targetPackageFilePath, 'seeds')) && new webpack.ContextReplacementPlugin(
    /knex\/lib\/seed/,
    '.',
    {
      '/Users/yourusername/yourproject/seeds/201706261234_first-seed.ts': '../../../seeds/201706261234_first-seed.ts'
    }),

이것을 쑰금 λΆ„ν•΄ν•˜μžλ©΄, λ¬Έμ œλŠ” knex의 λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 및 μ‹œλ“œ μ½”λ“œκ°€ μ—¬κΈ° https://github.com/tgrisser/knex/blob/master/ μ—μ„œμ™€ 같이 λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 및 μ‹œλ“œλ₯Ό λ‘œλ“œν•˜κΈ° μœ„ν•΄ require λ₯Ό ν˜ΈμΆœν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. src/migrate/index.js#L54. ν•˜λ“œ μ½”λ”©λœ λ¬Έμžμ—΄ 접두사 λ˜λŠ” 접미사 없이 μš”κ΅¬ν•˜λŠ” ν•¨μˆ˜/ν‘œν˜„μ‹μ˜ κ²°κ³Όλ₯Ό μ „λ‹¬ν•˜λ―€λ‘œ μ›ΉνŒ©μ΄ μ‹€μ œλ‘œ λ‘œλ“œν•  수 μžˆλŠ” νŒŒμΌμ„ νŒŒμ•…ν•˜λ €κ³  ν•  λ•Œ 이λ₯Ό κ²°μ •ν•  μΆ©λΆ„ν•œ 정보가 μ—†μŠ΅λ‹ˆλ‹€. 이 ν”ŒλŸ¬κ·ΈμΈμ€ μ›ΉνŒ©μ— ν•„μš”ν•œ 정보λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.

webpackκ³Ό λ²ˆλ“€λ§ν•  λ•Œ ν•„μš”ν•˜μ§€ μ•Šλ„λ‘ Knexλ₯Ό λ³€κ²½ν•  수 μžˆλŠ”μ§€ 잘 λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€. μ•„λ§ˆλ„ μ‚¬μš©μž μ˜μ—­μ—μ„œ μš”κ΅¬ 사항을 μˆ˜ν–‰ν•¨μœΌλ‘œμ¨?

μ–΄μ¨Œλ“ , λ‚˜λŠ” λ‚˜λ₯Ό μœ„ν•΄ μΌν•œ μ†”λ£¨μ…˜μ„ 곡유 ν•  것이라고 μƒκ°ν–ˆμŠ΅λ‹ˆλ‹€.

Angularμ—μ„œ 이 λ¬Έμ œμ— λŒ€ν•œ μ œμ•ˆ 사항이 μžˆμŠ΅λ‹ˆκΉŒ?
μ΅μŠ€ν”„λ ˆμŠ€ ν”„λ‘œμ νŠΈλ₯Ό μ‚¬μš©ν•΄ λ³΄μ•˜λŠ”λ° μ •μƒμž…λ‹ˆλ‹€(였λ₯˜κ°€ ν‘œμ‹œλ˜μ§€ μ•ŠμŒ). κ·ΈλŸ¬λ‚˜ Angular ν”„λ‘œμ νŠΈμ—μ„œ μ‚¬μš©ν•  λ•Œ 였λ₯˜κ°€ ν‘œμ‹œλ©λ‹ˆλ‹€.

ERROR in ./node_modules/knex/lib/dialects/oracle/utils.js Module not found: Error: Can't resolve 'crypto' in '/Users/marudits/Documents/CODE/PROJECT/MOJOMARET/app-member/node_modules/knex/lib/dialects/oracle' ERROR in ./node_modules/knex/lib/dialects/mssql/index.js Module not found: Error: Can't resolve 'mssql/package.json' in '/Users/marudits/Documents/CODE/PROJECT/MOJOMARET/app-member/node_modules/knex/lib/dialects/mssql' ERROR in ./node_modules/knex/lib/runner.js Module not found: Error: Can't resolve 'stream' in '/Users/marudits/Documents/CODE/PROJECT/MOJOMARET/app-member/node_modules/knex/lib' ERROR in ./node_modules/knex/lib/dialects/oracledb/index.js Module not found: Error: Can't resolve 'stream' in '/Users/marudits/Documents/CODE/PROJECT/MOJOMARET/app-member/node_modules/knex/lib/dialects/oracledb'

이 였λ₯˜λ₯Ό μ œκ±°ν•˜κΈ° μœ„ν•œ ꡬ성은 μ–΄λ””μ—μ„œ ν•  수 μžˆμŠ΅λ‹ˆκΉŒ?
angular.json λ˜λŠ” tsconfig.json νŒŒμΌμ— μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆκΉŒ?

μ•„λ§ˆλ„ μ›ΉνŒ©μ—μ„œ.

이것은 λ‚˜λ₯Ό μœ„ν•΄ κ³ μ³€μŠ΅λ‹ˆλ‹€( @ifullgaz 에 λŒ€ν•œ ν¬λ ˆλ”§). mysql2λ₯Ό μΆ”κ°€ν•΄μ•Ό ν–ˆμŠ΅λ‹ˆλ‹€.

    externals: {
        // Possible drivers for knex - we'll ignore them
        sqlite3: 'sqlite3',
        mysql2: 'mysql2',
        mariasql: 'mariasql',
        mysql: 'mysql',
        oracle: 'oracle',
        'strong-oracle': 'strong-oracle',
        oracledb: 'oracledb',
        pg: 'pg',
        'pg-query-stream': 'pg-query-stream'
    }

그런 λ‹€μŒ 이 λͺ©λ‘μ—μ„œ μ‚¬μš© 쀑인 λ“œλΌμ΄λ²„λ₯Ό μ œκ±°ν•˜λ©΄ μ›ΉνŒ©μ΄ ν•΄λ‹Ή λ“œλΌμ΄λ²„λ₯Ό λΉŒλ“œμ— ν¬ν•¨ν•©λ‹ˆλ‹€.

@ifullgaz https://www.laurivan.com/make-electron-work-with-knex-js/ μ—μ„œ μ œμ•ˆμ„ μ°Ύμ•˜κ³  λ‹€μŒ 였λ₯˜λ₯Ό μˆ˜μ •ν–ˆμŠ΅λ‹ˆλ‹€.

WARNING in ./node_modules/knex/lib/migrate/index.js
342:20-81 Critical dependency: the request of a dependency is an expression

WARNING in ./node_modules/knex/lib/migrate/index.js
447:18-49 Critical dependency: the request of a dependency is an expression

WARNING in ./node_modules/knex/lib/seed/index.js
113:13-74 Critical dependency: the request of a dependency is an expression

WARNING in ./node_modules/knex/lib/seed/index.js
150:11-24 Critical dependency: the request of a dependency is an expression

특히 이 뢀뢄은 μ €μ—κ²Œ νš¨κ³Όμ μ΄μ—ˆμŠ΅λ‹ˆλ‹€.

config.plugins = [
  // ...
  new NormalModuleReplacementPlugin(/\.\.\/migrate/, '../util/noop.js'),
  new NormalModuleReplacementPlugin(/\.\.\/seed/, '../util/noop.js'),
];

이것은 μ €μ—κ²Œ νš¨κ³Όμ μ΄μ—ˆμŠ΅λ‹ˆλ‹€. μ €λŠ” 이것을 ν–ˆμ–΄μš”:

plugins: [
    new webpack.NormalModuleReplacementPlugin(/m[sy]sql2?|oracle(db)?|sqlite3/, "node-noop"),
    new webpack.NormalModuleReplacementPlugin(/\.\.\/migrate/, "node-noop"),
    new webpack.NormalModuleReplacementPlugin(/\.\.\/seed/, "node-noop")
  ]

1) noop.js 의 μƒλŒ€ κ°€μ Έμ˜€κΈ°λ₯Ό knex λ‚΄λΆ€ κΉŠμˆ™μ΄ κ°€μ Έμ˜€λ €κ³  ν–ˆκΈ° λ•Œλ¬Έμ— μž‘λ™ν•˜μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€. 방금 이 κ°„λ‹¨ν•œ node-noop libλ₯Ό μ„€μΉ˜ν–ˆλŠ”λ° μ œλŒ€λ‘œ μž‘λ™ν–ˆμŠ΅λ‹ˆλ‹€.
2) Postgresλ₯Ό μ‚¬μš©ν•˜λ―€λ‘œ 첫 번째 μ€„μ˜ μ •κ·œμ‹μ€ μ°ΎλŠ” λ‹€λ₯Έ λͺ¨λ“  μ •κ·œμ‹κ³Ό μΌμΉ˜ν•©λ‹ˆλ‹€. 마음껏 μˆ˜μ •ν•˜μ„Έμš”.

2019/10 λ‚˜λŠ” 그것을 μž‘λ™ μ‹œμΌ°μŠ΅λ‹ˆλ‹€. λ‹€λ₯Έ λ¬Έμ œμ—μ„œ λ‚΄ 닡변을 μ°Έμ‘°ν•˜μ‹­μ‹œμ˜€ https://github.com/tgrisser/knex/issues/1446#issuecomment -537715431

λ‚˜λŠ” pg 쒅속성을 "μ™ΈλΆ€"둜 μ„€μ •ν•˜κ³  문제λ₯Ό 많이 ν•΄κ²°ν–ˆμŠ΅λ‹ˆλ‹€. webpack이 λ°±μ—”λ“œ 쒅속성을 ꡬ문 λΆ„μ„ν•œλ‹€λŠ” μ˜λ―Έμž…λ‹ˆκΉŒ?

μ•ˆλ…•ν•˜μ„Έμš” μ—¬λŸ¬λΆ„, μ €λŠ” knexλ₯Ό μ‚¬μš©ν•˜μ—¬ μ„œλΉ„μŠ€μ— λŒ€ν•œ μ™„μ „ν•œ μ›ΉνŒ© λ²ˆλ“€μ„ μƒμ„±ν•˜λŠ” 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ λ…Έλ ₯ν•˜κ³  μžˆμ—ˆκ³  ν•΄λ‹Ή λ²ˆλ“€μ—μ„œ ν”„λ‘œκ·Έλž˜λ° λ°©μ‹μœΌλ‘œ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜μ„ μ‹€ν–‰ν•˜λ €κ³  ν•  λ•Œ 이 λ¬Έμ œμ— λΆ€λ”ͺμ³€μŠ΅λ‹ˆλ‹€. @mdlavin 의 μ œμ•ˆμ€ μš”κ΅¬ 사항을 μ‹€ν–‰ν•˜λ„λ‘ ν–ˆμ§€λ§Œ webpack이 μ†ŒμŠ€ νŒŒμΌμ„ λ³€ν™˜ν•˜μ§€ μ•ŠλŠ” κ²°κ³Όλ₯Ό κ°€μ Έμ™”μŠ΅λ‹ˆλ‹€. 그것은 λ˜ν•œ λ‚΄κ°€ webpack λ²ˆλ“€μ˜ out of band λ²ˆλ“€κ³Ό ν•¨κ»˜ ν•΄λ‹Ή 디렉토리λ₯Ό 포함해야 ν•œλ‹€λŠ” 것을 μ˜λ―Έν–ˆμŠ΅λ‹ˆλ‹€.

webpack의 ContextReplacementPlugin λ₯Ό μ‚¬μš©ν•˜μ—¬ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 및 μ‹œλ“œ 문제λ₯Ό ν•΄κ²°ν•  수 μžˆλ‹€λŠ” 것을 μ•Œμ•˜μŠ΅λ‹ˆλ‹€. λ‹€μŒμ€ λ‚΄ κ΅¬μ„±μ˜ μƒ˜ν”Œμž…λ‹ˆλ‹€(typescript둜 μž‘μ„±).

plugins: [
  //...
  fs.existsSync(path.join(params.targetPackageFilePath, 'migrations')) && new webpack.ContextReplacementPlugin(
    /knex\/lib\/migrate/,
    '.',
    fs.readdirSync(path.join(params.targetPackageFilePath, 'migrations'))
      .reduce((result, file) => {
        return Object.assign(result, {
          [path.join(params.targetPackageFilePath, 'migrations', file)]: path.relative(
            path.dirname(require.resolve('knex/lib/migrate')),
            path.join(params.targetPackageFilePath, 'migrations', file)
          )
        });
      }, {})),

  fs.existsSync(path.join(params.targetPackageFilePath, 'seeds')) && new webpack.ContextReplacementPlugin(
    /knex\/lib\/seed/,
    '.',
    fs.readdirSync(path.join(params.targetPackageFilePath, 'seeds'))
      .reduce((result, file) => {
        return Object.assign(result, {
          [path.join(params.targetPackageFilePath, 'seeds', file)]: path.relative(
            path.dirname(require.resolve('knex/lib/seed')),
            path.join(params.targetPackageFilePath, 'seeds', file)
          )
        });
      }, {}))
  //...
]

λ‚΄ κ΅¬μ„±μ—μ„œ params.targetPackageFiletPath λŠ” μ»΄νŒŒμΌλ˜λŠ” νŒ¨ν‚€μ§€μ˜ ν™•μΈλœ κ²½λ‘œμž…λ‹ˆλ‹€(예: /Users/yourusername/yourproject ). λ”°λΌμ„œ ν•΄λ‹Ή 경둜의 ν”„λ‘œμ νŠΈμ— migrations 및 seeds 디렉토리가 μžˆλŠ” 경우 κ²°κ³Ό ν”ŒλŸ¬κ·ΈμΈ ꡬ성은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  fs.existsSync(path.join(params.targetPackageFilePath, 'migrations')) && new webpack.ContextReplacementPlugin(
    /knex\/lib\/migrate/,
    '.',
    {
      '/Users/yourusername/yourproject/201706261234_migration.ts': '../../../migrations/201706261234_migration.ts'
    }),

  fs.existsSync(path.join(params.targetPackageFilePath, 'seeds')) && new webpack.ContextReplacementPlugin(
    /knex\/lib\/seed/,
    '.',
    {
      '/Users/yourusername/yourproject/seeds/201706261234_first-seed.ts': '../../../seeds/201706261234_first-seed.ts'
    }),

이것을 쑰금 λΆ„ν•΄ν•˜μžλ©΄, λ¬Έμ œλŠ” knex의 λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 및 μ‹œλ“œ μ½”λ“œκ°€ μ—¬κΈ° https://github.com/tgrisser/knex/blob/master/ μ—μ„œμ™€ 같이 λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 및 μ‹œλ“œλ₯Ό λ‘œλ“œν•˜κΈ° μœ„ν•΄ require λ₯Ό ν˜ΈμΆœν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. src/migrate/index.js#L54. ν•˜λ“œ μ½”λ”©λœ λ¬Έμžμ—΄ 접두사 λ˜λŠ” 접미사 없이 μš”κ΅¬ν•˜λŠ” ν•¨μˆ˜/ν‘œν˜„μ‹μ˜ κ²°κ³Όλ₯Ό μ „λ‹¬ν•˜λ―€λ‘œ μ›ΉνŒ©μ΄ μ‹€μ œλ‘œ λ‘œλ“œν•  수 μžˆλŠ” νŒŒμΌμ„ νŒŒμ•…ν•˜λ €κ³  ν•  λ•Œ 이λ₯Ό κ²°μ •ν•  μΆ©λΆ„ν•œ 정보가 μ—†μŠ΅λ‹ˆλ‹€. 이 ν”ŒλŸ¬κ·ΈμΈμ€ μ›ΉνŒ©μ— ν•„μš”ν•œ 정보λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.

webpackκ³Ό λ²ˆλ“€λ§ν•  λ•Œ ν•„μš”ν•˜μ§€ μ•Šλ„λ‘ Knexλ₯Ό λ³€κ²½ν•  수 μžˆλŠ”μ§€ 잘 λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€. μ•„λ§ˆλ„ μ‚¬μš©μž μ˜μ—­μ—μ„œ μš”κ΅¬ 사항을 μˆ˜ν–‰ν•¨μœΌλ‘œμ¨?

μ–΄μ¨Œλ“ , λ‚˜λŠ” λ‚˜λ₯Ό μœ„ν•΄ μΌν•œ μ†”λ£¨μ…˜μ„ 곡유 ν•  것이라고 μƒκ°ν–ˆμŠ΅λ‹ˆλ‹€.

λ‚΄ ν•˜λ£¨λ₯Ό μ €μž₯, 정말 κ°μ‚¬ν•©λ‹ˆλ‹€.

μ†”λ£¨μ…˜μ„ μ°ΎλŠ” μ‚¬λžŒλ“€μ„ μœ„ν•΄ 이것은 knex@^0.21.1을 μ‚¬μš©ν•˜μ—¬ μ €μ—κ²Œ νš¨κ³Όμ μ΄μ—ˆμŠ΅λ‹ˆλ‹€. μ €λŠ” mysql2 λ“œλΌμ΄λ²„λ₯Ό μœ μ§€ν•˜κΈ°λ₯Ό μ›ν–ˆμŠ΅λ‹ˆλ‹€. λ‚˜λŠ” λ‚˜λ₯Ό μœ„ν•΄ ν•¨κ»˜ μž‘λ™ν•˜λŠ” 2 개의 κΈ°μ‘΄ μ†”λ£¨μ…˜μ„ μ‚¬μš©ν–ˆμŠ΅λ‹ˆλ‹€.

μˆ˜μ •λœ λ²„μ „μ˜ μ›ΉνŒ© ꡬ성 λ³‘ν•©μ—μ„œ https://github.com/knex/knex/issues/1128#issuecomment -515573845

externals: [
      {
        // Possible drivers for knex - we'll ignore them
       // comment the one YOU WANT to use
        sqlite3: 'sqlite3',
        // mysql2: 'mysql2', // << using this one
        mariasql: 'mariasql',
        mysql: 'mysql',
        mssql: 'mssql',
        oracle: 'oracle',
        'strong-oracle': 'strong-oracle',
        oracledb: 'oracledb',
        pg: 'pg',
        'pg-query-stream': 'pg-query-stream',
      }

λ˜ν•œ λ¬Έμ œκ°€λ˜λŠ” νŒ¨ν‚€μ§€λ₯Ό μ œμ™Έν•˜λŠ” webpack ν”ŒλŸ¬κ·ΈμΈμ„ μΆ”κ°€ν•˜μ‹­μ‹œμ˜€.
μ°Έμ‘° https://github.com/knex/knex/issues/3130#issuecomment -573293311

μ˜¬λ°”λ₯Έ mssql ν•˜μœ„ 디렉토리 μ„ΈνŠΈλ₯Ό ν¬ν•¨ν•˜κ³  Knexκ°€ μž‘λ™ν•˜λŠ” 데 ν•„μš”ν•œ 일뢀 pg νŒ¨ν‚€μ§€λ₯Ό ν¬ν•¨ν•˜μ—¬ λ‚΄ μ‚¬μš© μ‚¬λ‘€μ—μ„œ μ˜¬λ°”λ₯΄κ²Œ μ œμ™Έν•˜λ„λ‘ 원본을 μˆ˜μ •ν–ˆμŠ΅λ‹ˆλ‹€.

    new webpack.IgnorePlugin(
        new RegExp('^(mssql*|mariasql|.oracle.|sqlite3|mssql/.*|tedious|node-pre-gyp)$')
      ),
이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰