无论如何,Node.js的shrinkwrapped package.json都会导致npm install来更新新版本

我有一个名为“部署”的git分支中有一个npm-shrinkwrap.json和一个package.json

在我的服务器上,我从github中获取并合并这个部署分支。 这确保我的服务器具有最新的部署版本。

由于node_modules二进制文件等没有被发送,所以我需要在服务器端运行npm installnpm update ,在从服务器上拉取项目库之后。

这就是我决定使用npm shrinkwrap 。 但是,即使在主文件夹中有这个npm-shrinkwrap.json并运行npm install ,它仍然会安装较新版本的子模块,即使这个缩小的json文件已经locking了它们。 看起来npm甚至没有看到shrinkwrap文件。

谁能解释为什么会发生这种情况,以及如何解决这种情况?

这是package.json一部分:

 "dependencies" : { "eventemitter2" : "0.4.9", "after" : "0.4.1", "express" : "2.5.9" }, "devDependencies" : { "mocha" : ">= 1.0.3 < 2", "should" : ">= 0.6.3 < 1", "request" : ">= 2.9.202 < 3", "commander" : ">= 0.6.0 < 1" }, 

npm-shrinkwrap.json是:

 { "name": "appname", "version": "0.0.1", "dependencies": { "eventemitter2": { "version": "0.4.9" }, "after": { "version": "0.4.1" }, "express": { "version": "2.5.9", "dependencies": { "connect": { "version": "1.8.7", "dependencies": { "formidable": { "version": "1.0.9" } } }, "mime": { "version": "1.2.4" }, "qs": { "version": "0.4.2" }, "mkdirp": { "version": "0.3.0" } } }, "commander": { "version": "0.6.0" }, "should": { "version": "0.6.3" }, "request": { "version": "2.9.202" } } } 

然而,当我运行npm install它从版本0.4.2 qs更新到版本0.5.0。 而且,它将mime更新为1.2.5。 为什么要这样做?

npm install返回这个:

 qs@0.5.0 ./node_modules/express/node_modules/connect/node_modules/qs mime@1.2.5 ./node_modules/express/node_modules/connect/node_modules/mime 

有趣的是,收缩包装既不包含这些。 我想这是问题。 现在的问题是为什么它不包含这些。

您的npm-shrinkwrap.json不包含连接版本的qs。 您应该在生成收缩包装之前npm install