Composer全局配置文件必须存放在用户主目录下的~/.composer/config.json(Linux/macOS)或%APPDATA%\Composer\config.json(Windows),而非项目根目录的composer.json;后者仅声明依赖与脚本,不控制Composer自身行为,且敏感信息写入其中会导致凭证泄露。

Composer 本地配置文件不能放项目目录里
全局配置(如镜像源、认证凭据)必须存放在 ~/.composer/config.json(Linux/macOS)或 %APPDATA%\Composer\config.json(Windows),而不是项目根目录下的 composer.json。后者只管依赖声明和脚本,不参与 Composer 自身行为控制。
常见错误是把 http-basic 凭据或私有仓库地址写进项目 composer.json 的 config 段——这会被 Git 提交,等于泄露凭证。正确做法是用 composer config -g http-basic.example.com user pass 写入全局配置,该操作会自动加密存储(Composer 2.x 默认启用)。
-
composer config --global --list是唯一可靠方式确认真实配置路径,别猜~/.composer/composer.json - 如果设置了
COMPOSER_HOME,它必须是绝对路径,且不能含~或$HOME,否则config -g可能静默失败 - 全局配置优先级低于项目级
composer.json中的config,但仅限于支持的字段(vendor-dir等运行时配置项除外)
PHP 运行时环境变量不等于 Composer 环境变量
你在 .env 里写的 API_KEY=xxx,对 composer install 命令本身完全无效。Composer 不读 .env,也不调用 vlucas/phpdotenv。它只继承 shell 启动时已有的 getenv() 值。
所以 “CI 报 missing required env” 的根本原因是:CI runner 执行 composer install 时,shell 环境里没设 APP_ENV,而你项目里某个 post-install-cmd 脚本又试图读它——这个脚本失败了,不是 Composer 失败。
使用ydata-profiling(前身为pandas-profiling)生成全面的数据质量报告,包含相关性分析、缺失值模式和基数检测。导出交互式HTML仪表板和JSON摘要。
- 想在 scripts 里用变量,得提前
export APP_ENV=prod再跑composer install - 不要在
post-install-cmd里写php -r "echo $_ENV['APP_ENV'];"——$_ENV默认为空,除非你显式putenv()或框架已加载 .env - 真正安全的做法:让
index.php或artisan这类入口负责加载.env,而不是把环境准备甩给 Composer 阶段
敏感信息绝不能出现在 composer.json 的 extra 或 scripts 里
extra 字段看起来像“配置区”,但它只是普通 JSON 数据,没有任何加密或权限控制。一旦提交到 Git,"extra": {"db_password": "123456"} 就等于明文泄露。
同理,scripts 是 shell 命令字符串,写 "deploy": "curl -H 'Authorization: Bearer $TOKEN' ..." 会导致 CI 日志、开发者本地执行记录、甚至 IDE 终端历史里都留下密钥痕迹。
- 正确传参方式:用
extra传非敏感标识,比如"app-env": "prod",再由 PHP 脚本根据该值去读系统级环境变量 - 生产环境应强制走系统注入:
docker run -e DB_PASSWORD=xxx app或 K8s Secret 挂载到/run/secrets/db_pass -
composer.json里只保留结构定义,敏感值必须 100% 排除在版本控制之外
vendor 目录外置 ≠ 配置文件外置
很多人混淆两件事:vendor-dir 是依赖安装路径,它由 COMPOSER_HOME/config.json 控制;而 .env 是应用运行时配置,它必须由 PHP 代码加载,跟 Composer 完全无关。
你可以在 /opt/shared-vendor 放所有包,但 .env 还得放在每个项目自己可控的位置(比如 /etc/myapp/.env),并在入口文件里显式传入路径:Dotenv\Dotenv::createImmutable('/etc/myapp')。
- 依赖路径外置解决的是磁盘复用和 CI 缓存问题,和配置安全无关
-
.env文件必须加进.gitignore,且不能放在vendor或public目录下——Web 服务器可能直接暴露它 - 最易忽略的一点:CLI 脚本运行时的
getcwd()往往不是项目根目录,所以Dotenv::createImmutable(__DIR__)比createImmutable()更可靠

















