38

我正在使用 node.js 编写一些代码(供内部使用),并希望将模块(为 npm 打包)存储在一个包存储库中,用于每个分发到将安装它们的各种机器。

理想情况下,我想要一个类似于 Debian 的 apt 存储库的解决方案,我可以在其中运行私有存储库服务器并配置 npm 以使用要安装的存储库列表(安装“foo”时,如果我的私人知道“foo”服务器从那里安装它,否则从公共服务器安装它)。

但是,看起来 npmregistry配置键只接受一个 URL。

有没有办法实现我想要的?

我能找到的最接近的是:

  • 在本地镜像公共存储库并在其上添加我的包……但我不想在 AWS 上复制大量数据(2.5G 并且仍在下载)。
  • 将我所有的包托管在 git 存储库中并从那里安装(这更麻烦)。
  • 在 HTTP 上托管静态包(据我所知,这将阻止我自动获取“最新版本”。我想我可以用符号链接做一些事情,但这仍然不如 git 灵活,需要完整的 URL(需要保持最新),并且不提供可搜索的存储库。
4

7 回答 7

36

我只是为我的工作设置了这个。这是我所做的:

  1. 设置空的 NPM 注册表:我按照 npmjs.org 的这个分支的说明进行操作,它添加了很多改进的文档

  2. 设置 Kappa:我使用了Kappa,这是 Paypal 的一个很棒的 npm 代理。(我猜他们的用例与大多数想要私有存储库的人非常相似;这正是我想要的)。

  3. 设置 npm_lazy可选):我想要一个很好的常用包缓存,以防 npmjs.org 出现故障,所以我在整个东西前面添加了npm_lazy,作为缓存层。

整个过程花了两天时间(ish)才能启动和运行。作为旁注,如果您担心人们会意外推送到公共注册表,我建议将其添加到您的package.json

"publishConfig": { "registry": "http://my-registry.example.com" },

这真的只是有点偏执。一旦您将 npm 设置为指向您的 Kappa/npm_lazy 实例,Kappa 就会为您处理发布到您的私有存储库。

注意:Kappa 只会每次发布到其配置中的第一个存储库。如果您需要同时发布到您的私有注册表和公众,您将需要制定自己的解决方案。

于 2014-03-04T22:23:59.353 回答
7

在您的 package.json 中,您可以使用任何指向有效 npm 打包模块的 url。我使用 s3 的存储桶名称很难猜到。

npm pack
s3cmd put *.tgz s3://path-to-your bucket

S3 只是一个示例,您可以使用任何可以将文件放置在 Web 服务器上的方法,甚至可以通过基本身份验证对其进行保护。

于 2013-01-30T20:48:29.693 回答
3

我相信 Paypal 的Kappa项目会满足您的需要。

这是一篇描述 Paypal 的 Kraken 项目以及 Kappa 如何融入其中的文章。

我知道在昆汀提出问题时它不可用,但也许这对来到这里的其他人有用。

于 2014-04-03T16:19:45.843 回答
3

npm-registry-client GitHub 问题 #42 列出了如何创建自己的存储库镜像的几种方法。即:

总的来说,在我看来,您可以通过搜索https://github.com/npm拥有的存储库中的问题或在那里提出您的问题来获得最佳答案

于 2014-07-10T18:54:42.390 回答
1

仅基于收听NodeUp的最新一集(#37?),我想您可能想看看irisnpm。据我所知,这是一项服务,可为您提供一组合并的公共模块和您自己的私有模块。

于 2013-01-30T17:55:39.250 回答
0

正如 Dominic Barnes 建议的那样,我们只能复制_design文档(CouchDB 表方案)

如何仅复制设计文档?

但是,它需要检查是否需要一些数据。

于 2013-02-26T09:10:12.573 回答
0

您可以复制您需要的模块,然后编写一个代理服务器,在您的复制中查找模块。如果模块不存在,它可以通过管道将请求发送到 NPM 并从那里返回结果。

于 2013-09-10T14:51:21.310 回答