使用构建服务器上的版本控制系统,在GitHub上使用Composer和私有仓库

31

我的composer.json使用了我们组织在Github账户下的2个私有仓库,内容如下。

{
    "name": "API",
    "repositories": [
      {
        "type": "vcs",
        "url": "git@github.com/company/private.git"
      },
      {
        "type": "vcs",
        "url": "git@github.com/company/private2.git"
      }
    ],
    "require": {
        "php": ">=5.3.3",
        "zendframework/zendframework": ">2.1.3",
        "doctrine/mongodb-odm": "dev-master",
        "doctrine/doctrine-mongo-odm-module": "dev-master",
        "company/private": "dev-master",
        "company/private2": "dev-master"
    }
}

我们已经设置了SSH密钥并将其添加到了预备服务器上的授权密钥中。 当我们运行git clone时,它可以完美地工作,而且不需要任何凭据。

然而,当我们运行composer update时,仓库的获取会失败,因为composer无法访问该仓库。

由于这是以非交互方式运行的,因为这是构建脚本的一部分,我们无法输入凭据,并希望自动化此过程。

在构建过程中,我们该如何让composer访问我们的私有仓库?

4个回答

35

我理解问题标题特别提到了使用类型为“vcs”,但这是一种备选方法,用于将私有git仓库部署为项目包。

"repositories": [
  {
    "type": "package",
    "package": {
      "name": "company/private",
      "version": "0.1.0",
      "type": "package",
      "source": {
        "url": "git@github.com:/company/private.git",
        "type": "git",
        "reference": "master"
      }
    }
  }
],
"require": {
  "company/private": "*"
}

局限性在于每次部署时,如果您想要最新版本,则必须手动更改版本号。然而,这也是它的优点。

以这种方式定义存储库将允许您拉取 特定标记的版本。在这种情况下,标记为0.1.0的提交将在 composer update 上被拉取。

您需要在GitHub帐户中添加要部署到的服务器的SSH密钥。


@PaulPreibisch 我假设你已经解决了这个问题?如果没有,请粘贴你的代码,我们会帮你看看。 - Dream Ideation
1
正如Stuart在下面解释的那样,“url”参数缺少冒号(:)。我尝试编辑答案,但不允许进行单个字符的编辑。 - a.l.e
当我尝试以上解决方案时,出现以下错误...有人能帮帮我吗? 无法执行git clone --mirror 'https://:@github.com//company/project.git' '/home/xyz/.cache/composer/vcs/git-github.com--company-project.git/'正在克隆到裸仓库'/home/xyz/.cache/composer/vcs/git-github.com--company-project.git'... 致命错误:无法访问'https://:@github.com//company/project.git/':请求的URL返回错误:400 - Bhupendra

14

10

你原始问题中的URL缺少冒号:

"url": "git@github.com/company/private.git"

应该是

"url": "git@github.com:/company/private.git"

我之前也遇到了同样的问题,这个方法解决了它。


8
"name": "{vendor}/{package-name}",    
"repositories": [
    {
        "type": "package",
        "package": {
            "name": "{vendor}/{package-name}",
            "version": "{arbitrary-version}",
            "type": "package",
            "source": {
                "url": "git@github.com:{github-username}/{github-repository}.git",
                "type": "git",
                "reference": "{branch}"
            }
        }
    }
]
"require": {
    "{vendor}/{package-name}": "*"
}

我非常感谢你的答案和指导,但是对于我来说无法让解决方案工作。我认为答案可能需要更多细节说明正在发生的事情。

  • vendor: 在包的composer.json中使用的供应商名称。
  • package-name: 在包的composer.json中使用的包名称。
  • arbitrary-version: 一个随机版本号;不需要存在于GitHub中。
  • github-username: 存储仓库的GitHub用户帐户。
  • github-repository: GitHub存储库名称。
  • branch: 在检出代码时使用的GitHub分支。

给我最大问题的两件事是冒号(:)后面不应该跟着斜杠(/)。别忘了在url的末尾加上.git

猜测和不确定性点:

  1. 我不确定如果将package.name成员更改为错误内容会发生什么。换句话说,我不知道这是否仅是require的内部引用;还是还有其他事情发生。
  2. 我不确定分支实际上是否会改变任何内容,而我也无法测试。

我需要在哪里提到这个问题?是Magento根目录的composer.json还是模块的composer.json? - Sri
composer.json - "repositories" 是一个根键。一旦所有设置就绪,您只需运行 composer update 即可。 - Josh Bruce
1
我在这上面花了很长时间。所以感谢你的跟进并发布你的解决方案。非常感激。 - seemly
当然。很高兴能帮到你。它也适用于本地软件包;因此,您可以在本地服务器上拥有“私有软件包”,以便进行分离。 - Josh Bruce

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