【问题标题】:How to use private Github repo as npm dependency如何使用私有 Github 存储库作为 npm 依赖项
【发布时间】:2015-04-28 00:23:19
【问题描述】:

如何在package.json 中将私有Github 存储库列为"dependency"?我尝试了npm's Github URLs 类似ryanve/example 的语法,但是在包文件夹中执行npm install 会导致私有依赖项出现“无法安装”错误。是否有依赖私有仓库的特殊语法(或其他一些机制)?

【问题讨论】:

    标签: node.js git github npm package.json


    【解决方案1】:

    可以通过https and oauth ssh来完成。

    https 和 oauth: create an access token 具有“repo”范围和 then use this syntax:

    "package-name": "git+https://<github_token>:x-oauth-basic@github.com/<user>/<repo>.git"
    

    ssh: setup ssh 然后使用这个语法:

    "package-name": "git+ssh://git@github.com:<user>/<repo>.git"
    

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

    【讨论】:

    • 或者如果你在 github 上设置了 ssh,跳过令牌并使用:"&lt;package&gt;": "git+ssh://git@github.com/&lt;user&gt;/&lt;repo&gt;.git
    • 如何始终保持最新版本?
    • 将#master 添加到末尾
    • "package-name": "git+https://&lt;github_token&gt;:x-oauth-basic@github.com/&lt;user&gt;/&lt;repo&gt;.git" 对我不起作用。令人惊讶的是,切换令牌和 x-oauth-basic 完成了这项工作。所以,"package-name": "git+https://x-oauth-basic:&lt;github_token&gt;@github.com/&lt;user&gt;/&lt;repo&gt;.git" 为我工作。请注意,我在 gitlab 而不是 github。
    • 不需要httpsx-oauth-basic 作为用户名:"package-name": "git+https://&lt;github_token&gt;@github.com/&lt;user&gt;/&lt;repo&gt;.git" 也可以。
    【解决方案2】:

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

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

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

    祝你好运!

    【讨论】:

      【解决方案3】:

      使用 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
      

      在选择范围部分,检查 repo:完全控制私有存储库

      这样令牌可以访问用户可以看到的私有存储库

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

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

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

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

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

      【讨论】:

      • 那么,提交这个个人访问令牌并在 Travis CI 之类的东西中使用它是否安全?
      • @ConAntonakos 如果该项目是一个 Github 私有存储库,并且您已经支付了运行您的私有 Github 项目存储库的 Travis CI 的费用,那么是的(有点,因为您没有公开共享您的凭据)还要记住是您需要创建和使用新的 Github 用户的凭据,该用户只有对该私有存储库的读取权限。所以不要使用您的个人帐户 :) ...创建一个更容易锁定以防暴露的机器人用户帐户 ;) ...如果您正在构建一个银行项目,这将不会通过 ISO 认证,所以不,它永远不会安全甚至不在 GH 上存储代码
      【解决方案4】:

      NPM 没有 repo 中的访问令牌

      此方法要求使用包的任何人使用他们自己的个人访问令牌而不是单个组令牌进行身份验证,这允许存储库没有访问令牌。您也不需要在每次不再授予用户访问权限时创建新的访问令牌,相反,从 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安装包

      完成!

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


      GitHub Actions:如何安装私有 NPM 包

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

      1. 使用仅限 CI 的 GitHub 帐户创建访问令牌,或从您自己的 GitHub 帐户获取访问令牌。
      2. 在存储库设置中将该访问令牌作为“秘密”添加到您的存储库中。
      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_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"
      

      完成!

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

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

      【讨论】:

        【解决方案5】:

        我无法让接受的答案在 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
        

        package.json

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

        【讨论】:

          【解决方案6】:

          虽然这是一个老问题,但在此处添加一个适用于跨平台的答案。

          一般npm v7 syntax访问node_modules中的私有仓库是-

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

          您必须使用您的 git 服务提供商创建一个访问令牌,并至少具有读取权限。

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

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

          【讨论】:

          • 我无法使用上述语法在 Github 上为私有模块工作。 npm install 失败,说 repo 不存在。但是,当我直接从错误消息中复制并粘贴 url 时,它会成功加载到浏览器中,所以它肯定存在!也试过不带token name,只是token,也不行。
          猜你喜欢
          • 2017-03-29
          • 2019-02-25
          • 2014-06-06
          • 2016-03-30
          • 2016-03-18
          • 2021-12-27
          • 2019-06-21
          • 2021-01-21
          相关资源
          最近更新 更多