子项目 composer install 不能直接运行,因 Composer 会向上查找最近的 composer.json,导致依赖污染主项目 vendor/;须用 --no-autoloader --no-scripts、显式配置 "vendor-dir"、psr-4 命名空间隔离及子项目专属 .gitignore(需 git add -f 跟踪)来确保隔离。

子项目 composer install 为什么不能直接跑?
直接在 subtree 目录下执行 composer install,会污染主项目的 vendor/——Composer 根本不认“子树”,它只往上找最近的 composer.json,结果所有依赖全装进主项目 vendor/,版本错乱、类找不到、自动加载崩掉。
- 必须切断子项目对主项目
vendor/的感知:进子目录后加--no-autoloader --no-scripts,跳过 autoloader 注册和脚本执行 - 子项目
composer.json中要显式配置"vendor-dir": "lib/my-subtree/vendor",路径必须唯一、不与主项目重叠 - 别指望 Composer 自动发现子项目源码——
autoload必须用psr-4显式声明命名空间,比如"MySubtree\": "src/",绝不能写"App\"
子项目 vendor/ 怎么不被 git subtree push 带走?
git subtree push 默认递归提交整个子目录,如果 vendor/ 在 subtree 目录里,它就会被一起推到上游仓库——这违反“vendor/ 不进 Git”的铁律,还让历史体积暴涨、CI 构建变慢。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 在子项目根目录(即
path/to/subtree/)放一个.gitignore,内容只有/vendor(开头加/确保只匹配本级) - 运行
git add -f path/to/subtree/.gitignore,确保这个.gitignore被 Git 跟踪 - CI 流程中,在
git subtree push前加一步:git clean -xffd path/to/subtree/vendor,清掉可能残留的旧vendor/ - 别在主项目根目录的
.gitignore里写子项目vendor路径——它对 subtree 子目录无效
主项目和子项目 autoload 怎么互不干扰?
最典型的现象是:主项目里 new MySubtreeFoo() 能成功,但子项目自己的测试脚本却报 Class not found——说明 autoloader 加载链串了,不是没加载,而是加载顺序或范围错了。
- 主项目
composer.json的autoload或autoload-dev里,绝对不要包含子项目源码路径(比如别写"MySubtree\": "lib/my-subtree/src/") - 子项目
autoload的命名空间前缀必须和主项目物理隔离,例如用"MySubtree\"或"Acme\Payment\",而非复用"App\"或"App\Sub\" - 子项目测试时,应进入其目录单独执行
composer dump-autoload,生成专属 autoloader;主项目运行时靠require 'vendor/autoload.php'加载的是主项目 autoloader,不带子项目逻辑
CI 中怎么安全执行子项目依赖安装?
CI 环境容易卡着旧 vendor/ 不清理,或者误用主项目上下文执行命令,导致构建不可重现、本地能跑线上挂。
- CI 脚本里先
cd path/to/subtree,再执行composer install --no-autoloader --no-scripts - 确保子项目
composer.json已声明"vendor-dir",且该路径不在 Git 跟踪范围内(靠前面的.gitignore控制) - 避免在 CI 中运行
composer dump-autoload全局命令——它会扫描整个主项目目录,把子项目类也扫进去,破坏隔离 - 如果子项目需要运行测试,建议用独立容器或临时目录拉取子项目代码,而不是在主项目 workspace 里就地操作
.gitignore 必须被 git add -f 显式加入,否则它根本不起作用。

















