强制 npm 在多台机器上安装相同的依赖项

Posted

技术标签:

【中文标题】强制 npm 在多台机器上安装相同的依赖项【英文标题】:Force npm to install the same dependencies on mutiple machines 【发布时间】:2015-08-09 10:48:14 【问题描述】:

我有一个packages.json 文件,我正在从该文件所在的同一目录中安装带有npm install 的所需节点模块。 问题是我在不同的机器上执行此操作,其中一些可能已经全局安装了一些依赖项。

这通常不应该代表一个问题,但在我的情况下它是。 例如,我需要安装 grunt-contrib-uglify 并且由于某些机器可能已经安装了一些依赖项,因此它们不会尝试获取和获取它们。这导致依赖关系树的两个版本略有不同。

示例:

npm list(截断)产生:

# Machine 1

├─┬ grunt-contrib-uglify@0.2.7
│ ├─┬ grunt-lib-contrib@0.6.1
│ │ └── zlib-browserify@0.0.1
│ └─┬ uglify-js@2.4.21
│   ├── async@0.2.10
│   ├─┬ source-map@0.1.34
│   │ └── amdefine@0.1.0
│   ├── uglify-to-browserify@1.0.2
│   └─┬ yargs@3.5.4
│     ├── camelcase@1.0.2
│     ├── decamelize@1.0.0
│     ├── window-size@0.1.0
│     └── wordwrap@0.0.2    

# Machine2

├─┬ grunt-contrib-uglify@0.2.7
│ ├─┬ grunt-lib-contrib@0.6.1
│ │ └── zlib-browserify@0.0.1
│ └─┬ uglify-js@2.4.23
│   ├── async@0.2.10
│   ├─┬ source-map@0.1.34
│   │ └── amdefine@0.1.0
│   ├── uglify-to-browserify@1.0.2
│   └─┬ yargs@3.5.4
│     ├── camelcase@1.1.0
│     ├── decamelize@1.0.0
│     ├── window-size@0.1.0
│     └── wordwrap@0.0.2

在这种情况下,camelcaseuglify-js 不是完全相同的版本。 当我将它与 grunt 结合使用来缩小生产 js 文件时,我得到编译文件之间的细微差别。当然,这两个文件的行为完全相同,但对于 git,它们是不同的(我想避免这种情况)

问题:我如何告诉npm 我想要完全相同的模块但完全相同的依赖项?

【问题讨论】:

很像this question 只是不知道这叫shrinkwrap 【参考方案1】:

我找到了解决方案:npm-shrinkwrap

所以,首先我应该像往常一样使用npm install 安装和测试模块,然后运行npm shrinkwrap 将所有已安装的模块及其依赖项锁定到一个名为npm-shrinkwrap.json 的文件中。如果我们还想保存开发部门,我们可以使用标志 --dev

然后我们可以用 git 跟踪这个文件,然后从其他机器检索跟踪的文件。

那么通常npm install => 如果文件npm-shrinkwrap.json 存在,它将优先于packages.json,npm 将使用它来安装文件中指定的所有deps。

【讨论】:

【参考方案2】:

有一个名为package-lock.json 的文件。它包含所有已安装包的确切依赖关系树,包括下载它们的注册表。每当您使用 npm install <package-name> 添加新的依赖项时,此文件都会自动更新。应该将其签入到您的版本控制中。

要确保文件中列出的相同软件包版本安装在您的node_modules 文件夹中,您必须执行命令npm ci(ci = 全新安装)。这将删除您的node_modules 文件夹并下载package-lock.json 中列出的确切包。在任何构建脚本中都应使用此命令而不是 npm install

【讨论】:

谢谢,在现代这是真的,但当时我问过这个问题 package-lock.js 不存在 :] 当时唯一的解决方案是 npm-shrinkwrap 我猜它现在已集成到npm 本身带有package-lock.json

以上是关于强制 npm 在多台机器上安装相同的依赖项的主要内容,如果未能解决你的问题,请参考以下文章

如何在多台机器上使用相同的 ssh 密钥?

如何强制 npm 3 安装嵌套依赖项?

如何使用任何工具或脚本在多台 Windows 机器上安装应用程序更新 [关闭]

如何强制排除 NPM 的嵌套依赖项?

如何强制 Yarn 重新安装软件包?

多台Tomcat Session共享