如何配置Composer使Mercurial依赖以VCS仓库初始化并同步修改?
当然可以!针对你这种需要在Composer依赖里修改自研Mercurial仓库并同步回去的场景,有几个实用的方案,我来给你拆解一下:
方案一:用Composer的VCS仓库配置直接克隆Hg仓库
Composer原生支持从Mercurial仓库拉取依赖,只要你正确配置仓库地址,它就会完整克隆整个Hg仓库(而非无版本信息的压缩包)。这样你修改依赖代码后,直接在vendor/me/somelib目录里用Hg命令提交推送就行。
具体操作步骤:
- 在主应用的
composer.json中添加VCS仓库配置:
{ "repositories": [ { "type": "vcs", "url": "你的somelib Mercurial仓库地址" } ], "require": { "me/somelib": "dev-main" } }
这里的url替换成你somelib的实际Hg仓库地址,dev-main对应仓库的主分支(如果你的分支名是default,就改成dev-default)。
执行
composer update me/somelib,Composer会把整个Hg仓库克隆到vendor/me/somelib目录,此时这个目录就是完整的本地Hg仓库,包含所有版本历史。直接在
vendor/me/somelib里修改代码,之后用Hg命令提交推送:
cd vendor/me/somelib hg add . hg commit -m "修复somelib中的某个bug" hg push
方案二:用Path仓库进行本地开发(更高效)
如果你频繁需要本地修改somelib,这个方法会更省心——它会把本地的somelib目录直接映射到主应用的vendor目录,修改本地文件实时同步到主应用,而且本地的somelib本身就是Hg仓库,完全不影响你提交推送。
操作步骤:
- 假设你本地已经克隆了somelib的Hg仓库,比如在
../somelib目录,那么在主应用的composer.json里配置:
{ "repositories": [ { "type": "path", "url": "../somelib" } ], "require": { "me/somelib": "*" } }
这里的url是本地somelib仓库的相对路径,*表示匹配任意版本,也可以指定dev-main这类分支标识。
执行
composer update me/somelib,Composer会在vendor/me/somelib创建软链接(Windows下是 junction)指向本地的../somelib目录。你直接在本地的
../somelib目录修改代码,主应用会立即生效;修改完成后,直接在../somelib里用Hg提交推送即可,完全不用管vendor目录的内容。
注意事项
- 不管用哪种方法,都要确保
composer.json的require项优先使用你配置的仓库版本,而不是Packagist上的版本(如果有的话)。 - 如果你之前已经安装过该依赖,建议先删除
vendor/me/somelib目录和composer.lock文件,再重新执行composer update,确保正确拉取仓库。 - Hg分支在Composer里的版本标识规则是
dev-<分支名>,比如分支是feature/new-function,就用dev-feature/new-function。
内容的提问来源于stack exchange,提问作者Dinu

