安装多个版本的作曲家包

Installing multiple versions of a composer package

我进入了 Composer 的“精彩”世界,因为 PHP 库开始不再提供手动下载和安装源代码的简便方法。

我们有一个非常庞大的系统,其中包含数十年的代码,因此一些不可避免的事情将会发生,例如:

我将选择 Google/Cloud,因为它有几个依赖项,例如 guzzlehttp。

如果我这样做:

cd /libraries/composer/google/cloud/0.179.0
composer require google/cloud:0.179.0

cd /libraries/composer/different_vendor/package/version
composer require different_vendor/package:version
# pretend this different vendor requires a version of guzzlehttp which is incompatible with google/cloud

cd /libraries/composer/guzzlehttp/guzzle/7.4.2    
composer require guzzlehttp/guzzle:7.4.2

那我写这样的代码会有问题吗?

<?php
require_once( '/libraries/composer/google/cloud/0.179.0/vendor/autoload.php' );
require_once( '/libraries/composer/different_vendor/package/version/vendor/autoload.php' );
require_once( '/libraries/composer/guzzlehttp/guzzle/7.4.2/vendor/autoload.php' );

如果我在一个微应用程序中需要 google/cloud 而在另一个微应用程序中需要 guzzle 那么我是否需要将 google/cloud 导入到只需要 guzzle 的应用程序中?

我只是想了解 Composer 的好处,因为所有的博客都盲目地说“jUsT uSe ComPOsEr”。我可以看到 composer 如何对一次性设置并忘记它的 webapps 有用,这大概是 运行 在专用服务器上,但离我们的生态系统很远;一个网站,提供 public 页面和各部门从单个域请求的各种微型应用程序。

我完全可以理解为什么下面的代码会出现问题,但我认为这种需求永远不会发生:

<?php
require_once( '/libraries/composer/google/cloud/0.178.0/vendor/autoload.php' );
require_once( '/libraries/composer/google/cloud/0.179.0/vendor/autoload.php' );

简而言之,不,您不能使用 composer 在同一个项目中安装多个版本的依赖项。 composer 的全部意义在于查看给定项目的所有依赖项,并安装一个可以在给定依赖项组合的情况下运行的版本。

我从您的措辞和示例中收集到的信息是,您正在独立于实际项目管理大量依赖项。 Composer 旨在为每个项目维护单独的依赖项,而不是手动管理所有项目使用的共享文件夹中的依赖项。

因此,如果您有 30 个项目,您应该在每个项目的根目录中有一个单独的 composer.json 文件,这将控制您对该项目的依赖项,但每个项目本身可能有不同的集合依赖项。例如,这允许您一次将一个项目迁移到新的主要 php 版本 and/or 新服务器。

如果您创建了可以在自己的项目中重复使用的代码库,那么理想情况下,您可以将自己的共享库变成一个私有的 composer 包,然后您可以将其作为依赖项安装在 composer.json 使用它的 30 个项目中的每一个。此时,您可以拥有自己的包的不同版本,并且 google api 之类的依赖项在您自己的包的不同版本之间可能会有所不同,然后 30 个项目中的每一个都可以要求最适合该项目的包版本。