如何将私有Github仓库用作npm依赖

289

如何在package.json中将私有的 Github 仓库列为“dependency”? 我尝试过npm 的 Github URL语法,例如ryanve/example,但在包文件夹中执行npm install时会出现“无法安装”的错误信息。 是否有一种特殊的语法(或其他机制)可以依赖于私有仓库?

8个回答

410

22
如果您在 GitHub 上设置了 SSH,则可以跳过令牌并使用以下命令:"<package>": "git+ssh://git@github.com/<user>/<repo>.git - steveax
6
如何让它一直保持最新版本? - SIr Codealot
30
加 #master 到结尾。 - Jasmine Hegman
6
对我来说,"package-name": "git+https://<github_token>:x-oauth-basic@github.com/<user>/<repo>.git" 无法正常工作。令人惊讶的是,将 token 和 x-oauth-basic 交换后其能正常工作。因此,"package-name": "git+https://x-oauth-basic:<github_token>@github.com/<user>/<repo>.git" 对我有用。 请注意,我在使用 GitLab 而不是 GitHub。 - misantronic
6
不必在使用 https 时将 x-oauth-basic 作为用户名,只需使用以下格式即可:"package-name": "git+https://<github_token>@github.com/<user>/<repo>.git"。这条命令和之前的命令意思相同。 - kadam
显示剩余19条评论

36

在仓库中不需要使用NPM访问令牌

这种方法要求使用软件包的任何人都必须使用自己的个人访问令牌进行身份验证,而不是单个组访问令牌,从而使仓库免于访问令牌。您还不需要每次用户不再被授予访问权限时创建新的访问令牌,相反,从 GitHub 中删除用户将自动删除其软件包访问权限。

这是GitHub NPM指南的精简版本:https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-npm-registry


将您的 GitHub 仓库发布为 NPM 软件包

  1. 在开发者设置中创建个人访问令牌:https://github.com/settings/tokens
  2. 登录 NPM
npm login --scope=@<USERNAME of repo owner in lowercase> --registry=https://npm.pkg.github.com

Username: <Your personal GitHub username>
Password: <Create a GitHub Access Token with your account and paste it here>
Email: <Email associated with the same account>

例如:用户@Bobby想要将github.com/Jessica/my-npm-package发布为NPM包

npm login --scope=@jessica --registry=https://npm.pkg.github.com

Username: bobby
Password: yiueytiupoasdkjalgheoutpweoiru
Email: bobby@example.com
  1. 更新package.json文件,按以下格式进行修改。
  "name": "@jessica/my-npm-package",
  "repository": "git://github.com/jessica/my-npm-package.git",
  "publishConfig": {
    "registry":"https://npm.pkg.github.com"
  },
  1. 要发布 NPM 包,请运行:
npm publish

在项目中安装私有NPM包

  1. 按照步骤2的方式登录 NPM。
  2. 使用 npm install @jessica/my-npm-package 命令安装这个包。

完成!

如果你的项目需要使用 GitHub Actions 脚本来安装此私有的 NPM 包,请继续阅读。


GitHub Actions:如何安装私有NPM包

在 CI 环境中,您还需要使用 npm login 进行身份验证。否则,由于没有访问私有NPM包的权限,npm install 将会失败。一种预先配置的方法是使用一个 .npmrc 文件;然而,这会将认证凭据提交到带有该文件的存储库。因此,另一种方式是使用 NPM 工具 npm-cli-login。有一个要求,您必须使用自己的个人访问令牌(不太理想:您离开存储库后,CI 会中断),或者设置一个专门用于 CI 的 GitHub 帐户并针对该帐户创建访问令牌。

  1. 使用专门用于 CI 的 GitHub 帐户创建一个访问令牌,或从您自己的 GitHub 帐户中获取一个访问令牌。
  2. 在存储库设置中将该访问令牌添加为“secret”。
  3. 更新您的 GitHub Actions 工作流脚本,在安装 NPM 之后和运行 npm install 之前运行此步骤:
- name: Login to GitHub private NPM registry
  env:
    CI_ACCESS_TOKEN: ${{ secrets.NAME_OF_YOUR_ACCESS_TOKEN_SECRET }}
  shell: bash
  run: |
    npm install -g npm-cli-login
    npm-cli-login -u "USERNAME" -p "${CI_ACCESS_TOKEN}" -e "EMAIL" -r "https://npm.pkg.github.com" -s "@SCOPE"
        

请替换 NAME_OF_YOUR_ACCESS_TOKEN_SECRET, USERNAME, EMAILSCOPE

例如:

- name: Login to GitHub private NPM registry
  env:
    CI_ACCESS_TOKEN: ${{ secrets.MY_TOKEN }}
  shell: bash
  run: |
    npm install -g npm-cli-login
    npm-cli-login -u "ci-github-account" -p "${CI_ACCESS_TOKEN}" -e "ci-github-account@example.com" -r "https://npm.pkg.github.com" -s "@jessica"

完成!

现在,当GitHub Actions稍后运行npm install时,脚本将可以访问私有NPM包。

