npm WARN Пакет включен как в зависимости от разработчика, так и от производства
При запуске npm install
Я получил следующее предупреждение:
npm WARN The package babel-core is included as both a dev and production dependency.
npm WARN The package babel-loader is included as both a dev and production dependency.
npm WARN The package babel-preset-react is included as both a dev and production dependency.
npm WARN The package redux-thunk is included as both a dev and production dependency.
npm WARN The package uglifyjs is included as both a dev and production dependency.
up to date in 7.183s
npm WARN The package babel-core is included as both a dev and production dependency.
npm WARN The package babel-loader is included as both a dev and production dependency.
npm WARN The package babel-preset-react is included as both a dev and production dependency.
npm WARN The package redux-thunk is included as both a dev and production dependency.
npm WARN The package uglifyjs is included as both a dev and production dependency.
Файл package.json
:
{
...
"dependencies": {
"axios": "^0.15.3",
"babel-core": "^6.10.4",
"babel-loader": "^6.2.4",
"babel-polyfill": "^6.9.1",
"babel-preset-es2015": "^6.9.0",
"babel-preset-react": "^6.11.1",
"babel-preset-stage-2": "^6.24.1",
"babel-register": "^6.9.0",
"bluebird": "^3.5.0",
"bootstrap-sass": "^3.3.7",
"classnames": "^2.2.5",
"console-polyfill": "^0.2.3",
"cross-env": "^1.0.8",
"css-loader": "^0.23.1",
"deepmerge": "^1.3.2",
"dom-helpers": "^3.0.0",
"expect": "^1.20.1",
"fuzzy": "^0.1.3",
"moment": "^2.18.1",
"node-libs-browser": "^1.0.0",
"node-sass": "^3.8.0",
"react": "^15.1.0",
"react-addons-shallow-compare": "15.4.0",
"react-addons-test-utils": "^15.1.0",
"react-axios": "0.0.9",
"react-bootstrap-daterangepicker": "^3.2.2",
"react-daterange-picker": "^1.1.0",
"react-dom": "^15.1.0",
"react-draggable": "^2.2.3",
"react-redux": "^4.4.8",
"react-router": "^3.0.2",
"react-virtualized": "^8.5.2",
"redux": "^3.6.0",
"redux-logger": "^2.6.1",
"redux-promise": "^0.5.3",
"redux-promise-middleware": "^4.2.0",
"redux-thunk": "^2.1.0",
"sass-loader": "^4.0.0",
"style-loader": "^0.13.1",
"uglifyjs": "=2.4.10",
"webpack-dev-middleware": "^1.6.1",
"webpack-dev-server": "^1.14.1",
"webpack-hot-middleware": "^2.11.0"
},
"devDependencies": {
"assets-webpack-plugin": "^3.5.1",
"babel-core": "^6.24.1",
"babel-loader": "^7.0.0",
"babel-plugin-add-module-exports": "^0.2.1",
"babel-plugin-react-transform": "^2.0.2",
"babel-plugin-transform-decorators-legacy": "^1.3.4",
"babel-preset-es2016": "^6.24.1",
"babel-preset-react": "^6.24.1",
"babel-preset-stage-3": "^6.24.1",
"didyoumean": "^1.2.1",
"extract-text-webpack-plugin": "^1.0.1",
"glob": "^7.1.1",
"postcss-loader": "^1.3.0",
"purifycss-webpack-plugin": "^2.0.3",
"react-transform-hmr": "^1.0.4",
"redux-thunk": "^2.2.0",
"uglifyjs": "=2.4.10",
"webpack": "^1.15.0",
"webpack-cleanup-plugin": "^0.5.1",
"webpack-split-chunks": "^0.1.1"
}
}
Заметил, что установлены разные версии. Что именно происходит, когда для dev и prod установлены две версии одного и того же пакета? Это нормальное поведение? Должен ли я избавиться от ссылок dupe в файле package.json?
Ответы
Ответ 1
У вас есть пакет, упомянутый в обоих разделах ваших зависимостей; вы должны полностью не делать этого, потому что это означает, что ваша производственная установка будет иметь другую версию для вашей установки.
Если вы npm install
вы получите все dependencies
и devDependencies
; однако, если вы npm install --production
вы получаете только установленные dependencies
.
Вы должны удалить то, что вам не нужно, чтобы приложение запускалось из dependencies
и devDependencies
их в devDependencies
. Вещи в dependencies
должны рассматриваться как требования для запуска приложения (после того, как произошла какая-либо трансформация кода).
Существует нулевой случай, когда зависимость должна быть в обоих.
Ответ 2
Мой сценарий использования - именно то, на что @Jim указал в комментарии к принятому ответу. В процессе разработки я хотел использовать файлы локального модуля, так как работал над ним в то же время, когда работал над другими проектами, используя его.
В производстве я бы использовал модуль из VCS, и я не хочу каждый раз вручную менять файл package.json.
Вот как я настроил свой package.json:
"dependencies": {
"module-name": "git+ssh://[email protected]/XXX/XXX.git#master"
},
"devDependencies": {
"module-name-dev": "file:../XXX"
}
При такой настройке npm не выдает никаких ошибок, потому что имена модулей разные, теперь осталось только разработать пакет dev вместо основного.
Я нашел пакет module-alias, он позволяет вам использовать псевдонимы для путей, которые вы хотите указать.
В самом начале файла app.js вам нужно добавить этот код:
if (process.env.NODE_ENV === 'development') {
const moduleAlias = require('module-alias');
moduleAlias.addAlias('module-name', 'module-name-dev');
}
С этого момента каждый раз, когда вам требуется модуль module-name
, вы фактически получаете module-name-dev
в разработке.
В производственной среде вы не должны устанавливать devDependencies, и псевдоним не будет работать, поэтому никаких дополнительных шагов для переключения между 2. не требуется.
Работа с веб-пакетом
Если вы используете веб-пакет, вам не нужен module-alias
, вы можете добавить псевдоним в конфигурацию веб-пакета, используя цепочку веб-пакетов следующим образом:
chainWebpack: (config) => {
if (process.env.NODE_ENV === 'development') {
config.resolve.alias
.set('module-name', 'module-name-dev');
}
},