要强制 composer 对 path 仓库使用复制而非软链,需在项目根 composer.json 的 config 块中配置 "preferred-install": {"acme/my-package": "dist"},包名须与 require 完全一致,且必须执行 composer update acme/my-package 生效;"dist" 是唯一强制复制的值,composer install 不会重建链接。

composer.json 里怎么关掉 symlink 改用复制
Composer 的path 仓库默认在 Linux/macOS 下建软链,在 Windows 下常 fallback 为复制——但这个行为不可靠,尤其 CI 或权限受限环境。想**明确强制复制**,不能依赖系统默认,得主动干预。
关键点是:`"preferred-install"` 配置项只对特定包生效,且必须写在项目根 composer.json 的 config 块里:
必须写成这样:
{
"config": {
"preferred-install": {
"acme/my-package": "dist"
}
},
"repositories": [
{
"type": "path",
"url": "./packages/my-package"
}
],
"require": {
"acme/my-package": "dev-main"
}
}
注意:
-
"dist"是唯一能强制复制的值;"source"会倾向 Git 克隆(不适用于 path) - 键名
"acme/my-package"必须和require中的包名完全一致(大小写、vendor 名、斜杠) - 如果配了全局
preferred-install,项目级配置会覆盖它;但没配全局时,项目级配置就是唯一生效入口 - 改完后必须运行
composer update acme/my-package,composer install不会重建链接
为什么 config.preferred-install 有时不生效
常见现象:写了"preferred-install",但 ls -la vendor/acme/my-package 还是显示 -> 软链。
根本原因不是配置错,而是 **Composer 版本或平台限制**:
以下情况会导致 fallback 到 symlink,无视 preferred-install:
- Composer 2.2 以下版本对
path类型的preferred-install支持不完整 - Linux/macOS 下即使设了
"dist",若本地包目录有.git且 Composer 检测到可走 source 模式,仍可能忽略配置 - Windows 上未启用“开发者模式”时,symlink 创建失败,Composer 自动 fallback 为复制——这时你看到的是复制结果,但不是因为你配了
dist,而是因为 symlink 失败了
验证是否真走复制:
- Linux/macOS:
ls -la vendor/acme/my-package输出不应含->,而应是普通目录 - Windows:
dir vendor\acme\my-package不应显示“快捷方式”,而是正常子目录结构 - 修改本地包源码后,
vendor/下对应文件**不会同步更新**——这是复制生效的最直接证据
不想改 composer.json?用命令行临时指定
如果只是单次调试或 CI 场景,不想污染项目配置,可用命令行参数绕过:执行:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
composer update acme/my-package --prefer-dist
效果等同于临时设 "preferred-install": {"acme/my-package": "dist"},但只对本次命令生效。
注意:
-
--prefer-dist对所有包生效,不支持只针对某个包;若只想对本地 path 包生效,仍推荐写进config -
--prefer-source在 path 场景下无效,Composer 会静默忽略 - 该参数不影响
composer install,只作用于update和require
CI 环境下最稳的复制方案
CI(如 GitHub Actions、GitLab CI)通常禁用 symlink,但不能依赖这个“默认”。最可靠做法是组合两步:1. 显式关闭 symlink(防万一):
composer config --local --unset repositories.my-local-path.options.symlink
2. 强制 dist 安装:
composer update acme/my-package --prefer-dist
再加一层保险:确认 vendor/acme/my-package 是真实目录而非链接。CI 脚本里可以加校验:
[ -L "vendor/acme/my-package" ] && echo "ERROR: symlink detected" && exit 1真正容易被忽略的是:**
preferred-install 只在 update 时生效,且必须精确匹配包名——写错一个字符,就退回 symlink 行为,还不会报错。**










