如何使用私有Github repo作为npm依赖

rya*_*nve 178 git github node.js npm package.json

如何列出一个私人Github上回购为"dependency"package.json?我尝试了npm的Github URL语法ryanve/example,但是npm install在package文件夹中进行了私有依赖项的"无法安装"错误.是否有一个特殊的语法(或其他机制)依赖私人回购?

rya*_*nve 258

它可以通过https和oauth ssh完成.

https和oauth: 创建具有"repo"范围的访问令牌,然后使用以下语法:

"package-name": "git+https://<github_token>:x-oauth-basic@github.com/<user>/<repo>.git"
Run Code Online (Sandbox Code Playgroud)

要么

ssh: setup ssh然后使用以下语法:

"package-name": "git+ssh://git@github.com:<user>/<repo>.git"
Run Code Online (Sandbox Code Playgroud)

(注意在用户之前使用冒号而不是斜杠)

  • 添加#master到最后 (22认同)
  • 或者如果你在github上设置了ssh,跳过令牌并使用:`"<package>":"git + ssh://git@github.com/ <user>/<repo> .git` (19认同)
  • `"package-name":"git + https:// <github_token>:x-oauth-basic@github.com/ <user>/<repo> .git"`对我不起作用.令人惊讶的是切换令牌和x-oauth-basic完成了这项工作.所以,``package-name":"git + https:// x-oauth-basic:<github_token> @ github.com/<user>/<repo> .git"`对我有用.请注意我在gitlab而不是github. (4认同)
  • 在 `https` 上把 `x-oauth-basic` 作为用户名是不必要的:`"package-name": "git+https://&lt;github_token&gt;@github.com/&lt;user&gt;/&lt;repo&gt;.git "` 也有效。 (3认同)
  • 这是我不明白的一点...如果个人访问令牌是“个人的”,那么当多个开发人员共享它时,如何将其提交到 package.json 中?还是全球性的? (3认同)
  • 你如何将它始终发布到最新版本? (2认同)
  • 嗯,您要将访问令牌提交给 Git 吗?从安全角度来看听起来并不明智。 (2认同)

小智 21

如果有人正在为Git Lab寻找另一个选项并且上面的选项不起作用,那么我们还有另一种选择.对于Git Lab服务器的本地安装,我们发现下面的方法允许我们包含包依赖项.我们生成并使用访问令牌来执行此操作.

$ npm install --save-dev https://git.yourdomain.com/userOrGroup/gitLabProjectName/repository/archive.tar.gz?private_token=InsertYourAccessTokenHere
Run Code Online (Sandbox Code Playgroud)

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

祝好运!


Arn*_*sen 7

我无法在Docker容器中使接受的答案起作用。

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

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
Run Code Online (Sandbox Code Playgroud)

package.json

"my-lib": "github:username/repo",
Run Code Online (Sandbox Code Playgroud)


equ*_*nt8 6

使用git有一个https格式

https://github.com/equivalent/we_demand_serverless_ruby.git
Run Code Online (Sandbox Code Playgroud)

此格式接受用户+密码

https://bot-user:xxxxxxxxxxxxxxxxxxxxxxxxxxx@github.com/equivalent/we_demand_serverless_ruby.git
Run Code Online (Sandbox Code Playgroud)

所以你可以做的是创建一个新的用户,它将被用作机器人,只添加足够的权限,他只需要读取你想要在NPM模块中加载的存储库,直接在你的NPM模块中加载 packages.json

 Github > Click on Profile > Settings > Developer settings > Personal access tokens > Generate new token
Run Code Online (Sandbox Code Playgroud)

在Select Scopes部分中,选中on repo:完全控制私有存储库

这样,令牌可以访问用户可以看到的私人回购

现在在组织中创建新组,将此用户添加到组中,并仅添加您希望以这种方式提取的存储库(READ ONLY权限!)

您需要确保将此配置推送到私人仓库

然后你可以将它添加到/ packages.json(bot-user是用户名,xxxxxxxxx是生成的个人令牌)

// packages.json


{
  // ....
    "name_of_my_lib": "https://bot-user:xxxxxxxxxxxxxxxxxxxxxxxxxxx@github.com/ghuser/name_of_my_lib.git"
  // ...
}
Run Code Online (Sandbox Code Playgroud)

https://blog.eq8.eu/til/pull-git-private-repo-from-github-from-npm-modules-or-bundler.html


Ale*_*iuS 6

截至 2023 年 4 月,使用 github 存储库唯一对我有用的是:

npm install https://oauth2:<your-fine-grained-token>@github.com/owner/repo.git
Run Code Online (Sandbox Code Playgroud)

或者如果您想指定分支:

npm install https://oauth2:<your-fine-grained-token>@github.com/owner/repo.git#master
Run Code Online (Sandbox Code Playgroud)

例如:

npm install https://oauth2:github_pat_51BR4Zf222bFXEXgW0dg3O_Kdfh5dghIFHJUPOTJYdB4ahsqe607ewCaynCLRu3aAINOKhrUk42HsUd@github.com/facebook#master
Run Code Online (Sandbox Code Playgroud)

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

  • 这对我有用。对于任何想知道的人来说,我的细粒度访问令牌的范围是“内容”只读和“元数据”只读,并且这是针对单个包的。 (3认同)

Chr*_*yes 5

回购中没有访问令牌的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>
Run Code Online (Sandbox Code Playgroud)

例如:用户@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
Run Code Online (Sandbox Code Playgroud)
  1. 按照package.json以下格式更新。
  "name": "@jessica/my-npm-package",
  "repository": "git://github.com/jessica/my-npm-package.git",
  "publishConfig": {
    "registry":"https://npm.pkg.github.com"
  },
Run Code Online (Sandbox Code Playgroud)
  1. 要发布 NPM 包,请运行:
npm publish
Run Code Online (Sandbox Code Playgroud)

在项目中安装私有 NPM 包

  1. 以与上述第 2 步完全相同的方式登录到 NPM。
  2. 安装包 npm install @jessica/my-npm-package

完毕!

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


GitHub 操作:如何安装私有 NPM 包

在 CI 环境中,您还需要npm login进行类似的身份验证。否则,npm install将失败,因为它无权访问私有 NPM 包。一种预先配置它的方法是使用.npmrc文件;但是,这会将身份验证凭据提交给该文件的存储库。因此,另一种方法是使用 NPM 工具npm-cli-login。要求您要么使用自己的个人访问令牌(不是最佳选择:您离开存储库,CI 中断),要么专门为 CI 设置一个 GitHub 帐户并使用该帐户创建一个访问令牌。

  1. 使用仅限 CI 的 GitHub 帐户创建访问令牌或从您自己的 GitHub 帐户获取访问令牌。
  2. 在存储库设置中,将该访问令牌作为“秘密”添加到您的存储库中。
  3. 在安装 NPM 之后和运行之前,更新您的 GitHub 操作工作流脚本以运行此步骤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"
        
Run Code Online (Sandbox Code Playgroud)

更换NAME_OF_YOUR_ACCESS_TOKEN_SECRETUSERNAMEEMAILSCOPE

例如

- 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"
Run Code Online (Sandbox Code Playgroud)

完毕!

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

仅供参考:如果您熟悉 GitHub Actions,您可能会问为什么我们不能使用secrets.GITHUB_TOKENGitHub 自动提供的内容?原因是secrets.GITHUB_TOKEN 只能访问运行 GitHub Actions 的存储库,而无权访问私有 NPM 包的存储库。