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

时间:2014-04-10 13:02:04

标签: git npm gitlab

我们正在将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的网页界面,我有这个网址 git@git.domain.com:library/grunt-stylus-sprite.git。针对npm install运行此操作,它会尝试从npm registry安装git模块。

然而,使用网址: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>]

查看文档:{​​{3}}

9 个答案:

答案 0 :(得分:109)

您可以使用以下方法连接到私有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}

答案 1 :(得分:19)

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

答案 2 :(得分:10)

<强>更新

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

Creating a Deploy Token

  1. 登录到您的GitLab帐户。
  2. 转到要为其创建Deploy Tokens的项目。
  3. 转到设置&gt;库中。
  4. 单击“部署标记”部分的Expand
  5. 为令牌选择一个名称和可选的到期日期。
  6. 选择所需的范围。 &lt; = select read_repository
  7. 单击“创建部署令牌”。
  8. 将部署令牌保存在安全的地方。一旦你离开或刷新 页面,您将无法再次访问它。
  9. 旧答案

    转到User Settings > Access Tokens并使用access token权限创建新的read_registry

    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#{branch|tag}

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

答案 3 :(得分:6)

对于偶然发现这一点的其他人来说,我根本无法通过HTTPS工作 - 似乎它不支持直接链接到repo(例如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

答案 4 :(得分:6)

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

对我来说,只更改网址并没有让它发挥作用。以下是我必须采取的步骤来解决这个问题:

  • redirect_category: path: /112-redirect-this defaults: _controller: FrameworkBundle:Redirect:redirect route: products_in_categories slug: to-this permanent: true
  • 创建部署密钥并将其添加到repo
  • 编辑git config(git+ssh://git@github.com:owner/repo.git#master创建文件,如果它不存在)强制使用DeployKey而不是默认的ssh密钥

之后,npm安装工作正常。所有其他选项和解决方案都是由npm安装破坏产生的

答案 5 :(得分:3)

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

答案 6 :(得分:2)

对于私人gitlab.com回购来说,没有其他答案适用于我......

但这有效:

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

它只是来自项目页面的“clone”输入字段的git ssh clone url,其中git+ssh://被添加到它的前面。

答案 7 :(得分:1)

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

可以通过在.npmrc旁边添加一个package.json文件来从私有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"
URL中两次出现

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

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

答案 8 :(得分:0)

此解决方案仅适用于 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 是提交哈希