顺便说一下:如果您熟悉GitHub Actions,您可能会问为什么我们不能使用GitHub自动提供的secrets.GITHUB_TOKEN?原因是secrets.GITHUB_TOKEN具有访问运行GitHub Actions的存储库的权限,它无法访问私有NPM包的存储库。


1
我非常喜欢这个想法!#已收藏 - Gabriel C. Troia

28

如果有人在寻找 GitLab 的其他选项,而上述选项均不可行,则我们还有另一种选择。对于 GitLab 服务器的本地安装,我们发现以下方法可以让我们包含软件包依赖项。我们生成并使用访问令牌来实现这一点。

$ npm install --save-dev https://git.yourdomain.com/userOrGroup/gitLabProjectName/repository/archive.tar.gz?private_token=InsertYourAccessTokenHere

当然,如果一个人以这种方式使用访问密钥,它应该具有有限的权限集。

祝好运!


18

使用 Git 时,有一个 HTTPS 格式。

https://github.com/equivalent/we_demand_serverless_ruby.git

这种格式接受用户和密码

https://bot-user:xxxxxxxxxxxxxxxxxxxxxxxxxxx@github.com/equivalent/we_demand_serverless_ruby.git

所以你可以创建一个新用户,专门用作机器人,只要添加足够的权限,使其可以仅读取你想要加载到NPM模块中的仓库,并将其直接添加到packages.json中。

 Github > Click on Profile > Settings > Developer settings > Personal access tokens > Generate new token

在“选择范围(Select Scopes)”部分,勾选仓库(repo):完全控制私有仓库。

这样可以让 Token 访问用户可见的私有仓库。

现在在您的组织中创建新组,将该用户添加到该组,并仅向该组添加您希望以此方式拉取的存储库(只读权限!)

请务必将此配置仅推送到私有仓库

然后您可以将其添加到您的 /packages.json 文件中(bot-user 是用户名,xxxxxxxxx 是生成的个人 Token)。

// packages.json


{
  // ....
    "name_of_my_lib": "https://bot-user:xxxxxxxxxxxxxxxxxxxxxxxxxxx@github.com/ghuser/name_of_my_lib.git"
  // ...
}

从npm模块或bundler中从Github拉取Git私有仓库


1
那么,将这个个人访问令牌提交并在像Travis CI这样的地方使用是安全的吗? - Con Antonakos
@ConAntonakos 如果该项目是Github私有仓库并且您已经付费给Travis CI来运行您的私有Github项目仓库,那么是可以的(有点像,因为您没有公开共享您的凭据)。另外要记住的是,您需要创建和使用新Github用户的凭据,该用户只能读取此私有库。所以不要使用您的个人帐户 :) ……创建一个易于锁定的机器人用户帐户,以防曝光;) …如果您正在构建银行项目,则无法通过ISO认证,因此无论如何都不安全,甚至不能将代码存储在GH上。 - equivalent8

7

我无法使被接受的答案在一个Docker容器中工作。

对我有效的是,在名为.netrc的文件中设置来自GitHub的个人访问令牌

ARG GITHUB_READ_TOKEN
RUN echo -e "machine github.com\n  login $GITHUB_READ_TOKEN" > ~/.netrc 
RUN npm install --only=production --force \
  && npm cache clean --force
RUN rm ~/.netrc

package.json

"my-lib": "github:username/repo",

4

虽然这是一个老问题,但在此添加一个可以跨平台使用的答案。

访问 node_modules 中私有存储库的一般 npm v7 语法 是 -

git+https://<token_name>:<token>@<path_to_repository>.git#<commit>

您需要与您的git服务提供商创建一个至少具有读取访问权限的访问令牌。

以下是最流行平台的链接:

请注意,github创建的令牌与您的用户名关联,没有令牌名称,因此,请使用您的用户名而不是token_name作为github的令牌。


3
我无法使用上述语法使私有Github模块正常工作。npm install失败,显示仓库不存在。但是,当我直接从错误信息中复制并粘贴URL时,它可以成功在浏览器中加载,因此它一定存在!我也尝试过不使用token名称,只使用token,但还是不行。 - vy218

4
截至2023年4月,对我来说唯一有效的方法是使用GitHub存储库。
npm install https://oauth2:<your-fine-grained-token>@github.com/owner/repo.git

或者如果你想指定分支:
npm install https://oauth2:<your-fine-grained-token>@github.com/owner/repo.git#master

例如:

npm install https://oauth2:github_pat_51BR4Zf222bFXEXgW0dg3O_Kdfh5dghIFHJUPOTJYdB4ahsqe607ewCaynCLRu3aAINOKhrUk42HsUd@github.com/facebook#master

您可以在此处创建您的令牌:https://github.com/settings/tokens?type=beta。只读权限足以安装和使用存储库。

2
这对我有用。对于任何想知道的人,我的细粒度访问令牌范围是“内容”只读和“元数据”只读,并且这是针对单个包的。 - tennantje
我以为你字面上指的是oauth2。最终我将它替换为我的用户名,并且立刻成功了,尽管仓库在一个GitHub组织下。 - o-o

0

你需要生成个人访问令牌,然后在登录npm时将其用作密码。

npm login --scope=@dave --registry=https://npm.pkg.github.com
username: ${github_username}
password: ${personal_access_token}
Email: ${public_email}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接