如何防止为Node.js(package.json)安装“ devDependencies” NPM模块?


587

我的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安装dependenciesdevDependencies呢?


1
根据文档,您说得对,--dev安装devdeps,否则仅安装dep。npmjs.org/doc/json.html。我知道这至少适用于命名包。
mna 2012年

1
如果您在2015年遇到此问题,则--save-dev switch会完全按照此问题的要求进行操作。
阿南德(Anand)2015年

1
这个答案stackoverflow.com/a/22004559/3718119给出了一个很好的解释之间的差异dependenciesdevDependencies他们每个人的使用和时间。
quasoft

Answers:


844

当在开发环境(默认)中的软件包目录中运行时,该npm install命令将与devDependencies其他命令一起安装dependencies

使用npm install --only=prod(或--only=production 安装dependencies,而不devDependencies,考虑NODE_ENV环境变量的值。

资料来源:npm docs

注意:在npm(2015-08-13)v3.3.0之前,该选项称为--production,即npm install --production


2
Agate的理由可能是删除devDependencies,这样,使用来安装您的软件包的消费者npm install yourpackage.tgz也不会获得devDependencies。但是,事实已经如此。请参阅下面的Kevin Cox的答案(stackoverflow.com/a/15826602/825588)。
2013年

5
npmjs.org/doc/cli/npm-install.html “默认情况下,npm install将安装所有列为依赖项的模块。使用--production标志,npm将不安装devDependencies中列出的模块。”
tomByrer 2014年

14
哦,我的上帝。我完全是NODE_ENV=production从其他事情中得到的,无法弄清为什么我npm install不会安装依赖项。感谢您的详尽回答。
2015年

1
npm install --dev 只会安装开发人员依赖项
Rustem K 2015年

10
对于npm 3.3及更高版本:npm WARN install不建议使用该--dev选项。使用--only=dev代替。
srcspider 2015年

232

我也遇到了这个问题!npm install有点令人困惑,Web帖子不断引入-d /-dev标志,就好像存在显式的“开发”安装模式一样。

  • npm install将同时安装“ dependencies ”和“ devDependencies

  • npm install --production将只安装“ 依赖项

  • npm install --dev将只安装“ devDependencies


29
警告:如果NODE_ENV设置为,production并且您运行npm install它,将不会安装dev依赖项。我在Dockerfile中遇到了这个问题。
vaughan

1
@vaughan我也遇到了这个问题,可以通过运行来解决npm --production=false install(尽管不确定是否可以与--dev标志一起使用)
Bavell

138

新选项是:

npm install --only=prod

如果您只想安装devDependencies:

npm install --only=dev

1
这回答了相反的问题。OP正在询问如何不安装devDependencies。
musicin3d

2
您部分正确的@ musicin3d,这就是为什么在第一部分中我回答了如何安装仅prod依赖项,而在第二部分中回答了如何仅安装dev依赖项的原因,以防万一。
Cloxure

5
嘿。在@ user1614572添加关于的部分之前,我留下了该评论--only=prod。先生,您是部分正确的人。; P
musicin3d

我们可以为部署包括单独的依赖项吗?
Jeeva Jsb '18

1
这是评论,不是答案。我不会定期检查所有评论。我从未见过人们在几年前更新评论。您基本上是来这里批评我发表评论的。我不会再回应了。有趣的拖钓其他人。
雅克·ジャック


32

如果您已经安装了所有依赖项,并且希望避免再次从NPM下载生产软件包,则只​​需键入:

npm prune --production

这将从您的node_modules文件夹中删除您的开发依赖项,这在尝试自动执行两步过程(例如,

  1. 使用开发依赖项对我的项目进行Webpack
  2. 仅使用生产模块构建Docker映像

npm prune在两者之间运行将使您不必重新安装所有内容!


19

使用“ npm install”时,模块将被加载并在整个应用程序中可用,无论它们是“ devDependencies”还是“ dependencies”。这个想法的总和:package.json定义为依赖项(任何类型)的所有内容都将安装到node_modules。

依赖项/ devDependencies / optionalDependencies之间的区别的目的是代码的使用者可以通过npm来安装这些资源。

根据文档:https : //npmjs.org/doc/json.html ...

如果有人计划在程序中下载和使用您的模块,那么他们可能不想或不需要下载并构建您使用的外部测试或文档框架。

在这种情况下,最好在devDependencies哈希中列出这些其他项。

设置--dev配置标志时,将安装这些工具。在进行npm链接或从软件包根目录进行npm安装时,会自动设置此标志,并且可以像其他npm配置参数一样进行管理。有关该主题的更多信息,请参见config(1)。

但是,要解决此问题,如果只想使用npm安装“依赖项”,则以下命令是:

npm install --production

这可以通过查看添加了此过滤器的Git提交来确认(以及其他一些提供此功能的过滤器[在下面列出])。

npm可以使用的替代过滤器:

--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


16

从软件包内部安装时,npm将安装dev依赖项(如果package.json当前目录中存在)。如果它来自另一个位置(npm注册表,git repo,文件系统上的其他位置),则仅安装依赖项。


你能改写吗?我认为您在括号中犯了一个错误,我认为您忘记了更早地关闭它,而这种折磨对我来说没有多大意义(非英语母语的人)。约翰在罗汉·辛格(Rohan Singh)回答下的评论使我不得不看您的回答(因为我的疑问与玛瑙的疑问完全相同),但没有成功。我仍然不明白如何npm install some-module将不安装的dev依赖项some-module
拉斐尔·伊恩

谢谢,固定。但是,我不明白其余的问题。
凯文·考克斯

3

我发现,当尝试为包含节点插件的软件包安装dev依赖项时,即使只想安装devDependencies,在运行npm install --dev时也无法避免构建插件。因此,我不得不绕过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

3

使用npm install packageName --save这将增加包的依赖关系,如果你用npm install packageName --save-dev那么它devDependencies

npm install packageName --save-dev应该用于添加软件包以用于开发目的。就像添加TDD包(Chai,mocha等)一样。用于开发而不用于生产。


OP在保存依赖项方面没有问题,package.json但是一旦已经保存了这些依赖项,那么如何强制npm仅安装一种特定类型的依赖项。当我在这里阅读您的答案时,我没有学到任何有助于解决OP所带来问题的信息。
路易

3

值得一提的是,您可以使用NODE_ENV环境变量来达到相同的结果。如果要对Node应用程序(例如Docker)进行容器化,则特别有用。

NODE_ENV=production npm install

上面的代码将安装除dev以外的所有依赖项(即devDependencies)。

如果您需要使用环境变量,Dockerfile可以在这里找到更多信息。

环境变量很容易在需要时被覆盖(例如,如果要在Travis CI上运行测试套件)。如果是这种情况,您可以执行以下操作:

docker run -v $(pwd):/usr/src/app --rm -it -e NODE_ENV=production node:8 npm install

NPM文档在这里

生产

  • 默认值:false
  • 类型:布尔值设置为true以在“生产”模式下运行。

    1. 在运行不带任何参数的本地npm install时,不会在最高级别安装devDependencies。
    2. 为生命周期脚本设置NODE_ENV =“ production”。

快乐的集装箱化=)


3

我建议使用npm ci。如果您只想安装生产所需的软件包(如您所写-没有devDependencies),则:

npm ci --only=production

要么

NODE_ENV=production npm ci

如果您喜欢老式的npm install话,那么:

npm install --production

要么

NODE_ENV=production npm install

这是一个很好的答案,为什么您应该使用npm ci


很酷,它确实也可以使用npm ci,而不仅仅是npm install
克莱森

2

需要添加到选择的答案:到目前为止,npm install在软件包目录(包含package.json)中将安装devDependencies,而npm install -g不会安装它们。


7
是的,-g不会安装devDependencies,但是它会全局安装软件包,这通常不是预期的结果。
Bardi Harborow 2014年

0

npm install --production是安装生产所需的节点模块的正确方法。查看文档以获取更多详细信息



-1
npm install --dev will install dev dependencies

并且,根据仅安装依赖项的问题,以下命令将有所帮助

npm install --prod will install dependencies
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.