μμ μ€μΈ νλ‘μ νΈμμ 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```
``````
μ΄ λ¬Έμ κ° μμμ§λ§ 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)$')
),
κ°μ₯ μ μ©ν λκΈ
λν μ΄κ²μ λΆλͺμ³€λ€. λλ₯Ό μν΄ μΌνλ κ²;