CI/CD中必须用composer install而非update,因update会重写composer.lock导致构建不可重现;install则严格按lock文件安装精确版本、顺序与嵌套关系,确保环境一致,并须配合--no-dev、--optimize-autoloader、--classmap-authoritative参数保障性能与安全。

CI/CD里没有“Composer自动发布”这回事——Composer本身不负责发布,它只管依赖安装和脚本执行;所谓“自动发布”,其实是用composer install作为构建环节的确定性基石,再配合CI平台触发部署动作(如推镜像、发包、调API)。
为什么不能在CI里跑composer update
这是最常踩的坑:一旦CI脚本里出现composer update,就会重写composer.lock,导致构建不可重现。昨天通过的流水线,今天可能因monolog/monolog从2.10.0升到2.10.1而失败——不是代码变了,是依赖图漂移了。
-
composer install读composer.lock,装完全一致的包版本和嵌套关系 -
composer update重新解析composer.json,触发版本重选、依赖图重建、lock文件覆盖 - CI必须校验
composer.lock是否已提交:没它,install直接报错退出 - 建议CI开头加
composer validate --strict,确保json和lock内容匹配
composer install必须带的三个生产参数
不加这些,autoload性能就是残缺的:PHP每次加载类都要遍历PSR-4映射、执行file_exists()试探,IO开销大,还容易因符号链接或大小写漏类。
-
--no-dev:排除require-dev里的包(如phpunit),避免体积膨胀和运行时class_exists('PHPUnit\Framework\TestCase')直接fatal -
--optimize-autoloader:把PSR-4映射编译成静态数组,跳过运行时目录扫描 -
--classmap-authoritative:告诉autoloader“不在classmap里的类,一律不存在”,彻底禁用文件系统探测
三者必须一起用。漏掉--classmap-authoritative,哪怕开了--optimize-autoloader,PHP仍会fallback试探;漏掉--no-dev,dev工具可能引入未审计的远程调用或调试后门。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
缓存该缓~/.composer/cache,不是vendor/
缓存vendor/是最常见也最危险的直觉错误:vendor/与PHP版本、扩展开关(如opcache.enable)、大小写敏感度强耦合,缓错版本会导致Cannot declare class或Class not found。
-
~/.composer/cache只存zip/dist包,跟环境无关,只跟composer.lock哈希绑定,复用安全 - GitHub Actions示例:
path: ~/.composer/cache,key里必须含${{ hashFiles('**/composer.lock') }} - GitLab CI中写
cache: paths: [~/.composer/cache],别写vendor/ - 缓存失效最常见原因:本地手动生成新
lock但没提交,导致key不匹配,CI每次走冷安装
CI中怎么安全拉私有包?
CI环境无法交互输入Token,但硬编码auth.json到仓库是严重安全风险。
- GitHub Actions:用
secrets.GITHUB_TOKEN注入,配合composer config github-oauth.github.com ${{ secrets.GITHUB_TOKEN }} - GitLab CI:用
CI_JOB_TOKEN配composer config gitlab-token.gitlab.com $CI_JOB_TOKEN - 通用做法:用
COMPOSER_AUTH环境变量传JSON字符串,格式为{"github-oauth": {"github.com": "xxx"}} - 切勿在CI脚本里
echo或cat凭证内容,防止日志泄露
真正难的不是命令怎么写,而是让composer install在各种PHP版本、扩展组合、内存限制下都稳定跑完——它对环境隐性要求极高,稍有不匹配就静默失败或卡住,这点最容易被忽略。

















