强制 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
在这种情况下,camelcase
和 uglify-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 在多台机器上安装相同的依赖项的主要内容,如果未能解决你的问题,请参考以下文章