不幸的是* Composer 不支持 Git 子模块,因为 Composer 的主要目的是提供类似的项目间依赖功能,尝试在 Composer 中复制子模块毫无意义。
我遇到了您正在尝试解决的相同问题,即在开发库的同时开发使用该库的应用程序。有几种方法可以仅使用 composer 来解决这个问题。
为库目录创建符号链接
这是最快最脏的方法。只需进行 composer update 以在您的供应商目录中为库创建适当的目录,然后将其替换为包含您的库的目录中的符号链接。
显然这不是很好,因为您可能会意外覆盖您可能通过运行 composer update 编辑过的代码。
使用 Composer 首选源选项
Composer 可以选择通过 Git 克隆 (--prefer-src) 下载源代码,而不是默认下载 zipball (--prefer-dist)。这允许您在 vendor 目录中编辑源代码,然后通过 Git 提交。
例如假设您的项目需要在其他库 symfony/yaml 中修复错误。您可以做的是:
composer update - 这将下载项目的所有依赖项。
composer update symfony/yaml --prefer-source - 现在将仅更新供应商目录中的 symfony/yaml 目录。
修复bug,然后通过git提交。
使用 Composer 本地存储库
我在开发项目时——实际上——过去的工作方式是使用 Composers 的能力来显式设置用于解决依赖关系的存储库。例如如果您的代码在:
/projects/library/
/projects/project/
在项目的 composer 文件中添加存储库条目:
"repositories": [
{
"type": "vcs",
"url": "/projects/library/"
}
]
运行 composer update 现在将查看 /projects/library/ 中的 Git 条目,以优先解决对库的任何依赖项,而不是 Packagist 或其他存储库中列出的那些。
这确实意味着当您想要测试库代码中的更改时,您需要:
提交它,使其有一个 Git 条目。
在项目目录中运行 Composer update 以获取最新版本。
但是您避免了将提交推送到外部存储库,这很好,因为这意味着您不会推送可能无法工作的代码,这意味着您可以离线工作,因为 Git 提交不需要互联网连接.
虽然这显然是最好的工作方式,但它仍然有点危险,因为很容易意外签入包含本地目录引用的 composer.json 版本,这显然会破坏其他所有人的项目.
为了避免这种情况,我制作了几个小脚本,i) 备份我真正的 composer.json 文件,ii) 添加一些本地存储库,iii) 运行 composer updateiv) 恢复真正的 composer.json 文件。
localupdate.sh
cp -f composer.json composer.json.bak
php composerLocal.php
composer update
cp -f composer.json.bak composer.json
composerLocal.php
<?php
$srcFile = file_get_contents("composer.json");
$hackFile = file_get_contents("composer.local");
$finalString = str_replace('"LOCALHACK",', $hackFile, $srcFile);
file_put_contents("composer.json", $finalString);
?>
composer.local
"LOCALHACK",
"repositories": [
{
"type": "vcs",
"url": "/projects/library1"
},
{
"type": "vcs",
"url": "/projects/library2"
}
],
然后将"//": "LOCALHACK", 放置在您的项目composer.json 文件中的某个位置。运行 localupdate.sh 现在可以安全地针对本地存储库执行 composer 更新,而不会提交错误版本的 composer.json。
用 Git 自己克隆它
这就是我现在的工作方式:
i) 项目中的 Composer 更新
ii) 进入 vendor 目录并删除我想要同时开发的库。
iii) 从您正在开发库的任何存储库中将 Git 克隆到相应的供应商目录中。
Composer 理解 git repos,因此不会覆盖 git 克隆的目录(尽管它似乎对编辑库的 composer.json 感到有些困惑)。
自己进行 git clone,让您可以完全控制安装的内容,并允许您从 composer 不知道的 repo 或未标记的版本进行安装,而无需在项目中编辑 composer.json .
这是自己进行 git clone 的关键特性;通过不接触项目的 composer.json,它是完全安全的,不可能签入已修改为使用本地/自定义 repos 的 composer.json。
composer.json 文件的验证已加强,文件中不再可能有 "//": "LOCALHACK" 条目。这也是 Composer 人员没有为 Composer 项目进行版本控制的另一个原因。
* 我实际上认为 Git 子模块是一个愚蠢的、愚蠢的、愚蠢的实现,它以一种只会导致更多问题的方式“解决”一个难题,因此 Composer 不支持它们比“幸运”得多不幸的'。显然其他人确实使用它们,并且对它们感到满意,所以这只是我的意见,伙计,但如果你使用 Composer,你不应该需要子模块。