从 gitlab 私有存储库安装 npm 模块

我们正在使用我们的私人项目 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 的网页界面,我得到了这个 URL 对 npm install运行这个命令,它尝试从 npm 注册表安装 git模块。

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

我用的是 Windows7x64。

更新

由于 NPM v3内置了对 GitLab 和其他来源(BitBucket,Gist)的支持,您可以从这些来源安装软件包。它适用于公共的和私有的,所以它并不完全与此相关,但是有些人可能会发现它很有用。

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

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

如果你想在 Gitlab 从事私人回购业务,你必须在你的 ABc0中管理你的凭证/认证令牌。看这里: https://docs.gitlab.com/ee/user/packages/npm_registry/#authenticate-to-the-package-registry

118218 次浏览

据我所知,你的问题出在 git://协议上。GitLab 只支持针对克隆的 HTTP 和 SSH。因此,您必须使用其中一个方法而不是 git 协议。

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

只是对于任何其他人偶然发现了这一点,我不能让它在 HTTPS 工作-似乎它不支持直接链接到回购(例如 https://git.domain.com/user/somerepo.git) ,也不支持 .tar.tar.bz.zip存档版本。

它似乎只适用于 .tar.gz归档文件。

完整示例(附有标签版本) :

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

下面是连接到私有 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}

虽然这个问题是关于 Gitlab 的,但是这个问题在谷歌搜索中排名很靠前,所以这里有一些关于如何修复我在 Github 中遇到的类似问题的更多信息。

对我来说,仅仅改变网址并不能让它工作。以下是我为解决这个问题所采取的步骤:

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

在此之后,npm 安装简单地工作。所有其他选项和解决方案导致 npm 安装中断

其他的答案对我来说都不适用于私人 gitlab.com 回购..。

然而,这种方法是有效的:

npm i -S git+ssh://git@gitlab.com:<org>/<project>.git

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

对于我来说,将 package.json 设置为如下工作方式。

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

令牌来自您的“配置文件设置-访问令牌”。

更新

如评论中提到的@felix (多谢@felix) ,使用 deploy token读取 gitlab上的私有注册表要相关得多。这种方式是令牌被破坏,攻击者只能读取存储库而不能进行更改。

创建部署令牌

  1. 登录到你的 GitLab帐户。
  2. 转到要为其创建部署令牌的项目。
  3. 进入设置 > 储存库。
  4. 单击 DeployToken 部分上的 Expand
  5. 选择令牌的名称和有效期(可选)。
  6. 选择所需的范围。 < = 选择 read_repository
  7. 单击创建部署令牌。
  8. 将部署标记保存在安全的地方 Page 你将无法再次访问它。

旧答案

转到 User Settings > Access Tokens并创建一个具有 read_registry权限的新 access token

enter image description here

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

enter image description here

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

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

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

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

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

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

使用 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是模块名。项目 ID(8位数字)是 Gitlab 项目 ID,可以在项目页面的名称下看到它。甚至可以从模块名称中省略@foo (但不能省略链接)。

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

这个解决方案只适用于 yarn,不适用于 npm,但是..。

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

包裹 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 Read 权限的项目 Access Key
  • abcdef0123456789abcdef0123456789abcdef01是提交散列