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