4

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

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

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

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

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

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

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

4

2 回答 2

2

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

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

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

但是,有一个更简单的解决方案可以本地化您的结帐。最近我用这个小脚本package.jsonnpm-shrinkwrap.json回答了一个问题,用来自 的值更新版本,它可以很容易地适应更新所有resolved属性npm-package.json以使用您的代理,我将作为练习留下;-)

于 2015-11-12T23:06:50.653 回答
0

我不喜欢将resolved财产保存到npm-package.json.

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

于 2016-01-07T04:20:05.713 回答