git subtree子项目必须在自身目录执行composer install并配置vendor-dir、--no-autoloader、--no-scripts,显式声明独立psr-4命名空间,且子项目.gitignore需强制提交以隔离vendor。

Git subtree 项目里直接 composer install 会把依赖装进主项目的 vendor/,导致类加载冲突、CI 构建失败、dump-autoload 扫描错乱——这不是 bug,是 Composer 本身没“作用域”概念,它只认当前目录或向上最近的 composer.json。
子项目执行 composer install 必须加 --no-autoloader --no-scripts
不加这两个参数,Composer 会尝试注册 autoload、执行 post-install-cmd 等钩子,而这些动作默认基于主项目上下文运行,极易触发主项目 autoload.php 的重写或脚本误执行。
- 必须在子项目目录(即
subtree目录)下执行,不是主项目根目录 -
--no-autoloader阻止生成vendor/autoload.php,避免覆盖主项目自动加载逻辑 -
--no-scripts跳过所有scripts段定义的命令,防止子项目脚本污染主项目构建流程 - 后续需手动运行
composer dump-autoload --working-dir=lib/my-subtree单独生成子项目 autoload
vendor-dir 必须显式配置为子项目专属路径
默认情况下,Composer 总把包装进离当前目录最近的 composer.json 所在位置的 vendor/。子项目若不干预,就会和主项目共用一个 vendor/ 目录,命名空间映射互相覆盖。
GitHub 项目更新追踪工具 - 自动检查多个 GitHub 项目的 Releases 和 CHANGELOG,生成更新摘要与影响分析报告。支持自动化定时任务。 如何使用 最简单的方式:直接用自然语言告诉我 你可以说 我会做 「检查 GitHub 更新」 检查最新版本 「添加 vscode」 追踪新项目 「停止追踪 xxx」 移除项目 「暂停更新检查」 暂停自动化 「给我看 openclaw 报告」 展示报告 触发词:「追踪项目更新」「检查 GitHub 更新」「项目更新报告」「设置更新提醒」
- 在子项目自己的
composer.json的config段写:"vendor-dir": "lib/my-subtree/vendor" - 路径必须唯一且不与主项目重叠,比如不能用
vendor或../vendor - 该配置仅对子项目生效;主项目
composer.json不需要、也不应该声明此字段 - 确认路径可写,尤其 CI 环境中要提前
mkdir -p lib/my-subtree/vendor
子项目 autoload 必须用 psr-4 显式声明,且绝不重叠主项目命名空间
如果子项目 autoload 写成 "App": "src/" 这种宽泛映射,或和主项目用了相同前缀(如都用 App\),composer dump-autoload 时会把两类类混在一起扫描,运行时报 Class not found 或加载了错误版本。
- 子项目
composer.json中只声明自身命名空间,例如:"MySubtree\": "src/" - 主项目
autoload和autoload-dev里,绝对不能包含子项目源码路径(如"src/subtree/") - 不要依赖 Composer 自动发现;禁用
"autoload": {"psr-4": {}}空配置,否则可能触发意外扫描 - 验证方式:
composer dump-autoload -d lib/my-subtree && grep MySubtree vendor/composer/autoload_psr4.php
.gitignore 放子项目根目录,内容仅 /vendor 并 git add -f
Git subtree push 会递归提交整个子目录,如果子项目 vendor/ 在其目录内且未被忽略,就会被一起推到上游仓库——这违反 “vendor 不进 Git” 原则,也导致历史膨胀、CI 反复拉取无效文件。
- 在子项目根目录(如
lib/my-subtree/.gitignore)新建文件,内容只有一行:/vendor - 开头加
/是关键,确保只匹配本级vendor/,不误伤其他同名目录 - 执行
git add -f lib/my-subtree/.gitignore,强制提交这个.gitignore - CI 中每次
composer install前,先运行git clean -xffd lib/my-subtree/vendor清残留
真正难的不是某一步操作,而是所有环节必须同时生效:vendor-dir 错位、autoload 命名空间重叠、.gitignore 没 git add -f、漏掉 --no-autoloader —— 任意一个失效,都会让整个隔离策略退化成“看似独立,实则耦合”。










