【问题标题】:Why does `npm install` use the shrinkwrap's 'resolved' property为什么`npm install`使用shrinkwrap的'resolved'属性
【发布时间】:2015-11-12 22:41:23
【问题描述】:

我正在考虑在我的计算机上设置一个本地 npm 镜像,例如“npm_lazy”。 但似乎npm installnpm shrinkwrap 不适用于本地镜像。

让我解释一下。当有npm-shrinkwrap.json 文件时,npm install 命令总是从收缩包装文件的"resolved" 属性中指定的 URL 请求包。因此,即使我有一个在 http://localhost:12345/ 运行的本地 npm 镜像,即使我将 npm 配置为将其用作其注册表,它也不会从我的本地镜像请求任何包模块(除非收缩包装文件中的"resolved" 属性恰好指向http://localhost:12345/)。

基本上,npm install 会忽略 npm 的注册表配置并遵循 shrinkwrap "resolved" 属性。

npm install 使用 "resolved" 属性而不是使用依赖包名称和版本动态构造它是否有原因?为什么 npm-shrinkwrap.json 有这个字段呢?

回到我的问题。我想使用 npm_lazy 作为本地 npm 镜像。我可以重写npm-shrinkwrap.json 中的所有"resolved" URL 以指向http://localhost:12345/。但是我的收缩包装文件的可移植性较差——除非他们的计算机运行相同的 npm_lazy 服务器,否则我的同事将无法使用。

我考虑将所有registry.npmjs.org 流量重定向到localhost 以创建透明镜像。但这太难了——它需要支持 HTTPS,而且,npm_lazy 将如何访问真正的域?我必须通过它的 IP 地址来指定它,这可能会改变。

有没有其他人尝试做同样的事情——设置本地计算机 NPM 缓存? 但是,我的主要问题是,为什么 npm 使用“已解决”属性?谢谢。

【问题讨论】:

    标签: npm npm-install npm-shrinkwrap npm-lazy


    【解决方案1】:

    Shrinkwrap 锁定依赖项,试图保证使用该压缩包文件的每个人都使用相同的“构建”(或依赖项)。它不仅锁定版本,而且锁定存储库 URL,原因相同:更改任何这些都可能会更改包的内容,从而失去任何保证。当然,如果 shrinkwrap 知道存储库缓存或代理的概念,它当然应该使用您的,但显然不是。

    通常你会替换 package.json 中的存储库 URL(因为这是一个源文件)并再次运行 npm shrinkwrap 以重新生成 npm-shrinkwrap.json 文件(因为它是一个生成的文件),并保持它打开本地开发分支。但是将配置文件分开是一件麻烦事。

    因此您可以输入cache.repository.example.com 作为存储库主机名,并将CNAME 添加到指向npmregistry 的DNS。任何在本地安装了 npm_lazy 的人都可以安全地覆盖其 Hosts 文件中的此 DNS 条目以指向 localhost。

    但是,有一个更简单的解决方案可以本地化您的结帐。最近我用这个little script to update package.json versions with values from npm-shrinkwrap.json 回答了一个问题,它可以很容易地适应更新npm-package.json 中的所有resolved 属性以使用您的代理,我将把它作为练习;-)

    【讨论】:

    • 感谢您的回复。我想避免对npm-shrinkwrap.jsonresolved url 进行任何更改,因为这会使其他人的npm install 失败(因为它会尝试从该URL 下载仅对我的计算机有效的包)。但是是的,如果我的 Intranet 有一个本地 NPM 注册表,我可以这样做。
    • 当然,您不会提交和推送该文件 - 它们是本地修改。
    • 我还找到了一种在收缩包装文件中获取自定义 URL 的简单方法。当 npm install 使用自定义配置的注册表 URL 运行时(通过 .npmrc 或使用 --registry 命令选项),它会将 URL 放入 node_modules 中的每个 package.json 中,位于名为 _resolved 的属性中。然后,当npm shrinkwrap 运行时,那些_resolved 属性将作为resolved 属性传送到生成的npm-shrinkwrap.json 文件。
    • 啊,是的,这是有道理的。不过,这将要求您删除npm-shrinkwrap.json,并且版本可能会更改。不过,您也会遇到同样的问题:shrinkwrap 文件已更改。
    【解决方案2】:

    我不想将resolved 属性保存到npm-package.json

    实用程序shonkwrap 可以解决问题。但这会影响团队中的每个人:输入shonkwrap 而不是npm shrinkwrap。或者,您可以将类似的代码写入您的构建脚本(例如 gulpfile),以从现有的 npm-package.json 中删除 resolved 属性。

    【讨论】:

      猜你喜欢
      • 2019-05-29
      • 2017-02-24
      • 2022-07-16
      • 1970-01-01
      • 2017-05-22
      • 1970-01-01
      • 2017-09-27
      • 2019-01-27
      • 1970-01-01
      相关资源
      最近更新 更多