Composer 多级依赖与私人回购

Composer multi-level dependency with private repos

我遇到了以下问题:

我在 bitbucket 上有 6 个私有存储库

  1. 应用程序
  2. 实施 1
  3. 实施2
  4. 核心
  5. 捆绑包 1
  6. 捆绑包 2

应用程序是我的主要 - "root" 包。 现在 app 在 composer.json 中可以有多个 implementations 以及 core package 而且 core 在其 composer.json

中有多个 bundles

问题是当我使用

composer install

在我的 core 包中 - 它通常会下载 bundle1 以及 bundle2 inside core/vendor文件夹。

但是当我尝试从 app 安装软件包时 - 它给了我以下错误:

 Problem 1
    - Installation request for company/app-core-bundle dev-master -> satisfiable by company/app-core-bundle[dev-master].
    - company/app-core-bundle dev-master requires company/app-bundle1-bundle * -> no matching package found.

我找到的解决方法是在 app/composer.json 中指定所有存储库,但这是一个糟糕的解决方案,而且它不是依赖项的用途。

这里有 2 个部分 composer.json:

  1. app/composer.json

    {
       "name": "company/app",
       "version": "master",
       "type": "project",
       "minimum-stability": "dev",
       "license": "proprietary",
       "repositories": [
          {
             "type": "git",
             "url":"git@bitbucket.org:username/company-app-core.git"
          }
       ],
       "require": {
         "php": ">=5.5.9",
         ...
         "company/app-core-bundle": "dev-master"
       }
    }
    
  2. company-app-core/composer.json

     {
        "name": "company/app-core-bundle",
        "version": "master",
        "type": "symfony-bundle",
        "minimum-stability": "dev",
        "license": "proprietary",
        "repositories": [
          {
            "type": "git",
            "url":"git@bitbucket.org:username/company-app-bundle1.git"
          },
          {
            "type": "git",
            "url":"git@bitbucket.org:username/company-app-bundle2.git"
          }
        ],
        "require": {
           "php": ">=5.5",
           "company/app-bundle1-bundle": "*",
           "company/app-bundle2-bundle": "*"
        }
     }
    
  3. company-app-bundle1/composer.json

     {
        "name": "company/app-bundle1-bundle",
        "version": "master",
        "type": "symfony-bundle",
        "minimum-stability": "dev",
        "license": "proprietary",
        "require": {
          "php": ">=5.5",
          ...
          some other 3rd company bundles like FOS
        }
      }
    

这是一个 2 级依赖项,我的回购协议必须是私有的,我现在不想玩弄 Satis。

感谢您的帮助。 :)

没有更好的解决方案。

您必须以某种方式提供每个托管包的存储库的元数据。 Composer 可以找到有关 public 包的信息,因为它知道如何询问 packagist.org。对于私有存储库,这是无法做到的,所以必须有人给 Composer 一个指针,从哪里获取元数据。

基本上有两种方法:一种你不想使用的方法是使用一个额外的实例来做 Packagist 做的同样的事情,通过运行你自己的 Packagist 实例,或 Satis,或托兰代理。

另一种方法是在所有 composer.json 文件中单独列出每个存储库,这些文件永远需要将包托管在那里。这显然是次等的解决方案,因为它意味着您必须不断地将所有存储库添加到所有存储库的 composer.json 文件中,以防万一发生任何交叉引用的依赖项。此外,由于在更新期间收集最新数据时涉及的服务器连接数量,它可能会减慢速度。

没有适合您的灵丹妙药。 Composer 决定不递归扫描存储库,以便能够接受 运行 次。只有根存储库决定在哪里扫描包,默认情况下仅使用 Packagist(可以关闭),并且另外扫描类似 packagist 的实例或 repos。

Satis 仍然是托管私有存储库的最简单方法,因为它只需要在命令行上 运行ning PHP,然后通过静态 HTTP 托管使创建的文件可用。

Packagist 是一个 PHP 依赖于数据库、redis、缓存、邮件服务器等的应用程序 - 设置起来可能比 Satis 更复杂。

Toran Proxy 也是一个 PHP 应用程序,但没有此类依赖项(根据网站 - 我没有使用它的经验)。您只需要一个能够 运行 主脚本的虚拟主机。

对于所有这些,您必须正确配置,添加您的私有存储库列表以供它们扫描,然后将您的新 Composer 信息源的 URL 添加到所有 composer.json 文件在你所有的私有存储库中——但这只需要最后一次完成,之后这个 URL 保持不变并指向你所有存储库的更新元数据。

您需要在 composer.json 的根级别指定所有私有包。如前所述 - 作曲家不会进行递归扫描。我强烈建议使用 Toran Proxy。这将解决问题。 Satis 也是一个选项,但 Toran 几乎不需要配置并且有非常好的 GUI :)