【问题标题】:npm install of private package fails when package has public dependencies当包具有公共依赖项时,私有包的 npm 安装失败
【发布时间】:2019-04-29 13:13:18
【问题描述】:

假设我有一个私有 npm 存储库,托管在 JFrog artifactory 中: https://my-domain.com/artifactory/api/npm/my-repo。 在这个存储库中,我发布了一个 npm 包:my-package,构建良好。 my-package 对公共 npm packages 有依赖(或更多),例如lodash.

但是,当我创建一个新项目并尝试安装 my-package 时,我收到以下错误:

$ npm install my-package --registry https://my-domain.com/artifactory/api/npm/my-repo
npm ERR! code E404
npm ERR! 404 Not Found - GET https://my-domain.com/artifactory/api/npm/my-repo/lodash - not_found
npm ERR! 404
npm ERR! 404  'lodash^4.17.11' is not in the npm registry.
npm ERR! 404 You should bug the author to publish it (or use the name yourself!)
npm ERR! 404 It was specified as a dependency of 'my-package'
npm ERR! 404
npm ERR! 404 Note that you can also install from a
npm ERR! 404 tarball, folder, http url, or git url.

npm ERR! A complete log of this run can be found in:
npm ERR!     C:\Users\<username>\AppData\Roaming\npm-cache\_logs\2019-04-29T12_47_51_647Z-debug.log

当我在运行npm install 时指定--registry 选项时,似乎npm 正在我的私有存储库中搜索my-package 所需的所有依赖项。但是,my-package 依赖于公共依赖项,这些依赖项不在我的私有注册表中。

我的问题

如何从具有公共依赖项的私有注册表安装 npm 包?也许这也只是 JFrog 的问题?

任何帮助将不胜感激!

【问题讨论】:

    标签: npm npm-install npm-registry


    【解决方案1】:

    通过指定注册表:--registry https://my-domain.com/artifactory/api/npm/my-reponpm 正在尝试从您的私有存储库位置按名称和版本解析所有必要的包domain.com/artifactory/api/npm/my-repo

    要解决您的私有库所依赖的这些公共依赖项,您有两种选择:

    1. 设置虚拟 Npm 注册表。 (推荐这种方法)
    2. 在您的私有存储库中打包所有必要的依赖项。

    Artifactory 中定义的虚拟存储库聚合来自本地和远程存储库的包。这允许您访问本地托管的 npm 包和远程代理的 npm 注册表从为虚拟存储库定义的单个 URL

    通过设置一个虚拟存储库,引用您的私有存储库位置和默认的公共 npmjs 位置,您将能够通过指定上述指定来下载您的私有库以及任何公共 npm 包注册表。

    既然您提到了JFrog,请查看他们的融合page,它将引导您完成创建虚拟存储库的过程。

    但是,如果您决定使用选项 2,则必须将所有必要的依赖项打包到您的私有存储库中。然后您的私有库将能够正确提取它所依赖的依赖项。我建议不要使用这种方法,因为您将复制 npmjs 已经提供的工作,并且您还必须不断更新您的私有存储库以包含新库或现有库的更新版本。

    希望对您有所帮助!

    【讨论】:

    • 还有第三个选项npm scoped packages。这就是我实际提出的解决方案,因为它最适合我的情况。对我来说唯一的缺点是,我必须将我的包重命名为范围包。 (@scope/...)
    • 不确定这是否正是@ysfaran 的意思,但就我而言,我使用的是.npmrc,解决方案是使用此行为我的组织范围指定私有注册表地址:@ 987654329@。这样,在我的package.json 中,包@my-org/my-package 是唯一可以通过私有注册表检索的包,所有其他包都从默认的公共注册表中检索。
    • 我将@Charles 评论加倍。这应该是答案,因为这是解决问题的最简单方法。然后你可以使用@your-org/your-package 发布你的包,然后可以npm install @your-org/your-package
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-23
    • 2018-12-30
    • 2017-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-30
    相关资源
    最近更新 更多