如何收缩devDeDependencies,但不安装它们,除非必要?

为了运行testing套件,我需要一堆devDependencies ,并使用npm shrinkwrap devDependencies来locking生产依赖关系。 问题是,当我运行npm install ,只npm install了生产依赖项,为了安装devDependencies ,我必须删除npm- devDependencies并再次运行它。

现在,如果devDependencies也包含devDependencies ,它们会在生产环境中安装,不需要它们。 当然,应该有一些命令行参数强制只安装正常的依赖关系?

2016年9月:

正如其他人所说的那样,从npm v3.10.8开始,为了提高收缩包装function做了一些巨大的努力。

由于这个原因 ,在安装生产依赖关系的时候可以保持devDependencies被locking:

 npm shrinkwrap --dev npm install --only=prod 

2013答案:

正如NPM文档所述 :

由于npm shrinkwrap旨在locking用于生产使用的依赖关系, devDependencies除非在运行npm --dev时显式设置--dev标志,否则不会包含--dev 。 如果安装devDependencies被排除,那么npm将会打印一个警告。 如果您希望默认将它们安装到模块中,请考虑将它们添加到依赖关系中。

基本上,或者你locking所有的deps,或者只有生产deps。

甚至不运行npm install --devnpm install --force可以超越npm install --devfunction。

看起来这个特性最近被添加到npm客户端的每个更新日志的 v3.3中

你现在可以运行npm install --only=prod来达到你想要的效果。

编辑 2016年9月13日

我已经testing了npm v3.10.8,这个function现在按预期工作。 我们缩小了devDependencies,并且只能在部署时安装prod依赖。


我认为值得一提的是,这个function应该很快就能像预期的那样开始工作。 根据这个github 问题 ,大量的人遇到了同样的问题,根据这个请求 ,它将在下一个版本(计划于2016-09-08)发布。

随着拉入请求合并,你所要做的就是:

 npm i --only=prod 

这固定在npm 3.10.8 ; npm install --production不应该安装在由npm shrinkwrap --dev : https : //github.com/npm/npm/releases/tag/v3.10.8创build的npm shrinkwrap --dev