理解 Composer 的环境变量 COMPOSER_IGNORE_PLATFORM_REQ 和 COMPOSER_IGNORE_PLATFORM_REQS 作者: Shine 时间: 2025-05-15 分类: PHP 评论 在 PHP 项目开发中,[Composer](https://getcomposer.org/) 是管理依赖的核心工具。它通过检查 PHP 环境(如版本和扩展)确保依赖兼容性。但有时我们需要在不符合平台要求的条件下安装依赖,这时环境变量 `COMPOSER_IGNORE_PLATFORM_REQ` 和 `COMPOSER_IGNORE_PLATFORM_REQS` 提供了解决方案。 ## 什么是 `COMPOSER_IGNORE_PLATFORM_REQ` 和 `COMPOSER_IGNORE_PLATFORM_REQS`? 这两个环境变量用于绕过 Composor 的平台要求检查,平台要求包括: - PHP 版本(如 `php: ^7.4`) - PHP 扩展(如 `ext-curl`、`ext-json`) - 其他系统级依赖 当环境不满足依赖要求时,Composer 会报错并阻止安装。两者的区别在于: - **`COMPOSER_IGNORE_PLATFORM_REQ`**:允许指定忽略特定的平台要求(如 `ext-curl` 或 `php`)。 - **`COMPOSER_IGNORE_PLATFORM_REQS`**:忽略所有平台要求,等效于命令行选项 `--ignore-platform-reqs`。 ## 为什么需要忽略平台要求? 常见场景包括: 1. **开发或测试**:本地或 CI/CD 环境的 PHP 版本或扩展与生产环境不同,但需安装依赖进行测试。 2. **临时绕过**:某些依赖在未满足官方要求的环境中仍可运行。 3. **遗留项目**:老项目依赖的包可能与新环境不完全兼容,但需继续维护。 ## 如何使用? ### 使用 `COMPOSER_IGNORE_PLATFORM_REQ` 通过环境变量指定要忽略的特定平台要求: ```bash COMPOSER_IGNORE_PLATFORM_REQ=ext-curl composer install ``` 忽略多个要求时,用逗号分隔: ```bash COMPOSER_IGNORE_PLATFORM_REQ=ext-curl,ext-json composer update ``` ### 使用 `COMPOSER_IGNORE_PLATFORM_REQS` 若需忽略所有平台要求,设置此变量(无需指定具体要求): ```bash COMPOSER_IGNORE_PLATFORM_REQS=1 composer install ``` 或者直接使用命令行选项: ```bash composer install --ignore-platform-reqs ``` ### 在类 Unix 平台持久化配置 在类 Unix 系统(如 Linux 或 macOS)中,可以将环境变量添加到 shell 配置文件(如 `.bashrc` 或 `.zshrc`)以持久化设置。步骤如下: 1. 打开终端,编辑配置文件(以 Zsh 为例): ```bash nano ~/.zshrc ``` 对于 Bash,编辑 `.bashrc`: ```bash nano ~/.bashrc ``` 2. 在文件末尾添加以下行,例如忽略 `ext-curl`: ```bash export COMPOSER_IGNORE_PLATFORM_REQ=ext-curl ``` 或忽略所有要求: ```bash export COMPOSER_IGNORE_PLATFORM_REQS=1 ``` 多个特定要求: ```bash export COMPOSER_IGNORE_PLATFORM_REQ=ext-curl,ext-json ``` 3. 保存并刷新 shell 配置: ```bash source ~/.zshrc ``` 或: ```bash source ~/.bashrc ``` 4. 验证设置: ```bash echo $COMPOSER_IGNORE_PLATFORM_REQ echo $COMPOSER_IGNORE_PLATFORM_REQS ``` 此后,Composer 命令将自动应用这些设置。 ### Windows 用户 在 Windows 命令行中,临时设置语法为: ```cmd set COMPOSER_IGNORE_PLATFORM_REQ=ext-curl && composer install set COMPOSER_IGNORE_PLATFORM_REQS=1 && composer install ``` ## 潜在风险 使用这两个变量需注意: 1. **运行时错误**:忽略要求可能导致依赖在运行时因缺少扩展或版本不兼容而失败。 2. **生产环境谨慎**:建议仅在开发或测试中使用,生产环境应满足依赖要求。 3. **调试复杂**:绕过检查可能增加问题排查难度。 ## 最佳实践 - **选择合适的变量**:若只需忽略特定要求,使用 `COMPOSER_IGNORE_PLATFORM_REQ`;若需忽略全部,使用 `COMPOSER_IGNORE_PLATFORM_REQS`。 - **记录原因**:在项目文档中说明忽略平台要求的理由,便于团队理解。 - **充分测试**:忽略要求后,彻底测试应用以确保依赖正常运行。 ## 总结 `COMPOSER_IGNORE_PLATFORM_REQ` 和 `COMPOSER_IGNORE_PLATFORM_REQS` 是 Composer 的强大工具,分别用于忽略特定或全部平台要求检查。在类 Unix 系统中,通过配置 `.bashrc` 或 `.zshrc`,可以持久化这些设置,提升开发效率。但需谨慎使用,确保测试充分并避免在生产环境中引入风险。合理运用这些变量,能让 PHP 依赖管理更加灵活。
composer 永久忽略安装包时提示依赖 xx 扩展 作者: Shine 时间: 2024-07-02 分类: PHP 评论 ## 问题 在本地开发时,如果使用 composer 安装 composer 包经常会遇到这种提示: ``` Your requirements could not be resolved to an installable set of packages. Problem 1 - Root composer.json requires php ^8.3 but your php version (8.2.9) does not satisfy that requirement. Problem 2 - Root composer.json requires PHP extension ext-posix * but it is missing from your system. Install or enable PHP's posix extension. Problem 3 - Root composer.json requires PHP extension ext-rdkafka * but it is missing from your system. Install or enable PHP's rdkafka extension. Problem 4 - hhxsv5/laravel-s is locked to version v3.8.0 and an update of this package was not requested. - hhxsv5/laravel-s v3.8.0 requires ext-pcntl * -> it is missing from your system. Install or enable PHP's pcntl extension. Problem 5 - laravel/horizon is locked to version v5.24.4 and an update of this package was not requested. - laravel/horizon v5.24.4 requires ext-pcntl * -> it is missing from your system. Install or enable PHP's pcntl extension. Problem 6 - laravel/pail is locked to version v1.1.3 and an update of this package was not requested. - laravel/pail v1.1.3 requires ext-pcntl * -> it is missing from your system. Install or enable PHP's pcntl extension. To enable extensions, verify that they are enabled in your .ini files: - C:\Users\Shine\.pvm\versions\php-8.2\php.ini You can also run `php --ini` in a terminal to see which files are used by PHP in CLI mode. Alternatively, you can run Composer with `--ignore-platform-req=ext-posix --ignore-platform-req=ext-rdkafka --ignore-platform-req=ext-pcntl` to temporarily ignore these required extensions. You can also try re-running composer require with an explicit version constraint, e.g. "composer require dcat/laravel-admin:*" to figure out if any version is installable, or "composer require dcat/laravel-admin:^2.1" if you know which you need. Installation failed, reverting ./composer.json and ./composer.lock to their original content. ```  实际上在本机开发过程中通常不需要用到这些依赖扩展,或者你是 Windows 作为开发环境,那么像 `posix`, `pcntl` 扩展在 Windows 上是安装不上的,所以我都会加上 `--ignore-platform-reqs` 选项,来跳过对这些扩展的检查,但是每次装 composer 包都要手打这个选项实在是太过繁琐,有没有直接替我加上这个选项的方法? ## 过程 通过查阅[Composer 官方文档](https://getcomposer.org/doc/03-cli.md#composer-ignore-platform-req-or-composer-ignore-platform-reqs "Composer 官方文档"),确实有这么一个方法,设置一个环境变量 `COMPOSER_IGNORE_PLATFORM_REQS=1` 即可解决 ## 结果 Windows 添加环境变量 1. 按下 `Win` + `R` 输入 `sysdm.cpl` 然后按 `Enter` 2. 选择“环境变量” 3. 新建环境变量 4. 输入变量名 `COMPOSER_IGNORE_PLATFORM_REQS` 5. 输入变量值 `1` 6. 确定 -> 确定 -> 确定 7. 完成 
php-cs-fix 只格式化已经修改的代码 / 只格式化某次提交的代码 作者: Shine 时间: 2023-09-21 分类: PHP 评论 ## 前提 注意需要在 `composer.json` 中的 `scripts:` 部分添加 `"cs-fix": "php-cs-fixer fix $1"`,如下示例 ```json { "name": "hyperf/hyperf-skeleton", "type": "project", // ... "autoload": { "psr-4": { "App\\": "app/" }, "files": [] }, "scripts": { // ...... "cs-fix": "php-cs-fixer fix $1", // ...... }, } ``` ## 命令 ### 只格式化已经修改的代码 ```shell git diff --name-only --cached | grep '\.php$' | xargs -n1 composer cs-fix ``` 1. `git diff --name-only --cached`:这部分命令用于获取你已经暂存(staged)的修改文件的列表。 2. `grep '\.php$'`:通过管道将文件列表传递给grep命令,这将只选择扩展名为 `.php` 的文件。 3. `xargs -n1 composer cs-fix`:xargs命令将每个文件名作为参数传递给 `composer cs-fix` 命令,从而格式化每个文件的代码。 ### 格式化某次提交的代码 ```shell git diff-tree --no-commit-id --name-only -r | grep '\.php$' | xargs -n1 composer cs-fix ``` 1. `git diff-tree --no-commit-id --name-only -r `:这部分命令获取了特定提交记录中的修改文件列表。 > **** 可以从 `git log` 获取 2. `grep '\.php$'`:通过管道将文件列表传递给 `grep` 命令,这将只选择扩展名为 `.php` 的文件。 3. `xargs -n1 composer cs-fix`:`xargs` 命令将每个文件名作为参数传递给 `composer cs-fix` 命令,从而格式化每个文件的代码。
Laravel 添加模型方法注释,使 PHPStorm 有语法提示 作者: Shine 时间: 2021-06-30 分类: Laravel,PHP 评论 ## 安装 1. 在 PHPStorm 上装 `Laravel` 插件  2. 在项目中添加 `barryvdh/laravel-ide-helper` 包 ```shell composer require barryvdh/laravel-ide-helper ``` ## 使用 1.为**所有模型**添加注释 ```shell php artisan ide-helper:models ``` 2.为**指定模型**添加注释 > 以下展示的是为 `App\Models\Admin` 模型添加注释,*\App\Models\Admin* 是模型的命名空间名字 ```shell php artisan ide-helper:models \App\Models\Admin ``` 3.为 Facades 生成注释 ```shell php artisan ide-helper:generate ``` 4.生成 PHPstorm Meta file ```shell php artisan ide-helper:meta ``` ## 运行为“模型添加注释”后的截图 
Linux 指定用户执行命令 / Composer 因权限问题导致无法执行 作者: Shine 时间: 2021-05-14 分类: Linux 评论 ## 背景 在网上查到的使用 `su 用户名 -c "命令"` 即可指定用户执行某些命令 但是运行结果是这样的 > This account is currently not available. ```log [root@izvkgq9z www.xxxx.com]# su www -c "composer install" This account is currently not available. ``` 原来设置了该用户不能用以登录 ``` [root@izvkgq9z www.xxxx.com]# cat /etc/passwd | grep www www:x:1000:1000::/home/www:/sbin/nologin ``` ## 解决办法 > 使用 `su 用户名 -s /bin/bash -c "需要执行的命令"` ``` su -s /bin/bash -c "composer install" www ``` --- > 以下是额外话题 ## composer 安装出现新的问题 执行 `composer install` 报了以下错误 ``` [RuntimeException] Could not delete /home/wwwroot/www.xxxx.com/vendor/kylekatarnls/update-helper/composer.json: Directive 'track_errors' is deprecated ``` 大概意思是不能删除文件,然后就想到了权限问题,然后看了下权限信息 ``` [root@izvkgq9z www.xxxx.com]# ll | grep vendor drwxr-xr-x 47 root root 4096 May 14 13:55 vendor ``` 猜测是项目自动构建之类的,权限没弄好,本应该是 `www` 权限的,这个简单了,使用 `chgrp` 和 `chown` 命令改一下 `vender` 目录及其子目录/文件 用户组和所有者 ``` # 更改用户组 chgrp www -R vendor # 更改所有者 chown www -R vendor ```