如何收缩包装devDependencies,但除非必要,否则不安装它们?

时间:2013-07-09 08:59:36

标签: node.js npm

我需要一堆devDependencies才能运行测试套件并使用npm shrinkwrap锁定生产依赖项。问题是当我运行npm install时,只安装了生产依赖项,为了安装devDependencies,我必须删除npm-shrinkwrap.json并再次运行它。

现在,如果shrinkwrap也包含devDependencies,那么它们将在生产中安装,不需要它们。当然应该有一些命令行参数来强制只安装普通的依赖项?

5 个答案:

答案 0 :(得分:48)

2016年9月:

正如其他人所提到的那样,从npm v3.10.8开始,我们需要付出巨大努力来增强收缩包装功能。

感谢this,只有在安装生产依赖项时才能锁定devDependencies

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

2013回答:

NPM docs中所述:

  

由于npm shrinkwrap旨在锁定您的依赖项   生产用途,devDependencies将不包括在内,除非您   运行npm shrinkwrap时显式设置--dev标志。如果   排除已安装devDependencies,然后npm将打印警告。   如果您希望默认情况下将它们与您的模块一起安装,请   考虑将它们添加到依赖项中。

基本上,或者您锁定所有deps,或仅锁定生产deps。

甚至不能运行npm install --devnpm install --force都可以超越收缩包裹功能。

答案 1 :(得分:1)

最近在changelog

的npm客户端v3.3中添加了此功能

您现在可以运行import java.util.*; class C10E3 { static Scanner console = new Scanner(System.in); public static void main(String[] args) { //declaration phase int[] array ={4, 23, 65, 34, 82, 37, 12, 17, 24, 36, 82, 51}; int[] arrayUpdated = new int[11]; int intToBeRemoved; Remover remove = new Remover(); System.out.println("Which of these elements shalls be removed from thr array?"); for (intCounter = 0; intCounter < 12; intCounter++) System.out.print(array[intCounter]); System.out.print("\n"); intToBeRemoved = consoe.nextInt(); arrayUpdated = remove.removeItem(array, 12, intToBeRemoved); System.out.print("Updated Array: "); for (intCounter = 0; intCounter < 11; intCounter++) System.out.print(array[intCounter]); } } class Remover { private Vector vector = new Vector(); public int[] removeItem(int[] array, int intArrayLength, int intToRemove) { boolean boolIsRemoved; int[] arrayToReturn = new int[intArrayLength - 1]; int intCounter; for (intCounter = 0; intCounter < intArrayLength; intCounter++) vector.addElement(array[intCounter]); boolIsRemoved = vector.removeElement(intToRemove); if (boolIsRemoved == true) { for (intCounter = 0; intCounter < intArrayLength - 1; intCounter++) arrayToReturn[intCounter] = vector.elementAt(intCounter); } else { System.out.println("Element not present in array."); for (intCounter = 0; intCounter < intArrayLength - 1; intCounter++) arrayToReturn[intCounter] = array[intCounter]; } return arrayToReturn; } } 来达到您想要的效果。

答案 2 :(得分:1)

编辑 2016/09/13

我已经测试了npm v3.10.8,此功能现在按预期工作。我们收缩了devDependencies,并且在部署时只能安装prod依赖项。

我认为值得一提的是,此功能应该很快就会按预期开始工作。根据这个github issue,很多人遇到了同样的问题,根据这个pull request,它将在下一个版本中(计划于2016-09-08)。

合并了拉取请求后,您所要做的就是:

npm i --only=prod

答案 3 :(得分:1)

至于npm 5(我已经尝试过5.5.1和5.6.0), - 生产 - only = prod )标志是有问题的。

package-lock.json 存在于文件夹中时,

npm shrinkwrap --production

只需将文件名更改为 npm-shrinkwrap.json

我如何设法解决这个问题就是运行:

npm prune --production

然后运行:

npm shrinkwrap --production

答案 4 :(得分:0)

这已在npm 3.10.8中修复; npm install --production不应在npm shrinkwrap --dev创建的收缩包裹中安装开发人员:https://github.com/npm/npm/releases/tag/v3.10.8