如何在无法访问的机器上用范围限定的npm软件包来填充对私有存储库的访问权限?

时间:2020-03-23 19:42:02

标签: npm npm-cache

比方说,我有一个位于企业防火墙后面的私有NPM存储库。我想在无法连接到VPN的另一台计算机上设置项目,因此它将无法访问该私有存储库。

如何设置项目以轻松地从本地文件夹和/或本地npm缓存中导入那些依赖项,并跳过私有存储库?

也就是说,如果我的package.json文件具有...

"dependencies": {
   "@privateRepo/some-library-framework": "4.2.1"
}

...,但是我无法进入服务器,但是我可以从另一个node_modules文件夹中获得所需的文件,这些文件位于可以访问该存储库的计算机上。

我尝试从@privateRepo的软件包中取出文件,并对每个文件使用npm cache add D:\path\to\lib\with\packageDotJsonInside,但仍然得到...

Not Found - GET https://registry.npmjs.org/@privateRepo%2some-library-framework - Not found

...当我尝试npm i其余部分时。

我认为这意味着我需要在.npmrc中进行设置,例如described here ...

registry=https://registry.npmjs.org/
@test-scope:registry=http://nexus:8081/nexus/content/repositories/npm-test/
//nexus:8081/nexus/content/repositories/npm-test/:username=admin
//nexus:8081/nexus/content/repositories/npm-test/:_password=YWRtaW4xMjM=
email=…

...通常在其中设置auth的地方,但同时也在其中设置作用域包的URL。我想我想在这里设置@privateRepo:registry=http://localhost/something/something

但是我认为这也意味着我至少需要创建一个本地网络服务器(或npm repo?)来回答请求(然后也许我正在寻找类似verdaccio的东西?)。

因此,最简单的情况是,有没有办法强制应用程序使用缓存的版本,或者我还需要填充更多内容?如果没有,那么创建本地仓库来代替私有仓库来服务那些软件包的最简单方法是什么?

1 个答案:

答案 0 :(得分:1)

什么也看不见,最简单的答案 似乎是在建立本地npm存储库。然后,您可以将.npmrc设置为作用域内的专用注册表指向localhost,而不是VPN后面的“真实”版本。

事实证明,Verdaccio确实做到了这一点-您还可以 使用它来托管“真实的”私人仓库,包括在防火墙后面,但可以安装在您的计算机上dev框将允许您将npm软件包提供给本地任何新的代码库。


this video(在Verdaccio's docs site上链接)对此进行了详细描述。这是快速版本:

  • 安装verdaccio:npm install --global verdaccio
  • 运行verdaccio:verdaccio
    • 然后您可以在http://localhost:4873/(或其他位置,如果您更改了默认值)检出其界面
  • 创建用户:npm adduser --registry http://localhost:4873
  • 登录:npm login --registry http://localhost:4873
    • 您现在也可以根据需要以该用户的身份登录Web UI。
  • 导航到软件包的文件。导航进入特定于软件包的文件夹。
    • 也就是说,如果您从另一个项目的node_modules中提取所有软件包,则需要进入每个文件夹的package.json文件所在的每个文件夹中进行发布。
  • 发布程序包:npm publish --registry http://localhost:4873
    • 您可以通过刷新Web UI来再次检查它是否“采用”。
  • 为每个其他软件包重复。

就是这样!现在,您有一个软件包的npm存储库,可用于删除运行npm i的VPN要求。只需将新版本的软件包schlep到本地npm,然后适当地发布它们即可。

您将需要在.npmrc中为此注册表设置作用域条目,但是您已经为防火墙后面的存储库执行了此操作,所以没什么大不了,对吧?

准备移动支票以获得更好的答案,但这似乎应该可行。