Composer php 如何将Git子模块与Composer加载的库一起使用?
我有一个Zend Framework 2应用程序。它包含一些库代码,其中包含业务逻辑和一些其他实用程序,这些应用程序将在以后创建 我的目的是使用Composer在项目之间共享它。问题是,我如何正确地做到这一点并简化开发?我几乎肯定需要在其他项目中对库进行更改和添加 我尝试将Composer php 如何将Git子模块与Composer加载的库一起使用?,composer-php,Composer Php,我有一个Zend Framework 2应用程序。它包含一些库代码,其中包含业务逻辑和一些其他实用程序,这些应用程序将在以后创建 我的目的是使用Composer在项目之间共享它。问题是,我如何正确地做到这一点并简化开发?我几乎肯定需要在其他项目中对库进行更改和添加 我尝试将vendor/stuff设置为包含所需包的git子模块,并在主composer.json中引用它,如下所示: “存储库”:[ { “类型”:“git”, “url”:“供应商/材料” } ], “要求”:{ “资料/图书馆”:
vendor/stuff
设置为包含所需包的git子模块,并在主composer.json
中引用它,如下所示:
“存储库”:[
{
“类型”:“git”,
“url”:“供应商/材料”
}
],
“要求”:{
“资料/图书馆”:“大师”
},
Composer无法以这种方式加载它。它抱怨找不到包,可能是因为它忽略了URL是本地的和相对的。从技术上讲,它不需要;供应商/stuff文件夹是通过git子模块命令单独初始化的 不幸的是*Composer不支持Git子模块,因为Composer的主要目的是提供类似的项目间依赖功能,在Composer中复制子模块是没有意义的 我遇到了与您试图解决的问题相同的问题,即开发库的同时开发使用该库的应用程序。仅使用composer就有几种方法可以解决这个问题 为库目录创建符号链接 这是最快最肮脏的方法。只需执行composer更新,在供应商目录中为库创建适当的目录,然后将其替换为包含库的目录中的符号链接 显然,这并不好,因为您可能会意外地覆盖通过运行composer update编辑的代码 使用Composer首选源选项 Composer可以选择通过Git克隆下载源代码(
--首选src
),而不是下载zipball(--首选dist
),这是默认设置。这允许您在vendors目录中编辑源代码,然后通过Git提交
e、 g.假设您有一个项目,其中需要其他库symfony/yaml
,您希望修复其中的错误。你能做的是:
composer update
-这将下载项目的所有依赖项composer更新symfony/yaml——首选源代码
——现在只更新供应商目录中的symfony/yaml
目录/projects/library/
/projects/project/
在项目的composer文件中添加存储库条目:
"repositories": [
{
"type": "vcs",
"url": "/projects/library/"
}
]
现在运行composer update
将查看/projects/library/中的Git条目,以解析对库的依赖关系,而不是Packagist或其他存储库中列出的依赖关系
这意味着,当您想要测试库代码中的更改时,您需要:
虽然这显然是最好的工作方式,但仍然有点危险,因为很容易意外地签入引用了本地目录的composer.json版本,这显然会破坏其他所有人的项目 为了避免这种情况,我制作了几个小脚本,I)备份我的real composer.json文件,ii)添加一些本地存储库,iii)运行
composer update
iv)恢复real composer.json文件
localupdate.sh
composerLocal.php
然后将“//”:“LOCALHACK”
放在项目composer.json
文件中的某个位置。现在运行localupdate.sh
可以安全地对本地存储库执行composer更新,而不会提交错误版本的composer.json
用Git自己克隆就可以了
这就是我现在的工作方式:
i) 项目中的Composer更新
ii)进入供应商目录,同时删除我想要开发的库。
iii)从开发库的任何repo将Git克隆到相应的供应商目录中
Composer理解git repos,因此不会覆盖git克隆目录(尽管它似乎对编辑库的Composer.json有点困惑)
自己进行git克隆,可以完全控制安装内容,并允许您从composer不知道的repo或未标记的版本进行安装,而无需编辑项目中的composer.json
这是自己克隆git的关键特性;通过不接触项目的composer.json,它是完全安全的,不可能签入已修改为使用本地/自定义repos的composer.json
- 编辑日期:2014年9月6日
“//”:“LOCALHACK”
条目。这也是为什么作曲家没有为作曲家项目进行版本控制的另一个原因
*事实上,我认为Git子模块是一个愚蠢的、愚蠢的、愚蠢的实现,用一种只有
cp -f composer.json composer.json.bak
php composerLocal.php
composer update
cp -f composer.json.bak composer.json
<?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);
?>
"LOCALHACK",
"repositories": [
{
"type": "vcs",
"url": "/projects/library1"
},
{
"type": "vcs",
"url": "/projects/library2"
}
],
"repositories": [
{
"type": "vcs",
"url": "https://github.com/vendor_name/package_name.git"
}
],
composer require vendor_name/package_name --prefer-source
"require": {
"stuff/library_C": "master"
},
git submodule add -f https://github.com/stuff/library_C.git vendor/stuff/library_C