【问题标题】:npm install private github repositories by dependency in package.jsonnpm 通过 package.json 中的依赖项安装私有 github 存储库
【发布时间】:2014-06-06 06:53:57
【问题描述】:

我正在尝试通过 npm 安装 github 私有存储库,其中包含其他私有 github 存储库作为依赖项。

尝试了很多方法和帖子,但没有一个有效。这就是我正在做的事情:

npm install git+https://github.com/myusername/mygitrepository.git

在 package.json 中是这样的:

"dependencies": {
    "repository1name": "git+https://github.com/myusername/repository1.git",
    "repository2name": "git+https://github.com/myusername/repository2.git"
}

正确的做法是什么?

【问题讨论】:

  • git+https://:x-oauth-basic@github.com//.git 它支持身份验证并且在所有情况下都可以正常工作.

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


【解决方案1】:

试试这个:

"dependencies" : {
  "name1" : "git://github.com/user/project.git#commit-ish",
  "name2" : "git://github.com/user/project.git#commit-ish"
}

你也可以试试这个,visionmedia/express 是 name/repo:

"dependencies" : {
   "express" : "visionmedia/express"
}

或者(如果存在 npm 包模块):

"dependencies" : {
  "name": "*"
}

取自NPM docs

【讨论】:

  • npm 错误!无法解析 git HEAD (github.com/user/reponame.git) 致命:不明确的参数“commit-ish”:未知的修订版或路径不在工作树中。
  • 不起作用。 #xxxx 不是必需的,就好像没有考虑到它被认为是主人一样,我所有的工作都在主人身上。还有其他想法吗?
  • 如果您删除标题 (#commit-ish),结果是否相同?
  • 你的仓库叫什么名字?
  • @vashishatashu,关于fatal: ambiguous argument 'commit-ish': unknown revision or path not in the working tree. 很明显commit-ish 只是一个示例词,您应该用您需要的特定提交的sha 替换它。 (或者如果您需要 master 分支中的最新提交,则完全删除 #commit-ish
【解决方案2】:

以下在我需要的所有场景中都可以正常工作:

"dependencies": {
"GitRepo": "git+https://<token-from-github>:x-oauth-basic@github.com/<user>/<GitRepo>.git"
}

【讨论】:

  • 你有这个解决方案的参考链接吗?
  • @Ian :我在某处读过它,但没有参考链接。我在生产中使用它一年多了,没有任何问题。您可以从 Github 获取 oauth 令牌:设置 -> 应用程序 -> 个人访问令牌 -> 生成新令牌。根据您的用例,此令牌可以具有读/写权限或同时具有这两种权限。
  • @lan :对于 bitbucket,您可以使用以下语法: git clone https://:x-oauth-basic@bitbucket.org// 可以从:Team -> Manage Team -> API Key 获得
  • 这是一篇关于这项技术的好文章:rzrsharp.net/2013/07/02/…
  • 由于您自己的 Github 访问令牌在您的 package.json 中直接可见,因此这似乎不是一个安全的解决方案。
【解决方案3】:

对于那些来这里获取公共目录的人,来自 npm 文档:https://docs.npmjs.com/files/package.json#git-urls-as-dependencies

Git URL 作为依赖项

Git url 可以是以下形式:

git://github.com/user/project.git#commit-ish
git+ssh://user@hostname:project.git#commit-ish
git+ssh://user@hostname/project.git#commit-ish
git+http://user@hostname/project/blah.git#commit-ish
git+https://user@hostname/project/blah.git#commit-ish

commit-ish 可以是任何可以作为参数提供给 git checkout 的标记、sha 或分支。默认是master。

【讨论】:

  • “用于公共目录”是什么意思?
  • As of version 1.1.65, you can refer to GitHub urls as just “foo”: “user/foo-project”. npmjs docs reference
  • 协议git+https://是什么意思?使用git 协议进行克隆并在推送https 时提取新更改?
【解决方案4】:

接受的答案有效,但我不太喜欢将安全令牌粘贴到 package.json 的想法

我在别处找到了,只需运行这个一次性命令as documented in the git-config manpage

git config --global url."https://${GITHUB_TOKEN}@github.com/".insteadOf git@github.com:

GITHUB_TOKEN 可以设置为环境变量或直接粘贴

然后我安装私有 github 存储库,例如:npm install user/repo --save


也可以在 Heroku 中使用,只需将上述 git config ... 命令设置为 package.json 中的 heroku-prebuild 脚​​本,并将 GITHUB_TOKEN 设置为 Heroku 配置变量。

【讨论】:

  • 这也适用于 Microsoft Visual Studio Team Services 构建链,我在 npm install 步骤之前将其作为“命令”执行。
  • 壮观! CI环境的绝佳解决方案!我确实需要对其进行一些修改;我不得不把结尾改成...insteadOf ssh://git@github.com
  • 这似乎不会影响我的 npm。运行npm install user/repo --save 时仍在使用ssh。有什么我需要配置的吗?
  • CI 环境的优秀解决方案,其中设置 SSH 很痛苦(CloudBuild)!非常感谢这个!
【解决方案5】:

正如人们指出的那样,有多种方法可以做到这一点,但最短的版本是:

// from master
"depName": "user/repo",

// specific branch
"depName": "user/repo#branch",

// specific commit
"depName": "user/repo#commit",

// private repo
"depName": "git+https://[TOKEN]:x-oauth-basic@github.com/user/repo.git"

例如

"dependencies" : {
  "hexo-renderer-marked": "amejiarosario/dsa.jsd#book",
  "hexo-renderer-marked": "amejiarosario/dsa.js#8ea61ce",
  "hexo-renderer-marked": "amejiarosario/dsa.js",
}

【讨论】:

  • 公共存储库的简洁答案,不幸的是这不是 OP 的问题。不过,它帮助了我,我很感激。
  • 我更新了我的答案以包括私人回购案例
  • 您将如何编写以从 repo 中获取文件夹作为依赖项?例如,从我的仓库中,我想将 /src/util 作为一个包
【解决方案6】:
"dependencies": {
  "some-package": "github:github_username/some-package"
}

或者只是

"dependencies": {
  "some-package": "github_username/some-package"
}

https://docs.npmjs.com/files/package.json#github-urls

【讨论】:

    【解决方案7】:

    由于 Git 在后台使用 curl,您可以使用带有凭据的 ~/.netrc 文件。对于 GitHub,它看起来像这样:

    machine github.com
      login <github username>
      password <password OR github access token>
    

    如果选择使用access tokens,可以从以下位置生成:

    设置 -> 开发者设置 -> 个人访问令牌

    如果您在自己的公司中使用 Github Enterprise,这也应该有效。只需将您的企业 github url 放在 machine 字段中。

    【讨论】:

    • machine github.com login &lt;token&gt; 在一行和"package": "https://github.com/acme/privaterepo.git#commit-ish" 或直接与npm install https://github.com/acme/privaterepo.git#commit-ish 一起为我工作
    • 这成功了!可能是 https 的唯一解决方案,而不使用令牌到 url。但是你能说像这样存储未加密的密码是否安全?
    【解决方案8】:

    这里是如何使用 Github 令牌而不在 package.json 文件中发布的更详细版本。

    1. 创建个人 github 访问令牌
    2. 在 ~/.gitconfig 中设置 url 重写
    git config --global url."https://<TOKEN HERE>:x-oauth-basic@github.com/".insteadOf https://x-oauth-basic@github.com/
    
    1. 安装私有存储库。用于调试访问错误的详细日志级别。
    npm install --loglevel verbose --save git+https://x-oauth-basic@github.com/<USERNAME HERE>/<REPOSITORY HERE>.git#v0.1.27
    

    如果访问 Github 失败,请尝试运行 git ls-remote ... 命令,npm install will print

    【讨论】:

      【解决方案9】:

      还有SSH Key - Still asking for password and passphrase

      在没有本地钥匙串的情况下使用ssh-add ~/.ssh/id_rsa

      这样可以避免混淆令牌。

      【讨论】:

        【解决方案10】:

        进一步,为了使密钥的访问安全

        1. 在 package.json 所在的同一目录级别创建 .env 文件。
        2. 在 .env 文件中提及 PERSONAL_ACCESS_TOKEN=************************************
        3. 不要忘记将 '.env' 添加到 .gitingore 列表中,这将防止在将 git 提交到仓库时将密钥暴露给外部世界。
        4. 现在您可以在 package.json 中添加您的依赖项,如下所示,

        包.json

        “依赖”:{ ... "my-private-github-repo": "git+https://${ENV.PERSONAL_ACCESS_TOKEN}@github.com/USER/abcd-repo-3.4.0.git", ... }

        还有其他使用“DOTENV”npm 包的方法,但是当我们试图解决“Github”包依赖时,它并不能做太多事情。以上似乎是直接的解决方案。

        【讨论】:

          【解决方案11】:

          对于我的私有存储库参考,我不想包含安全令牌,并且其他简单的(即仅在 package.json 中指定)都不起作用。以下是有效的方法:

          1. 去了 GitHub.com
          2. 导航到私有存储库
          3. 单击“克隆或下载”并复制 URL(与上述示例不匹配)
          4. 添加了#commit-sha
          5. 运行 npm install

          【讨论】:

            【解决方案12】:

            如果你想添加既没有锚定到 master 也没有锚定到特定提交的依赖项,你可以使用 semver 来完成。像这样:

            "dependencies": {
              "some-package": "github:github_username/some-package#semver:^1.0.0"
            }
            

            【讨论】:

              【解决方案13】:

              请注意,您尝试作为依赖项添加到 package.json 文件的 github 存储库需要定义自己的 package.json 文件。

              【讨论】:

                猜你喜欢
                • 2023-04-06
                • 2019-06-21
                • 2021-12-27
                • 2013-01-17
                • 2016-08-02
                • 1970-01-01
                • 2015-04-28
                • 1970-01-01
                • 2021-03-17
                相关资源
                最近更新 更多