强制 npm 在多台机器上安装相同的依赖项
Force npm to install the same dependencies on mutiple machines
我有一个 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
我想要完全相同的模块但也完全相同的依赖项?
我找到了解决方案:npm-shrinkwrap
所以,首先我应该像往常一样安装和测试模块 npm install
然后 运行 npm shrinkwrap
将所有已安装的模块及其依赖锁定到一个名为的文件中npm-shrinkwrap.json
。如果我们还想保存开发部门,我们可以使用标志 --dev
。
然后我们可以使用 git 跟踪此文件,并从其他机器检索跟踪的文件。
然后通常 npm install
=> 如果文件 npm-shrinkwrap.json
存在,它将优先于 packages.json
并且 npm 将使用它来安装文件中指定的所有 deps。
有一个名为 package-lock.json 的文件。它包含所有已安装包的确切依赖关系树,包括从中下载它们的注册表。每当您使用 npm install <package-name>
添加新的依赖项时,此文件都会自动更新。它应该签入您的版本控制。
要确保文件中列出的相同软件包版本安装在您的 node_modules
文件夹中,您必须执行命令 npm ci
(ci = 全新安装)。这将删除您的 node_modules
文件夹并下载 package-lock.json
中列出的确切软件包。在任何构建脚本中都应使用此命令而不是 npm install
。
我有一个 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
我想要完全相同的模块但也完全相同的依赖项?
我找到了解决方案:npm-shrinkwrap
所以,首先我应该像往常一样安装和测试模块 npm install
然后 运行 npm shrinkwrap
将所有已安装的模块及其依赖锁定到一个名为的文件中npm-shrinkwrap.json
。如果我们还想保存开发部门,我们可以使用标志 --dev
。
然后我们可以使用 git 跟踪此文件,并从其他机器检索跟踪的文件。
然后通常 npm install
=> 如果文件 npm-shrinkwrap.json
存在,它将优先于 packages.json
并且 npm 将使用它来安装文件中指定的所有 deps。
有一个名为 package-lock.json 的文件。它包含所有已安装包的确切依赖关系树,包括从中下载它们的注册表。每当您使用 npm install <package-name>
添加新的依赖项时,此文件都会自动更新。它应该签入您的版本控制。
要确保文件中列出的相同软件包版本安装在您的 node_modules
文件夹中,您必须执行命令 npm ci
(ci = 全新安装)。这将删除您的 node_modules
文件夹并下载 package-lock.json
中列出的确切软件包。在任何构建脚本中都应使用此命令而不是 npm install
。