Node.js shrinkwrapped package.json导致npm install无论如何更新新版本

Tom*_*Tom 1 dependencies node.js npm

我有一个npm-shrinkwrap.jsonpackage.json在所谓的"部署"混帐分支.

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

因为没有发送node_modules二进制文件等,所以我需要在从服务器中提取项目存储库之后运行npm installnpm update在服务器端运行.

这就是我决定使用的原因npm shrinkwrap.但是,即使我npm-shrinkwrap.json在主文件夹中运行npm install它,它仍会安装较新版本的子模块,即使收缩包装的json文件已将其锁定.似乎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"
},
Run Code Online (Sandbox Code Playgroud)

然而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"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

然而,当我运行npm installqs从版本0.4.2 更新到版本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
Run Code Online (Sandbox Code Playgroud)

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

Cod*_*ity 5

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