不幸的是* Composer 不支持 Git 子模块,因为 Composer 的主要目的是提供类似的项目间依赖功能,尝试在 Composer 中复制子模块毫无意义。
我遇到了您要解决的相同问题,即在开发库的同时开发使用该库的应用程序。有几种方法可以仅使用 composer 来解决这个问题。
为库目录创建符号链接
这是最快和最肮脏的方式。只需执行 composer update 以在您的供应商目录中为库创建适当的目录,然后将其替换为包含库的目录中的符号链接。
显然这不是很好,因为您可能会不小心覆盖您可能通过运行 composer update 编辑过的代码。
使用 Composer 首选源选项
Composer 可以选择通过 Git 克隆 ( --prefer-src
) 下载源代码,而不是默认下载 zipball ( --prefer-dist
)。这允许您编辑供应商目录中的源代码,然后通过 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/"
}
]
Runningcomposer update
现在将查看 /projects/library/ 中的 Git 条目,以解决对库的任何依赖关系,优先于 Packagist 或其他存储库中列出的依赖关系。
这确实意味着当您想要测试库代码中的更改时,您需要:
提交它,以便它有一个 Git 条目。
在项目目录中运行 Composer update 以获取最新版本。
但是您避免了将提交推送到外部存储库,这很好,因为这意味着您不会推送可能无法工作的代码,这意味着您可以离线工作,因为 Git 提交不需要互联网连接。
尽管这显然是最好的工作方式,但它仍然有点危险,因为很容易意外签入包含本地目录引用的 composer.json 版本,这显然会破坏其他所有人的项目。
为了避免这种情况,我制作了几个小脚本,i)备份我真正的 composer.json 文件,ii)添加一些本地存储库,iii)运行composer update
iv)恢复真正的 composer.json 文件。
本地更新.sh
cp -f composer.json composer.json.bak
php composerLocal.php
composer update
cp -f composer.json.bak composer.json
作曲家Local.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);
?>
作曲家.local
"LOCALHACK",
"repositories": [
{
"type": "vcs",
"url": "/projects/library1"
},
{
"type": "vcs",
"url": "/projects/library2"
}
],
然后放置在您的项目文件"//": "LOCALHACK",
中的某个位置。composer.json
现在安全运行localupdate.sh
会针对本地存储库进行作曲家更新,而不会提交错误版本的 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,你不应该需要子模块。