为什么`npm install`使用了shrinkwrap' s'已解决的'属性

时间:2015-11-12 22:41:23

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

我正在考虑设置一个本地的npm镜像,例如" npm_lazy"在我的电脑上。 但似乎npm installnpm shrinkwrap不适用于本地镜像。

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

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

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

回到我的问题。我想使用npm_lazy作为本地npm镜像。我可以重写"resolved"中的所有npm-shrinkwrap.json网址,指向http://localhost:12345/。但是后来我的shrinkwrap文件不那么便携 - 除非他们的计算机运行相同的npm_lazy服务器,否则我的同事将无法使用。

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

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

2 个答案:

答案 0 :(得分:1)

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

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

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

但是,有一个更简单的解决方案来本地化您的结帐。最近,我使用little script to update package.json versions with values from npm-shrinkwrap.json回答了一个问题,可以轻松修改resolved中所有npm-package.json属性以使用您的代理,并将其作为练习留下; - )< / p>

答案 1 :(得分:0)

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

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