我所有的项目都是基于作曲家的,但作曲家并没有“吐出”最想要的 php 版本是什么。
如何根据 composer.json/lock 检测正确的 php 版本来使用?
好吧,作曲家本身不能神奇地告诉您(每个项目)您的意图是什么,但是您可以使用平台包在每个项目的基础上轻松配置它。对于 PHP 版本,它是 php 包:
{
"config": {
"platform": {
"php": "7.0.3"
}
}
}
(比较:Composer config platform,Run composer using different version of PHP without changing the environment variables)
您还可以添加扩展和库。现在您已经在项目中配置了信息,composer 将在安装和更新依赖项时使用该版本(例如,对于上面的7.0.3,需要>= 7.0.4 的软件包版本将不会安装)。
7.0.3 是一个不好的例子(只是从 Composer 文档中复制了版本),假设您在 PHP 7.4 项目中:
$ composer config platform.php '7.4.30'
现在也很容易映射 Sury 包的二进制名称,只需保持头部:
$ composer config platform.php | head -c3
7.4
对于 Composer 调用本身,不再需要它,但是您可能想做其他事情,所以这里有一些提示,它们已经在 Composer 中工作:
这些都是基于运行的 php 二进制作曲家。因此,如果您需要注入它,请使用适当的 php 版本调用 composer:
$ composer config platform.php '8.1.11'
$ php$(composer config platform.php | head -c3) $(which composer) diagnose
Checking composer.json: OK
...
PHP version: 8.1.11 - Package overridden via config.platform, same as actual
PHP binary path: /usr/bin/php8.1
...
(示例:在 Ubuntu 上使用 Ondřej Surý php8.1 包调用 Composer)
所以最终的作曲家脚本/钩子应该被覆盖。
对于一般调用,我建议使用构建管理器来定义目标、它们的依赖关系以及它们的制作规则。您的盒子上应该已经有make 实用程序,然后它只是make 并且大部分时间都已完成。您可以将 php 可执行文件名称添加到那里的配置中,在 composer.json 中控制平台版本,甚至可以跨项目重用它。当您可以在项目恕我直言中拥有它时,无需将其添加到环境中(比较Automation and Make)。
当您开始将项目迁移到另一个 php 版本时,您只有一个环境。使用构建管理器,您可以轻松地使用不同的 php 版本运行相同的设置来检查升级路径(甚至可以并行执行此操作)。只是为了前景。保持简单和愚蠢,那么从长远来看,您将拥有最佳选择(以及跨项目的可移植性)。