很遗憾,Composer不支持Git子模块,因为Composer的主要目的是提供类似于项目间依赖的功能,并且尝试在Composer中复制子模块将是毫无意义的。
我有和你一样的问题,即在开发使用库的应用程序的同时开发该库。有几种方法可以仅使用composer解决该问题。
为库目录创建符号链接
这是最快且最简单的方法。仅需要运行composer update命令,就可以在您的vendors目录中创建适当的库目录,然后将其替换为包含您的库的目录的符号链接。
显然,这并不好,因为您可能会通过运行composer update命令意外地覆盖您可能已经编辑过的代码。
使用Composer偏好源选项
Composer有通过Git克隆(--prefer-src
)下载源代码而不是下载zipball(--prefer-dist
)的选项,后者是默认设置。这使您可以在vendors目录中编辑源代码,然后通过Git提交它。
例如,假设您有一个需要symfony/yaml
等其他库的项目,并且您想要修复其中的错误。您可以执行以下操作:
composer update
- 这将下载项目的所有依赖项。
composer update symfony/yaml --prefer-source
- 这将仅更新vendors目录中symfony/yaml
目录。
修复错误,然后通过git提交它。
使用Composer本地存储库
我实际上在同时开发项目和其要求时使用的方法是,使用Composer明确设置要使用的存储库来解决依赖关系。例如,如果您的代码位于:
/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 update
iv)恢复真实的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
"LOCALHACK",
"repositories": [
{
"type": "vcs",
"url": "/projects/library1"
},
{
"type": "vcs",
"url": "/projects/library2"
}
],
然后在您项目的 composer.json
文件中的某处放置 "//": "LOCALHACK",
。现在运行 localupdate.sh
将会安全地针对本地存储库执行 composer update,而不会有任何提交错误版本的 composer.json 的机会。
使用 Git 自己克隆它
这是我现在的工作方式:
i) 在项目中更新 Composer
ii) 进入 vendors 目录并删除我要同时开发的库。
iii) 从要开发该库的 repo 克隆 Git 到相应的 vendors 目录。
Composer 理解 git repo,所以不会覆盖已经克隆的 git 目录(尽管它似乎对编辑库的 composer.json 有点困惑)。
自己进行 git clone,可以完全控制安装内容,并允许您从 Composer 不知道的 repo 或未标记版本中安装,而无需编辑项目中的 composer.json。
这是自己进行 git clone 的关键功能;通过不触及项目的 composer.json,它是完全安全的,没有可能检查到已修改为使用本地/定制 repo 的 composer.json。
composer.json 文件的验证已经变得更加严格,不再可能在文件中有 "//": "LOCALHACK"
条目。这是 Composer 团队不支持 Composer 项目版本控制的另一个原因,这很荒谬。
* 我实际上认为 Git 子模块是一种愚蠢、愚蠢、愚蠢的实现方法,以“解决”一种只会在路上造成更多问题的困难问题,所以 Composer 不支持它们比“不幸”更“幸运”。显然其他人确实使用它们,并且对它们感到满意,所以这只是我的观点,而如果您正在使用 Composer,就不应该需要子模块。
~/bin/composer
并将~/bin
包含在我的PATH中来解决这个问题。 - Corie Slate