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

Composer php 如何将Git子模块与Composer加载的库一起使用?,composer-php,Composer Php,我有一个Zend Framework 2应用程序。它包含一些库代码,其中包含业务逻辑和一些其他实用程序,这些应用程序将在以后创建 我的目的是使用Composer在项目之间共享它。问题是,我如何正确地做到这一点并简化开发?我几乎肯定需要在其他项目中对库进行更改和添加 我尝试将vendor/stuff设置为包含所需包的git子模块,并在主composer.json中引用它,如下所示: “存储库”:[ { “类型”:“git”, “url”:“供应商/材料” } ], “要求”:{ “资料/图书馆”:

我有一个Zend Framework 2应用程序。它包含一些库代码,其中包含业务逻辑和一些其他实用程序,这些应用程序将在以后创建

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

我尝试将
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
    目录

  • 修复bug,然后通过git提交

  • 使用Composer本地存储库 实际上,我在开发项目及其需求时所采用的工作方式是使用Composer功能来显式地设置用于解决依赖关系的存储库。e、 g.如果您的代码位于:

    /projects/library/
    /projects/project/
    
    在项目的composer文件中添加存储库条目:

    "repositories": [
        {
            "type": "vcs",
            "url": "/projects/library/"
        }
    ]
    
    现在运行
    composer update
    将查看/projects/library/中的Git条目,以解析对库的依赖关系,而不是Packagist或其他存储库中列出的依赖关系

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

  • 提交它,使其具有Git条目

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

  • 但您可以避免将提交推送到外部存储库,这很好,因为这意味着您不会推送可能无法工作的代码,也意味着您可以脱机工作,因为Git提交不需要internet连接


    虽然这显然是最好的工作方式,但仍然有点危险,因为很容易意外地签入引用了本地目录的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日
    composer.json文件的验证已加强,文件中不再可能有
    “//”:“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