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

时间:2015-05-27 11:19:17

标签: node.js git npm

我有一个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我想要完全相同的模块,但完全相同的依赖项?

1 个答案:

答案 0 :(得分:0)

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

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

然后我们可以使用git跟踪此文件,并从其他计算机检索跟踪的文件。

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