如何在package.json
中将私有的 Github 仓库列为“dependency”? 我尝试过npm 的 Github URL语法,例如ryanve/example
,但在包文件夹中执行npm install
时会出现“无法安装”的错误信息。 是否有一种特殊的语法(或其他机制)可以依赖于私有仓库?
如何在package.json
中将私有的 Github 仓库列为“dependency”? 我尝试过npm 的 Github URL语法,例如ryanve/example
,但在包文件夹中执行npm install
时会出现“无法安装”的错误信息。 是否有一种特殊的语法(或其他机制)可以依赖于私有仓库?
这可以通过 https和oauth 或者ssh实现。
https和oauth:创建拥有“repo”范围的访问令牌,然后使用这个语法:
"package-name": "git+https://<github_token>:x-oauth-basic@github.com/<user>/<repo>.git"
或
SSH: 设置 SSH 密钥,然后使用以下语法:
"package-name": "git+ssh://git@github.com:<user>/<repo>.git"
(请注意,在“用户”之前使用冒号而不是斜杠)
这种方法要求使用软件包的任何人都必须使用自己的个人访问令牌进行身份验证,而不是单个组访问令牌,从而使仓库免于访问令牌。您还不需要每次用户不再被授予访问权限时创建新的访问令牌,相反,从 GitHub 中删除用户将自动删除其软件包访问权限。
这是GitHub NPM指南的精简版本:https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-npm-registry
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
package.json
文件,按以下格式进行修改。 "name": "@jessica/my-npm-package",
"repository": "git://github.com/jessica/my-npm-package.git",
"publishConfig": {
"registry":"https://npm.pkg.github.com"
},
npm publish
npm install @jessica/my-npm-package
命令安装这个包。完成!
如果你的项目需要使用 GitHub Actions 脚本来安装此私有的 NPM 包,请继续阅读。
在 CI 环境中,您还需要使用 npm login
进行身份验证。否则,由于没有访问私有NPM包的权限,npm install
将会失败。一种预先配置的方法是使用一个 .npmrc
文件;然而,这会将认证凭据提交到带有该文件的存储库。因此,另一种方式是使用 NPM 工具 npm-cli-login。有一个要求,您必须使用自己的个人访问令牌(不太理想:您离开存储库后,CI 会中断),或者设置一个专门用于 CI 的 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"
请替换 NAME_OF_YOUR_ACCESS_TOKEN_SECRET
, USERNAME
, EMAIL
和 SCOPE
。
例如:
- 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包的存储库。
如果有人在寻找 GitLab 的其他选项,而上述选项均不可行,则我们还有另一种选择。对于 GitLab 服务器的本地安装,我们发现以下方法可以让我们包含软件包依赖项。我们生成并使用访问令牌来实现这一点。
$ npm install --save-dev https://git.yourdomain.com/userOrGroup/gitLabProjectName/repository/archive.tar.gz?private_token=InsertYourAccessTokenHere
当然,如果一个人以这种方式使用访问密钥,它应该具有有限的权限集。
祝好运!
使用 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"
// ...
}
我无法使被接受的答案在一个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",
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
你需要生成个人访问令牌,然后在登录npm时将其用作密码。
npm login --scope=@dave --registry=https://npm.pkg.github.com
username: ${github_username}
password: ${personal_access_token}
Email: ${public_email}
"<package>": "git+ssh://git@github.com/<user>/<repo>.git
。 - steveax"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。 - misantronichttps
时将x-oauth-basic
作为用户名,只需使用以下格式即可:"package-name": "git+https://<github_token>@github.com/<user>/<repo>.git"
。这条命令和之前的命令意思相同。 - kadam