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


98

我们正在将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.gitnpm install对它运行此命令将尝试git从npm注册表中安装模块。

但是,使用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


1
那么我使用的实际gitlab网址是什么?我只是看到<placeholders>我尝试了几种变体,但仍然说找不到项目。
chovy

1
$ npm i -S git+ssh://git@gitlab.com/org/repo.git不起作用
chovy

Answers:


157

您可以通过以下方法连接到私有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。我将更改答案刻度,因为这更准确。
FredyC 2014年

1
@jamessidhu我不确定,但是即使使用SSH,它也会询问我密码。输入密码后,它给我错误。知道如何解决吗?
codenooker

@codesnooker您是否在Gitlab中设置了SSH密钥?如果未在您的计算机和远程计算机之间授权密钥,则默认为密码,例如访问服务器。
sidhuko

5
实际上,这仅对我来说具有真正的URL语法,例如git+ssh://git@git.mydomain.com/Username/Repository(请注意/分隔主机名和用户名)。这可能是特定于纱线的事情,也许建议的示例确实适用于npm
Ivo van der Wijk

1
部署令牌效果很好。<token-name>在示例中gitlab+deploy-token-17034,它看起来像,不是您分配给令牌的任意名称。
Mr5o1

26

代替git://,use git+ssh://和npm应该做正确的事情。


5
从NPM创作者本身👆答案
迪马Parzhitsky

我得到undefined ls-remote <url>
chovy

git + ssh:git@git.mydomain.com/Username/Repositor,删除//对我有用。Thx
AliasCocoa

23

更新资料

正如@felix在评论中提到的(感谢@felix),using deploy token与读取上的私有注册表更为相关gitlab。这样就破坏了令牌,攻击者只能读取该存储库而不能进行更改。

创建一个部署令牌

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

旧答案

转到User Settings > Access Tokens并创建一个新access tokenread_registry权限。

在此处输入图片说明

复制生成tokenpackage.json文件,我们需要它。

在此处输入图片说明

现在package.json添加dependency如下:

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

Xaqron用您的用户名和token生成的令牌替换。您可以在网址末尾指定branch和。tag#{branch|tag}

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


5
另一种方法是为该特定存储库创建部署令牌。然后,它不会授予您所有存储库的读取访问权限。 "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

2
@chovy:安装git 请参阅
Xaqron

2
我还要指出的是,如果您的项目在一个组中,则应定义以下内容:"private-module": "git+https://gitlab+deploy-token-username:deploy-token@gitlab.com/group_name/project",而不是your username,而 必须group_name在项目名称之前定义
sfarzoso

8

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

对我来说,仅更改URL并不能使其起作用。这是我必须采取的步骤来解决此问题:

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

之后,npm安装就可以了。npm安装中断导致的所有其他选项和解决方案


那一定是错字。:owner
chovy

1
我该怎么办~/.ssh/config?我仍然不了解npm / gitlab
chovy

6

对于其他偶然发现此问题的人,我根本无法通过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


5

没有其他答案对我个人的gitlab.com仓库有用。

但是,这可行:

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

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


1
鉴于您的ssh公钥已在gitlab帐户上设置,因此此方法有效。
lasec0203

3

据我所知,git://协议出了问题。manbetx客户端打不开只支持HTTP和SSH的克隆。因此,您必须使用这些方法之一而不是git协议。


3

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

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

该令牌是从“个人资料设置-访问令牌”中获取的。


这也为我工作。我正在使用具有自签名证书的代理。
Stefano Mozart '18

这实际上对我有用,但我想知道将令牌保留在package.json中是否是一个好主意,因为其他人可能会使用它进行写入?gitlab(至少在我的情况下)不允许我创建只读访问令牌,而只能创建完全访问令牌。你怎么看?
–cerenbero

注意:GitLab 10.7(2018年4月发布)添加了项目级别的``部署令牌''。应该使用它们代替用户级别的“访问令牌”。docs link

0

如果要使用环境变量来保存URL中的令牌而不是硬编码的令牌,那么我想出了一个非常复杂的解决方案。我们将使用GIT_ASKPASS环境变量从bash脚本获取密码,该脚本将回显环境变量。为了克服npm仅传递特定的GIT环境变量的问题,我们将使用GIT_SSH中间人的身份。

因此,只要git_pass_env.sh包含,echo $GIT_SSH我们就可以调用:

GIT_SSH=<TOKEN> GIT_ASKPASS="$(pwd)/git_pass_env.sh" npm install

有关带有docker和docker-compose的示例项目,请在此处查看我的仓库

环境变量流程图:

流程图


0

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

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

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

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.