composer install 不接受版本参数,仅按 composer.lock 还原依赖;要安装指定版本,须先通过 composer require vendor/package:1.2.3 或手动写死 composer.json 中版本为 "1.2.3" 并执行 composer update 更新 lock 文件。

composer install 本身不接受版本参数
直接运行 composer install monolog/monolog:1.2.3 会报错或忽略冒号后内容——install 命令只读取 composer.lock,不解析版本号。它不是安装工具,而是还原工具。
想控制装哪个版本,关键不在 install,而在它依赖的两个文件:composer.json(声明意图)和 composer.lock(记录实际安装结果)。
-
composer install只按composer.lock中记录的版本、哈希、URL 还原,不管composer.json里写的约束符是^还是~ - 如果
composer.lock不存在,install会退化为update行为,触发依赖解析——这时才看composer.json的版本写法 - CI/CD 环境必须用
composer install,且确保composer.lock已提交到 Git;否则每次构建都可能拉到不同版本
怎么让 composer install 装上你想要的版本?
核心动作不是改命令,而是提前把目标版本写进 composer.lock。有三种可靠路径:
- 用
composer require vendor/package:1.2.3—— 这是最直接的方式:自动更新composer.json和composer.lock,然后install就能还原它 - 手动编辑
composer.json,把版本写成纯字符串(如"monolog/monolog": "1.2.3"),再运行composer update vendor/package触发 lock 文件重写 - 删掉
vendor/和composer.lock中对应包的条目,再跑一次composer install—— 它会重新解析composer.json并生成新 lock
注意:改完 composer.json 后别直接 composer install,除非你确定 composer.lock 里已有该版本记录;否则它可能跳过你的修改,继续装旧版。
使用ydata-profiling(前身为pandas-profiling)生成全面的数据质量报告,包含相关性分析、缺失值模式和基数检测。导出交互式HTML仪表板和JSON摘要。
composer.json 里版本写法的坑
写错一个符号,install 还原出来的就不是你要的版本。常见错误:
-
"monolog/monolog": "^1.2.3"→ 允许升级到1.99.99,不是锁死1.2.3 -
"monolog/monolog": "~1.2"→ 等价于>=1.2.0 ,仍会漂移 -
"monolog/monolog": "v1.2.3"→ 多数包不用v前缀,会找不到 -
"monolog/monolog": "1.2.3-RC1"→ 若项目minimum-stability是stable,需加--stability=RC才能写入 lock
真正锁死的写法只有不含运算符的纯数字:"monolog/monolog": "1.2.3"。但光这么写没用——必须确保 composer.lock 里也同步了这个值,且 source.type 是 dist,version 字段明确等于 "1.2.3"。
为什么装完发现还是 dev 分支?
你以为装了 2.1.0,结果 vendor/ 里是最新 commit,打开 composer.lock 一看:"source": {"type": "git", "url": "...", "reference": "a1b2c3..."} —— 这说明 Composer 把 2.1.0 当成了分支名 dev-2.1.0 解析了。
- 检查
composer.lock中该包条目:"version"字段是否为"2.1.0"(带引号),且"source.type"是"dist" -
"source.reference"应为空或短哈希(如"abc123"),**不是长 commit hash**;若是长 hash,基本就是拉了 dev 分支 - 临时解法:删
vendor/和composer.lock,再跑composer require vendor/package:"2.1.0"(加引号防 shell 解析)
最易被忽略的点:lock 文件没提交、CI 用了 composer update 而非 install、版本号写了 v 前缀或空格。这些都会让“指定版本”形同虚设。

















