覆盖 package-lock.json 中已安装软件包的注册表

mit*_*man 20 node.js npm npm-registry

我有大量现有的package-lock.json依赖项,已通过http://registry.npmjs.org/解决。

例如

{
  "name": "my-package",
  "version": "1.2.3",
  "lockfileVersion": 1,
  "requires": true,
  "dependencies": {
    "@babel/cli": {
      "version": "7.7.4",
      "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.7.4.tgz",
      "integrity": "sha512-O7mmzaWdm+VabWQmxuM8hqNrWGGihN83KfhPUzp2lAW4kzIMwBxujXkZbD4fMwKMYY9FXTbDvXsJqU+5XHXi4A==",
      "dev": true,
      "requires": {
        "chokidar": "^2.1.8",
        "commander": "^4.0.1",
        "convert-source-map": "^1.1.0",
        "fs-readdir-recursive": "^1.1.0",
        "glob": "^7.0.0",
        "lodash": "^4.17.13",
        "make-dir": "^2.1.0",
        "slash": "^2.0.0",
        "source-map": "^0.5.0"
      },
      "dependencies": {
        "commander": {
          "version": "4.0.1",
          "resolved": "https://registry.npmjs.org/commander/-/commander-4.0.1.tgz",
          "integrity": "sha512-IPF4ouhCP+qdlcmCedhxX4xiGBPyigb8v5NeUp+0LyhwLgxMqyp3S0vl7TAPfS/hiP7FC3caI/PB9lTmP8r1NA==",
          "dev": true
        },
        "make-dir": {
          "version": "2.1.0",
          "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
          "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
          "dev": true,
          "requires": {
            "pify": "^4.0.1",
            "semver": "^5.6.0"
          }
        },
        "pify": {
          "version": "4.0.1",
          "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
          "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
          "dev": true
        },
        "source-map": {
          "version": "0.5.7",
          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
          "dev": true
        }
      }
    },
    ...

Run Code Online (Sandbox Code Playgroud)

我将注册表配置为 NPM Enterprise 安装,该安装托管专有 NPM 包并镜像公共 NPM 注册表。

registry = "https://custom.registry.tld/path/npm/npm-aggregate"
Run Code Online (Sandbox Code Playgroud)

这适用于新安装的软件包,但许多现有软件包仍然指向公共 NPM 注册表。npm i我尝试使用或覆盖 package-lock.json npm i --package-lock-only

如何强制 NPM 使用我的 Enterprise NPM 注册表并将正确的resolvedURL写入package-lock.json?我可能只能“查找并替换”,但我想确保 NPM 正确解决依赖关系。

小智 11

我正在运行npm -v2015 年 6 月 14 日

我只是手动更改了注册表项 package-lock.json并删除了该node_modules文件夹,然后运行了一个npm i来解决此问题。

一些对我不起作用的解决方案:

当我尝试仅使用 npm CLI 通过清除缓存来更改注册表时npm cache clear --forcenpm i --registry这些都不起作用。注册表根本没有改变,事实上npm i以任何形式运行后都被恢复了。

然后我尝试删除package-lock.jsonnode_modules运行安装。这导致我的 package-lock.json 中的许多版本发生更改,并导致我的特定项目构建失败。

我发现我遵循的步骤得到了我想要的,尽管它可能不是 npm 最佳实践的一部分。


Gab*_*iel 6

不幸的是,该package-lock.json文件旨在对每个包的注册表进行硬编码。它的目的是。

我们可以想象 NPM 中的未来选项可以强制注册,并结合完整性检查来确保包相同。(请随时向核心团队发送功能请求)

截至目前,npm 尚未涵盖此用例。您必须忽略以package-lock.json绕过此限制。

(截至今日,NPM最新版本为8.13.2)


小智 3

"resolved": "https://xxx..."覆盖注册表不会替换package-lock.json.

如果之前创建的这个错误,您必须将其删除,然后再次运行您的npm i. 它将使用之前配置的注册表创建一个新的注册表。

  • 删除文件的问题是您将丢失最初拥有的版本号,因此它不仅仅会更改 URL。 (5认同)