【问题标题】:How to automatically switch php versions when cd'ing into another directory bashcd \'ing进入另一个目录bash时如何自动切换php版本
【发布时间】:2022-10-09 00:57:58
【问题描述】:

我有多个我正在从事的项目。

有些在 php 7.3 上,大部分在 7.4 上,一个在 8.1 上

每次切换项目时都必须切换 php 是我现在拥有的解决方案,但有时我需要对另一个项目进行快速检查,这会破坏在另一个项目中运行的代码,因为全局 php 已更新。

我所有的项目都是基于作曲家的,但作曲家并没有“吐出”最想要的 php 版本是什么。

如何根据 composer.json/lock 检测正确的 php 版本来使用?

【问题讨论】:

  • 我有同样的问题。我添加了两个 VirtualHost,然后在 htaccess 中: SetHandler proxy:unix:/usr/run/uwsgi/fastrouter.sock|uwsgi://php73 。我不时更改 apache 配置中的 DocumentDirectory。
  • 我建议你开始使用容器(docker)。它解决了如何运行具有不同依赖项的多个应用程序(例如 PHP)。
  • 在容器中运行 magento 进行开发并不能让牛肉笔记本电脑开心。

标签: php bash composer-php


【解决方案1】:

这个脚本是用通过ppa:ondrej/php 安装的php 制作的。如果您的 php 版本是自编译的,并且未链接到例如 /usr/bin/php7.4 中,则您需要将路径修改为正确的路径。但是,此代码确实假定二进制文件名为 php7.xphp8.x

这还要求您的系统上安装了一个作曲家。

将以下代码添加到您的 .bashrc 文件中。(nano ~/.bashrc) 解释代码中的 cmets 中的内容。

function do_php() {
    # Path where to find the php binaries
    PHPPATH='/usr/bin'
    
    # PHP versions in order of most used
    declare -a phpversions=("7.4" "7.3" "8.1" "8.0" "7.2" "7.1" "7.0");
    # Get a direct path to composer
    composer_path="$(whereis composer | cut -d  ' ' -f 2)"
    # Loop through all php versions
    for phpversion in "${phpversions[@]}"
      do
        PHP=$PHPPATH/php$phpversion
        # If the given php version is installed
        if [ -f $PHP ]; then
          # Check if it matches the requirements
          SUCCESS=$($PHP $composer_path check-platform-reqs 2>/dev/null | grep php | tr -s ' ' | cut -d ' ' -f 3)
           # If we're matching
           if [ "$SUCCESS" == "success" ]; then
              # Run command with given binary
              $PHP "$@"
              # exit function
              return
           fi
         fi
    done
    
    #Nothing matched, just run with default php and let the programmer deal with the issue
    php "$@"
}

# Set the alias for php to do_php
alias php='do_php'

【讨论】:

    【解决方案2】:

    我所有的项目都是基于作曲家的,但作曲家并没有“吐出”最想要的 php 版本是什么。

    如何根据 composer.json/lock 检测正确的 php 版本来使用?

    好吧,作曲家本身不能神奇地告诉您(每个项目)您的意图是什么,但是您可以使用平台包在每个项目的基础上轻松配置它。对于 PHP 版本,它是 php 包:

    {
        "config": {
            "platform": {
                "php": "7.0.3"
            }
        }
    }
    

    (比较:Composer config platformRun 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 脚本快捷方式(作曲家,请参阅Executing PHP scripts)
    • PHP_BINARY 环境变量(作曲家,见同)

    这些都是基于运行的 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 版本运行相同的设置来检查升级路径(甚至可以并行执行此操作)。只是为了前景。保持简单和愚蠢,那么从长远来看,您将拥有最佳选择(以及跨项目的可移植性)。

    【讨论】:

      猜你喜欢
      • 2017-12-26
      • 2012-10-11
      • 1970-01-01
      • 1970-01-01
      • 2011-01-25
      • 1970-01-01
      • 1970-01-01
      • 2014-12-21
      • 1970-01-01
      相关资源
      最近更新 更多