如何防止为Node.js(package.json)安装“devDependencies”NPM模块?
我有我的package.json文件(缩短版本):
{ "name": "a-module", "version": "0.0.1", "dependencies": { "coffee-script": ">= 1.1.3" }, "devDependencies": { "stylus": ">= 0.17.0" } }
我在Mac 10.6.8上使用NPM版本1.1.1。
当我从项目根目录运行以下命令时,它将安装dependencies
和 devDependencies
:
npm install
我的印象是这个命令安装了devDependencies
:
npm install --dev
我如何做到这一点,所以npm install
只安装dependencies
(所以生产环境只能得到这些模块),而像npm install --dev
安装dependencies
和devDependencies
?
在开发环境(默认)中, npm install
命令将在软件包目录中运行时,沿其他dependencies
安装devDependencies
。 为了解决这个问题,使用npm install --production
或者将NODE_ENV
环境variables设置为production
。
这里是一些更多的信息。
编辑:
从npm(2015-08-13)v3.3.0开始,使用npm install --production
会发出警告:
--production
选项的用法已被弃用。 使用--only=production
。
使用npm install --only=production
只安装dependencies
,而不是devDependencies,
而不pipeNODE_ENV
环境variables的值。
参考: npm docs | npm更新日志
我也遇到过这个问题! npm install有点令人困惑,webpost不断引入-d / – dev标志,好像有一个明确的“开发”安装模式。
-
npm install将同时安装“ dependencies ”和“ devDependencies ”
-
npm install –production将只安装“ 依赖关系 ”
-
npm install –dev只会安装“ devDependencies ”
新的选项是:
npm install --only=prod
如果你只想安装devDependencies:
npm install --only=dev
如果你在2016年阅读这篇文章,请使用你想要的
--only={prod[uction]|dev[elopment]}
参数将导致无论是否devDependencies或只有非devDependencies被安装,而不pipeNODE_ENV。
来自: https : //docs.npmjs.com/cli/install
当使用“npm install”时,无论是“devDependencies”还是“dependencies”,模块都会被加载并在整个应用程序中使用。 这个概念的总和:package.json定义为依赖项(任何types)的所有东西都被安装到node_modules。
依赖关系/ devDependencies / optionalDependencies之间区别的目的是代码的消费者可以使用w / npm来安装这些资源。
根据文档: https : //npmjs.org/doc/json.html …
如果有人计划在他们的程序中下载和使用你的模块,那么他们可能不想或者不需要下载和构build你使用的外部testing或者文档框架。
在这种情况下,最好在devDependencies哈希中列出这些附加项。
只要设置了–devconfiguration标志,就会安装这些东西。 这个标志在做npm链接或者从一个包的根目录进行npm安装的时候会自动设置,并且可以像其他npmconfiguration参数那样进行pipe理。 有关该主题的更多信息,请参阅config(1)。
但是,要解决这个问题,如果您只想使用npm安装“依赖关系”,则以下命令是:
npm install --production
这可以通过查看添加此filter的Git提交(以及其他一些filter[下面列出]来提供此function)来加以确认。
可以使用npm的替代filter:
--save => updates dependencies entries in the {{{json}}} file --force => force fetching remote entries if they exist on disk --force-latest => force latest version on conflict --production => do NOT install project devDependencies --no-color => do not print colors
@dmarr尝试使用npm install –production
npm将在从包内部安装时(如果在当前目录中有package.json
)安装开发依赖项。 如果是从另一个位置(npmregistry,git repo,文件系统上的不同位置),它只会安装依赖关系。
如果您已经安装了所有的依赖关系,并且想要避免再次从NPM下载您的产品包,则只需键入:
npm prune --production
这将从您的node_modules
文件夹中删除您的开发依赖关系,如果您尝试自动化两步过程(如
- Webpack我的项目,使用开发依赖
- 仅使用生产模块构buildDocker镜像
在两者之间运行npm prune
将使您不必重新安装所有内容!
需要添加到select的答案:截至目前, npm install
在一个包目录(包含package.json
)将安装devDependencies,而npm install -g
将不会安装它们。
我发现,当试图为包含节点插件的软件包安装开发依赖项时,即使只想安装devDependencies,也不能避免在运行npm install –dev时创build插件。 所以,我不得不在npm的背后:
node -e 'console.log( Object.keys( require( "./package.json" ).devDependencies ) );' | \ sed -e "s/^[^']*'//" -e "s/'.*$//" | \ xargs npm install
或者,更好(也更简洁)呢,
node -e 'Object.keys( require( "./package.json" ).devDependencies ) .map( function( item ){ console.log( item ) } );' | xargs npm install
使用npm install packageName --save
如果你使用npm install packageName --save-dev
那么它会在依赖关系中添加软件包,然后是devDependencies 。
npm install packageName --save-dev
应该用于为开发目的添加软件包。 就像添加TDD包(柴,摩卡等)。 哪些用于开发而不用于生产。
值得一提的是,您可以使用NODE_ENV
环境variables来实现相同的结果。 如果你正在容器化你的Node应用程序(例如Docker)特别有用。
NODE_ENV=production npm install
上面的代码将安装所有的依赖关系,但是dev的依赖关系(即devDependencies
)。
如果你需要在你的Dockerfile
使用环境variables,可以在这里find更多的信息。
环境variables很容易被覆盖(例如,如果你想在Travis CI上运行你的testing套件)。 如果是这样,你可以做这样的事情:
docker run -v $(pwd):/usr/src/app --rm -it -e NODE_ENV=production node:8 npm install
NPM文档在这里
生产
- 默认:false
types:布尔值设置为true,以“生产”模式运行。
- 在没有任何参数的情况下运行本地npm安装时,devDependencies不会安装在最高级别。
- 为生命周期脚本设置NODE_ENV =“生产”。
快乐容器化=)
现在有一个问题,如果你有npm 5+的package-lock.json。 你必须在使用npm install --production
之前将其删除。