如何将 Git 子模块与 Composer 加载的库一起使用?

2024-03-21

我有一个 Zend Framework 2 应用程序。它包含一些包含业务逻辑的库代码和一些其他实用程序,这些代码对于稍后创建的其他应用程序来说是通用的。

我的目的是使用 Composer 跨项目共享它。问题是,我该如何正确地做到这一点并简化开发?我几乎肯定需要从其他项目中对库进行更改和添加。

我尝试设置vendor/stuff作为包含所需包的 git 子模块,并在主模块中引用它composer.json像这样(ref) http://marekkalnik.tumblr.com/post/22929686367/composer-installing-package-from-local-git-repository:

"repositories": [
    {
        "type": "git",
        "url": "vendor/stuff"
    }
],
"require": {
    "stuff/library": "master"
},

Composer 无法以这种方式加载它。它抱怨无法找到该包,大概是因为它忽略了 URL 既是本地的又是相对的这一事实。从技术上讲,它不需要; vendor/stuff 文件夹是通过 git 子模块命令单独初始化的。


不幸的是* Composer 不支持 Git 子模块,因为 Composer 的主要目标是提供类似的项目间依赖功能,尝试在 Composer 中复制子模块是毫无意义的。

我遇到了与您试图解决的相同问题,即开发一个库,同时开发使用该库的应用程序。有几种方法可以仅使用 Composer 来解决该问题。

为库目录创建符号链接

这是最快也是最肮脏的方法。只需执行作曲家更新即可在您的供应商目录中为库创建适当的目录,然后将其替换为包含库的目录中的符号链接。

显然这不太好,因为您可能会意外覆盖通过运行 Composer update 编辑过的代码。

使用 Composer 首选源选项

Composer 可以选择通过 Git 克隆下载源代码(--prefer-src)而不是下载 zipball(--prefer-dist) 这是默认值。这允许您编辑供应商目录中的源代码,然后通过 Git 提交。

例如假设您有一个需要其他库的项目symfony/yaml您想要修复其中的错误。您可以做的是:

  1. composer update- 这将下载项目的所有依赖项。

  2. composer update symfony/yaml --prefer-source- 现在将仅更新symfony/yaml目录位于供应商目录中。

  3. 修复bug,然后通过git提交。

使用 Composer 本地存储库

实际上,当我开发项目及其需求时,我的工作方式是使用 Composer 功能来显式设置存储库以用于解决依赖关系。例如如果您的代码位于:

/projects/library/
/projects/project/

在项目的 Composer 文件中添加存储库条目:

"repositories": [
    {
        "type": "vcs",
        "url": "/projects/library/"
    }
]

Running composer update现在将查看 /projects/library/ 中的 Git 条目,以解决对库的任何依赖关系,优先于 Packagist 或其他存储库中列出的依赖关系。

这确实意味着当您想要测试库代码中的更改时,您需要:

  1. 提交它,以便它有一个 Git 条目。

  2. 在项目目录中运行 Composer update 以获取最新版本。

但是您可以避免将提交推送到外部存储库,这很好,因为这意味着您不会推送可能不起作用的代码,并且意味着您可以离线工作,因为 Git 提交不需要互联网连接。


虽然这显然是最好的工作方式,但它仍然有点危险,因为很容易意外签入引用本地目录的composer.json版本,这显然会破坏其他人的项目。

为了避免这种情况,我制作了几个小脚本,i)备份我真正的composer.json文件,ii)添加一些本地存储库,iii​​)运行composer updateiv) 恢复真实的composer.json 文件。

本地更新.sh

cp -f composer.json composer.json.bak
php composerLocal.php
composer update
cp -f composer.json.bak composer.json

作曲家本地.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);

?>

本地作曲家

"LOCALHACK",

"repositories": [
    {
        "type": "vcs",
        "url": "/projects/library1"
    },
    {
        "type": "vcs",
        "url": "/projects/library2"
    }   
],

然后放置"//": "LOCALHACK",在你的项目中的某个地方composer.json文件。跑步localupdate.sh现在可以安全地对本地存储库进行 Composer 更新,而不会提交 Composer.json 的错误版本。

只需用 Git 自己克隆即可

这就是我现在的工作方式:

i) 项目中的 Composer 更新 ii)进入vendors目录并删除我想要同时开发的库。 iii) 从您正在开发库的任何存储库中进行 Git 克隆,将其克隆到相应的供应商目录中。

Composer 理解 git 存储库,因此不会覆盖 git 克隆的目录(尽管它似乎对编辑库的composer.json 感到有点困惑)。

自己进行 git 克隆,可以让您完全控制安装的内容,并允许您从composer不知道的存储库或未标记的版本进行安装,而无需编辑项目中的composer.json。

这是自己进行 git 克隆的关键特征;通过不接触项目的composer.json,它是完全安全的,不可能签入已修改为使用本地/自定义存储库的composer.json。

  • 编辑 - 2014 年 9 月 6 日

对composer.json 文件的验证已加强,并且不再可能有"//": "LOCALHACK"文件中的条目。这也是 Composer 人员没有为 Composer 项目进行版本控制的另一个原因。

* 实际上,我认为 Git 子模块是一种愚蠢、愚蠢、愚蠢的实现,它以一种只会导致更多问题的方式“解决”一个难题,因此 Composer 不支持它们比“不幸”更“幸运”。显然其他人确实使用它们,并且对它们感到满意,所以这只是我的意见,但如果你使用 Composer,你不应该需要子模块。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 Git 子模块与 Composer 加载的库一起使用? 的相关文章

