【问题标题】:Install npm module from gitlab private repository从 gitlab 私有仓库安装 npm 模块
【发布时间】:2021-11-04 13:53:05
【问题描述】:

我们将GitLab 用于我们的私人项目。有一些来自 github 的分叉库,我们想将它们安装为 npm 模块。直接从 npm 安装该模块是可以的,例如:

npm install git://github.com/FredyC/grunt-stylus-sprite.git

...也可以正常工作,但对 GitLab 做同样的事情,只是更改域会给我这个错误。

npm WARN `git config --get remote.origin.url` returned wrong result (git://git.domain.com/library/grunt-stylus-sprite.git)
npm ERR! git clone git://git.domain.com/library/grunt-stylus-sprite.git Cloning into bare repository 'D:\users\Fredy\AppData\Roaming\npm-cache\_git-remotes\git-git-domain-com-library-grunt-stylus-sprite-git-6f33bc59'...
npm ERR! git clone git://git.domain.com/library/grunt-stylus-sprite.git fatal:unable to connect to git.domain.com:
npm ERR! git clone git://git.domain.com/library/grunt-stylus-sprite.git git.domain.com[0: 77.93.195.214]: errno=No error
npm ERR! Error: Command failed: Cloning into bare repository 'D:\users\Fredy\App
Data\Roaming\npm-cache\_git-remotes\git-git-domain-com-library-grunt-stylus-spr
ite-git-6f33bc59'...
npm ERR! fatal: unable to connect to git.domain.com:
npm ERR! git.domain.com[0: xx.xx.xx.xx]: errno=No error

从 GitLab 的 Web 界面,我有这个 URL git@git.domain.com:library/grunt-stylus-sprite.git。对 npm install 运行它会尝试从 npm 注册表安装 git 模块。

但是使用 URL:git+ssh@git.domain.com:library/grunt-stylus-sprite.git 突然要求我输入密码。我的 SSH 密钥不包含密码,所以我认为它无法加载该密钥。也许我错过了一些配置?密钥位于我的主目录中的标准位置,名称为 "id_rsa"

我使用的是 Windows 7 x64。

更新

从 NPM v3 开始,内置了对 GitLab 和其他源(BitBucket、Gist)的支持,您可以从中安装包。它适用于公共和私人,因此与此不完全相关,但有些人可能会觉得它有用。

npm install gitlab:<gitlabname>/<gitlabrepo>[#<commit-ish>]

查看文档:https://docs.npmjs.com/cli/install

如果您想在 Gitlab 中使用私有存储库,您需要在 .npmrc 中管理您的凭据/身份验证令牌。见这里:https://docs.gitlab.com/ee/user/packages/npm_registry/#authenticate-to-the-package-registry

【问题讨论】:

  • 那么我使用的实际 gitlab url 是什么?我刚刚看到&lt;placeholders&gt; 我尝试了几种变体,但它仍然说找不到项目。
  • $ npm i -S git+ssh://git@gitlab.com/org/repo.git 不起作用
  • Gitlab npm 注册表也可以用于私有包,没有任何问题。可以在 .npmrc 文件中处理身份验证,请参见此处:stackoverflow.com/a/42648251/4236831

标签: git npm gitlab


【解决方案1】:

此解决方案仅适用于yarn,不适用于npm,但...

如果您需要在既没有git 也没有ssh 可执行文件可用的环境中安装依赖项(例如在docker 内部),您可以使用repo access key with read API access 创建一个tarball 链接,然后像这样引用它:

package.json

{
  "dependencies": {
    "your-lib-name": "https://gitlab.com/api/v4/projects/1234567/repository/archive?private_token=ABC_123asdfg&sha=abcdef0123456789abcdef0123456789abcdef01",

地点:

  • 1234567 是你的项目 ID,可以在它的 gitlab 项目概述页面上看到。
  • ABC_123asdfg 是您创建的具有 API 读取权限的项目访问密钥
  • abcdef0123456789abcdef0123456789abcdef01 是提交哈希

【讨论】:

    【解决方案2】:

    Gitlab 现在有一个包注册表,可以在其中构建、部署和托管 npm 包。使用私有存储库,可以对存储库内容和包提供细粒度的访问控制。

    可以通过在 package.json 旁边添加 .npmrc 文件从私有 Gitlab 存储库安装 NPM 包。更多信息here。 尽管在同一代码库中为不同的存储库使用多个部署令牌时会变得复杂。

    使用 Gitlab 可以直接使用 HTTPS 访问包 .tgz 文件并部署令牌。只需像这样添加项目依赖项:

    "@foo/bar": "https://<username>:<token>@gitlab.com/api/v4/projects/<project-id>/packages/npm/@foo/bar/-/@foo/bar-1.0.0.tgz"
    

    @foo/bar 在 URL 中出现两次。 @foo 是项目范围,bar 是模块名称,1.0.0 是模块名称。 project-id(8位数字)是Gitlab项目ID,可以从名称下的项目页面中看到。甚至可以从模块名称中省略 @foo(但不是链接)。

    使用具有相同范围和不同部署令牌的多个模块可以确保管理私有存储库的安全。 此外,部署令牌可能只能访问 package registry,这意味着最终用户将无法访问存储库中的完整源代码。

    【讨论】:

      【解决方案3】:

      更新

      正如 @felix 在 cmets 中提到的(感谢 @felix),使用 deploy token 与读取 gitlab 上的私有注册表更相关。这种方式是令牌被泄露,攻击者只能读取该存储库而无法进行更改。

      Creating a Deploy Token

      1. 登录您的GitLab 帐户。
      2. 转到您要为其创建部署令牌的项目。
      3. 转到设置 > 存储库。
      4. 点击部署令牌部分的Expand
      5. 选择令牌的名称和到期日期(可选)。
      6. 选择所需的范围。 read_repository
      7. 点击创建部署令牌。
      8. 将部署令牌保存在安全的地方。一旦你离开或刷新 页面,您将无法再次访问它。

      旧答案

      转到User Settings &gt; Access Tokens 并使用read_registry 权限创建一个新的access token

      复制生成的token,我们的package.json 文件需要它。

      现在在package.json 添加dependency 如下:

      "my-module": "git+https://Xaqron:token@gitlab.com/Xaqron/my-module"
      

      Xaqron 替换为您的用户名,将token 替换为生成的令牌。您可以通过#{branch|tag}在url末尾指定branchtag

      注意:由于访问令牌位于package.json,任何有权访问此项目的人都可以读取存储库,因此我假设您的项目本身是私有的。

      【讨论】:

      • 另一种方法是为该特定存储库创建一个部署令牌。然后它不会授予您所有存储库的读取权限。 "private-module": "git+https://gitlab+deploy-token-username:deploy-token@gitlab.com/you/project",
      • npm ERR! enoent undefined ls-remote -h -t https://puump:pass@gitlab.com/puump/puump-content.git
      • @chovy:安装gitsee
      • 我还想指出,如果你的项目在一个组内,那么你应该定义这个:"private-module": "git+https://gitlab+deploy-token-username:deploy-token@gitlab.com/group_name/project",所以你必须在项目名称之前定义your username,而不是your username
      【解决方案4】:

      您有以下方法可以连接到私有 gitlab 存储库

      使用 SSH

      git+ssh://git@git.mydomain.com:Username/Repository#{branch|tag}
      git+ssh://git@git.mydomain.com/Username/Repository#{branch|tag}
      

      使用 HTTPS

      git+https://git@git.mydomain.com/Username/Repository#{branch|tag}
      

      使用 HTTPS 并部署令牌

      git+https://<token-name>:<token>@gitlab.com/Username/Repository#{branch|tag}
      

      【讨论】:

      • 是的,这几乎就是我想出的。您甚至可以指定分支或标签,例如Repository#1.2.3。我将更改答案标记,因为这样更准确。
      • @jamessidhu 我不确定,但即使使用 SSH 也会询问我密码。给出密码后,它给了我错误。知道如何解决吗?
      • @codesnooker 你设置了SSH key in Gitlab 吗?如果您的机器和远程设备之间的密钥未经授权,它将默认使用密码,例如访问服务器。
      • 这实际上只适用于真正的 URL 语法,例如git+ssh://git@git.mydomain.com/Username/Repository(注意 / 分隔主机和用户名)。这可能是特定于纱线的事情,也许建议的示例确实适用于 npm
      • 部署令牌效果很好。示例中的&lt;token-name&gt; 看起来像gitlab+deploy-token-17034,这不是您分配给令牌的任意名称。
      【解决方案5】:

      对我来说,将 package.json 设置如下。

      "dependencies": {
          "<module-name>": "git+http://<username>:<token>@url.git",
      }
      

      令牌来自您的“个人资料设置 - 访问令牌”。

      【讨论】:

      • 这对我也有用。我正在使用自签名证书的代理。
      • 这实际上对我有用,但我想知道将令牌留在 package.json 中是否是个好主意,因为其他人可能会使用它来写作? gitlab(至少在我的情况下)不允许我创建只读访问令牌,而只能创建完全访问令牌。你怎么看?
      • 注意:GitLab 10.7(2018 年 4 月发布)添加了项目级“部署令牌”。应该使用这些而不是用户级别的“访问令牌”。 docs link
      【解决方案6】:

      对于私人 gitlab.com 存储库,其他答案均不适合我...

      但是这可行:

      npm i -S git+ssh://git@gitlab.com:&lt;org&gt;/&lt;project&gt;.git

      它只是项目页面“克隆”输入字段中的 git ssh clone url,前面添加了git+ssh://

      【讨论】:

      • 这是可行的,因为您的 ssh 公钥已经在 gitlab 帐户上设置。
      【解决方案7】:

      虽然这个问题是关于 Gitlab 的,但这个问题在 google 搜索中排名很高,所以这里有一些关于如何解决我在 Github 上遇到的类似问题的更多信息。

      对我来说,仅更改 url 并不能使其工作。以下是我必须采取的步骤来解决这个问题:

      • git+ssh://git@github.com:owner/repo.git#master
      • 创建部署密钥并将其添加到存储库中
      • 编辑 git config(~/.ssh/config 如果文件不存在则创建该文件)强制使用 DeployKey 而不是默认的 ssh 密钥

      之后 npm install 就可以正常工作了。 npm install 中断导致的所有其他选项和解决方案

      【讨论】:

      • 这一定是一个错字。 :owner?
      • 我该怎么处理~/.ssh/config?我仍然没有通过 npm/gitlab
      【解决方案8】:

      对于其他偶然发现这一点的人,我根本无法让它通过 HTTPS 工作 - 似乎它不支持到 repo 的直接链接(例如https://git.domain.com/user/somerepo.git),也不支持@987654322 @、.tar.bz.zip 存档版本。

      它似乎只适用于 .tar.gz 存档。

      完整示例(带有标记版本):

      https://git.domain.com/user/somerepo/repository/archive.tar.gz?ref=v1.2.3

      【讨论】:

        【解决方案9】:

        使用git+ssh:// 而不是git://,npm 应该做正确的事情。

        【讨论】:

        • npm 创建者自己的回答?
        • 我收到undefined ls-remote &lt;url&gt;
        • git+ssh:git@git.mydomain.com/Username/Repositor,删除 // 它对我有用。谢谢
        【解决方案10】:

        据我所知,git:// 协议是您出错的地方。 GitLab 仅支持用于克隆的 HTTP(s) 和 SSH。所以你必须使用其中一种方法而不是 git 协议。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-09-23
          • 1970-01-01
          • 1970-01-01
          • 2021-01-23
          • 2023-03-25
          • 2019-06-21
          • 2021-04-03
          相关资源
          最近更新 更多