Я пытаюсь использовать knex в проекте, над которым работаю. Проблема, с которой я сталкиваюсь, заключается в том, что когда я пытаюсь запустить веб-пакет, он отслеживает требования и пытается установить драйверы/диалекты, которые я не использую и не устанавливал.
Любые мысли о том, как это можно решить?
````` журнал
ОШИБКА в ./~/mariasql/lib/Client.js
Модуль не найден: ошибка: не удается разрешить «файл» или «каталог».../build/Debug/sqlclient в ~/project/node_modules/mariasql/lib
@ ./~/mariasql/lib/Client.js 17:10-45
ОШИБКА в ./~/knex/lib/dialects/sqlite3/index.js
Модуль не найден: ошибка: не удается разрешить модуль sqlite3 в ~/project/node_modules/knex/lib/dialects/sqlite3
@ ./~/knex/lib/dialects/sqlite3/index.js 33:11-29
ОШИБКА в ./~/knex/lib/dialects/mysql2/index.js
Модуль не найден: ошибка: не удается разрешить модуль «mysql2» в ~/project/node_modules/knex/lib/dialects/mysql2
@ ./~/knex/lib/dialects/mysql2/index.js 33:11-28
ОШИБКА в ./~/knex/lib/dialects/mysql/index.js
Модуль не найден: ошибка: не удается разрешить модуль «mysql» в ~/project/node_modules/knex/lib/dialects/mysql
@ ./~/knex/lib/dialects/mysql/index.js 35:11-27
ОШИБКА в ./~/knex/lib/dialects/oracle/index.js
Модуль не найден: ошибка: не удается разрешить модуль «оракул» в ~/project/node_modules/knex/lib/dialects/oracle
@ ./~/knex/lib/dialects/oracle/index.js 40:11-28
ОШИБКА в ./~/knex/lib/dialects/postgres/index.js
Модуль не найден: ошибка: не удается разрешить модуль «pg» в ~/project/node_modules/knex/lib/dialects/postgres
@ ./~/knex/lib/dialects/postgres/index.js 46:11-24
ОШИБКА в ./~/knex/lib/dialects/postgres/index.js
Модуль не найден: ошибка: не удается разрешить модуль «pg-query-stream» в ~/project/node_modules/knex/lib/dialects/postgres
@ ./~/knex/lib/dialects/postgres/index.js 132:50-76
ОШИБКА в ./~/knex/lib/dialects/strong-oracle/index.js
Модуль не найден: ошибка: не удается разрешить модуль «strong-oracle» в ~/project/node_modules/knex/lib/dialects/strong-oracle
@ ./~/knex/lib/dialects/strong-oracle/index.js 15:9-33```
``````
У меня была эта проблема, но добавление регулярного выражения к моим внешним данным в моей конфигурации веб-пакета исправило ее:
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... позволяет повторно открыть, если в knex требуются изменения для лучшей поддержки веб-пакета.
Собственно, я не думаю, что тему стоит закрывать еще, есть еще нерешенные проблемы с вебпаком, с миграцией и сидом:
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 и всем его содержимым (вы никогда не запускали npm install от имени пользователя root)?
[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',
Я рассмотрел немного другой подход, который позволяет веб-пакету обрабатывать большинство операторов require
в файлах knex, но оставляет только небуквальные require
s, так что файлы миграции и начальные файлы, предоставленные пользователем библиотеки можно найти. Вот мой подход:
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 заставило его запустить требование, но это привело к тому, что веб-пакет не преобразовал исходный файл. Это также означало, что мне нужно было включить этот каталог с пакетом из пакета веб-пакета.
Я понял, что вы можете использовать ContextReplacementPlugin
веб-пакета, чтобы решить проблему с миграциями и семенами. Ниже пример из моего конфига (написанный на машинописном языке):
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 вызывает require
для загрузки ваших миграций и начальных значений, как это делается здесь https://github.com/tgriesser/knex/blob/master/ src/мигрировать/index.js#L54. Он передает результат функции/выражения в запрос без жестко закодированного строкового префикса или суффикса, поэтому, когда веб-пакет пытается выяснить, какие файлы могут фактически загрузиться, у него недостаточно информации, чтобы определить это. Эти плагины предоставляют необходимую информацию для webpack.
Я не уверен, можно ли изменить Knex, чтобы сделать их ненужными при связывании с webpack. Может быть, выполнив требования в пользовательской зоне?
В любом случае, я подумал, что поделюсь решением, которое сработало для меня.
Любое предложение по этой проблеме в 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
, и она работала нормально.
2) Мы используем Postgres, поэтому регулярное выражение в первой строке совпадает со всеми остальными, которые оно ищет. Измените содержание вашего сердца.
2019/10 Мне удалось заставить его работать, см. мой ответ в другом выпуске https://github.com/tgriesser/knex/issues/1446#issuecomment -537715431
Я поставил зависимость pg как «внешнюю», и это решило проблему, большое спасибо, означает ли это, что веб-пакет анализирует внутренние зависимости?
Привет, ребята, я работал над решением проблемы создания полного пакета веб-пакетов для службы с использованием knex и столкнулся с этой проблемой при попытке программно запустить миграцию из этого пакета. Предложение @mdlavin заставило его запустить требование, но это привело к тому, что веб-пакет не преобразовал исходный файл. Это также означало, что мне нужно было включить этот каталог с пакетом из пакета веб-пакета.
Я понял, что вы можете использовать
ContextReplacementPlugin
веб-пакета, чтобы решить проблему с миграциями и семенами. Ниже пример из моего конфига (написанный на машинописном языке):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 вызывает
require
для загрузки ваших миграций и начальных значений, как это делается здесь https://github.com/tgriesser/knex/blob/master/ src/мигрировать/index.js#L54. Он передает результат функции/выражения в запрос без жестко закодированного строкового префикса или суффикса, поэтому, когда веб-пакет пытается выяснить, какие файлы могут фактически загрузиться, у него недостаточно информации, чтобы определить это. Эти плагины предоставляют необходимую информацию для webpack.Я не уверен, можно ли изменить Knex, чтобы сделать их ненужными при связывании с webpack. Может быть, выполнив требования в пользовательской зоне?
В любом случае, я подумал, что поделюсь решением, которое сработало для меня.
Спасите мои дни, большое спасибо.
Для тех, кто ищет решение, это сработало для меня, используя knex@^0.21.1, я хотел сохранить драйвер mysql2
. Я взял 2 существующих решения, которые работали вместе для меня.
В конфиге webpack слить модифицированную версию 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
, а также разрешить некоторые пакеты pg
, необходимые для работы Knex.
new webpack.IgnorePlugin(
new RegExp('^(mssql*|mariasql|.oracle.|sqlite3|mssql/.*|tedious|node-pre-gyp)$')
),
Самый полезный комментарий
тоже столкнулся с этим. что работает для меня;