随机推荐

  • 如何在Servlet中使用“应用程序”对象?

    如果我们正在编写 JSP 文件 则只需使用嵌入的 应用程序 对象 但如何在 Servlet 中使用它呢 The applicationJSP 中的对象称为ServletContext https docs oracle com javaee
  • 如何通过printf将正数打印为负数

    在阅读有关 printf 的内容时 我发现它可以通过以下代码 对于 根据用户的需要打印正数或负数 但是该代码不起作用并且输出是正值 请指出错误所在 谢谢 include
  • 获取给定 ISO 8601 日历年的周数

    我需要创建一个函数 根据 ISO 周系统 ISO8601 在 Swift 中计算给定年份的周数 我需要这个数字作为 Int 首先我想我需要做一个NSDate然后我意识到有时 12 月 31 日是下一年的第一周 例如 2014 年 12 月
  • “read”命令在一行中最多可以包含多少个字符

    我有以下 shell 脚本来从终端读取行 bin bash while read line do if z line then break fi echo line done 我无法输入超过 256 个字符 终端不允许我这样做 终端不会打印
  • 如何通过pyodbc备份数据库

    当使用 pyodbc 游标执行时 备份语句不能在事务中使用 pyodbc 似乎在默认事务内执行查询 我也尝试过使用自动提交模式或在备份语句之前添加提交语句 这两个都不起作用 can t execute the backup statemen
  • 位置 2 出现意外文字

    我在 html 页面上显示时遇到此错误 并且我以数组形式返回日期 如果我只想显示未来的月份和年份 那么应该做什么 现在我想返回整个日期 因此 html 上有错误ngmodel 中 p calendar 标签中的页面 其中我显示 date2
  • ckeditor“key”的使用 CKEDITOR.instances.editor.on('key', function (e){

    我意识到存在有关如何为 CKEDITOR 4 实现事件处理程序的问题 我可以使用此代码来获取按键按下数据 但我似乎无法在按键后获取数据 CKEDITOR instances editor on key function e document
  • Kotlin Android 扩展是否缓存合成属性或每次调用 findViewById() 时?

    如果我有一个简单的自定义视图 myitem xml
  • 检查 sys.argv[x] 是否已定义

    检查变量是否已传递给脚本的最佳方法是什么 try sys argv 1 except NameError startingpoint blah else startingpoint sys argv 1 检查长度sys argv if le
  • 如何使用 sf 更改国家之间共享边界的颜色?

    我想将共享颜色更改为不同的颜色 比如说红色 到目前为止 我正在绘制德国联邦州巴伐利亚并触及奥地利各州 我从以下位置获取数据https gadm org download country html https gadm org downloa
  • 尝试调用不存在的方法。超导系统

    当我运行 STS Spring Boot 应用程序时 出现以下错误 The attempt was made from the following location org apache catalina authenticator Aut
  • PITest 找不到测试

    我们的项目都是由整个公司的母公司设置的 对于我正在处理的项目 我们有一个根 pom 它引用该父级 并在其下面有许多模块 尝试单独将 PITest 与这些模块中的任何一个一起使用 或者在根模块上使用 都会导致不运行任何测试 lp server
  • 在 Notepad++ 中获取我自己的 PHP 函数的参数提示

    在 首选项 gt 备份 自动完成 中启用 输入时的函数参数提示 后 我获得了有关本机 PHP 函数的有用提示 如下所示 string false substr string str int start int length 是否有插件或其他
  • 音频会话服务: kAudioSessionProperty_OverrideAudioRoute 具有不同的输入和输出路由

    我正在摆弄音频会话服务 我正在尝试控制音频路由设置AudioSessionSetProperty kAudioSessionProperty OverrideAudioRoute as kAudioSessionOverrideAudioR
  • 在模型类中使用 java.awt.Point - 糟糕的编码风格?

    我有一个场景 对象在坐标系上移动 我考虑在我的模型类中使用 java awt Point 因为它提供了我需要的所有功能 位置表示 翻译 距离计算 但在我的模型中使用 java awt 类感觉有些错误 但重写相同的功能也不是答案 所以我的问题
  • MATLAB 中不使用 for 循环的多个数组的交集

    我总是被告知 在 MATLAB 中几乎所有的 for 循环都可以省略 而且它们通常会减慢进程 那么这里有办法做到这一点吗 我有一个元胞数组 tsCell tsCell存储不同长度的时间数组 我想为所有时间数组找到一个相交的时间数组 Inte
  • Twig 数组访问

    我正在尝试打印传递给树枝模板的变量的值 我正在使用这段代码 naziv 0 索引为 0 因为传递的数组只有一个元素 提到的代码会产生以下错误 具有键 title 的数组的键 0 不存在于 但是当我像这样使用 for 循环时 for key
  • Proguard (R8) 混淆自定义视图名称

    我在我的应用程序中使用 R8 并且有几个自定义视图 在 xml 布局中引用 但它们的名称根本没有混淆 有什么办法可以实现这一点吗 我正在使用标准 Gradle 规则 release minifyEnabled true shrinkReso
  • 常规语言的最小泵送长度

    如何计算正则语言的最小泵送长度 例如 如果我有 0001 则最小泵送长度应为 4 即 000 无法泵送 为什么会这样呢 它将小于或等于该语言的最小 DFA 中的状态数减一 因此 将正则表达式转换为 DFA 最小化它 并对状态进行计数 对于你
  • 如何将 Git 子模块与 Composer 加载的库一起使用?

    我有一个 Zend Framework 2 应用程序 它包含一些包含业务逻辑的库代码和一些其他实用程序 这些代码对于稍后创建的其他应用程序来说是通用的 我的目的是使用 Composer 跨项目共享它 问题是 我该如何正确地做到这一点并简化开