具有私有存储库的作曲家多级依赖项


Composer multi-level dependency with private repos

我得到了以下 propblem:

我在位桶上有 6 个私有存储库

  1. .app
  2. 实施1
  3. 实施2
  4. 核心
  5. 捆绑包1
  6. 捆绑包2

应用程序是我的主要 - "根"包。现在,该应用程序可以在composer.json中具有多个实现以及核心包比核心在其作曲家.json中有多个捆绑包

问题是当我使用

composer install

在我的核心包中 - 它通常会在核心/供应商文件夹中下载捆绑包 1捆绑包 2

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

 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中指定所有存储库,但这是一个糟糕的解决方案,也不是依赖项的用途。

以下是 composer.json 的 2 个部分:

  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。

感谢您的任何帮助。 :)

没有比这更好的解决方案了。

您必须以某种方式提供托管包的每个存储库的元数据。作曲家可以找到有关公共包的信息,因为它知道如何询问 packagist.org。对于私有存储库,这是无法完成的,因此必须有人向 Composer 提供一个指针来获取元数据。

基本上有两种方法:您不想使用的一种方法是使用额外的实例来执行与 Packagist 相同的操作,通过运行您自己的 Packagist 实例、Satis 或 Toran 代理。

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

没有适合你的灵丹妙药。Composer 决定不递归扫描存储库,以便能够获得可接受的运行时间。只有根存储库决定扫描包的位置,仅使用 Packagist 是默认的(可以关闭),另外扫描类似 packagist 的实例或存储库。

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

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

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

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

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