【问题标题】:How to develop a dependent composer package without the need to commit or publish changes?如何在不需要提交或发布更改的情况下开发依赖的composer包?
【发布时间】:2014-11-29 06:13:54
【问题描述】:

我有一个应用程序 A,它有一个 composer.json 文件,它定义了对包 P 的依赖,这是我自己的新闪亮包。我的包 P 有一个 composer.json 文件,它定义了对库 L 和框架 F 的依赖关系。我的包 P 还没有远程存储库,它还没有在 packagist.org 上发布——我基本上是在修补它,尝试不同的东西通过在浏览器中运行应用程序 A 并不断修改我的包 P,应用程序 A 所依赖的包。

有些问题确实让我的工作流程变得复杂:

1) 只能使用本地存储库来定义 A 对 P 的依赖关系,如下所述:https://getcomposer.org/doc/05-repositories.md 问题是这迫使我必须先提交对 P 的所有更改在 A 上实际测试一下。

2) 参考 1) 这意味着我每次对 P 进行更改时都必须运行 composer update。(我一开始不想提交。)

3) 另一方面,当在 P 中使用本地存储库时,我无法定义 A 对 P 的真正依赖,这意味着运行 composer install不会安装P的composer.json文件中定义的依赖L和F。

因此,我认为有两种可能的工作流程:

1) 在 P 中提交更改,在 A 中 composer update 并查看更改效果如何。

2) 不要使用本地存储库作为依赖项,只需将 P 的 composer.json 文件中定义的依赖项复制 到 A 的 composer.json 文件中能够使用composer install 获取依赖关系L 和F。

基本上,我正在寻找一个工作流来开发一个新的 composer 包,我可以在其中运行 composer install/update 来安装所有 3rd 方依赖项,但无需在我自己的本地包中提交更改来测试更改。

上述问题有什么解决办法吗?

非常感谢!

【问题讨论】:

标签: php workflow composer-php dependency-management package-development


【解决方案1】:

当我需要同时处理多个包时,我使用的解决方案是在本地注册每个包并在composer install 或第一个composer update 之后从供应商处删除该包目录并将其符号链接到我存储本地“WIP”版本的位置。

例如:

  • 在 composer.json 中我需要 my_vendor/packageA,它在 ~/.composer/config.json 中本地注册。
  • 我执行composer update my_vendor/packageA 让作曲家知道我的新包。
  • composer 完成安装我的包后:
    • cd vendor/my_vendor && rm -rf packageA && ln -s ../../../packageA .

这会给我留下类似的东西:

  • 工作目录/
    • packageA/(这是我在 packageA 上工作的地方
    • 项目A/
      • 应用程序
      • 源代码
      • 供应商/
        • vendor1/
        • vendor2/
        • my_vendor/
          • packageA -> ../../../packageA

这让我:

  • 甚至从我的供应商目录中更改packageA
  • 我无需提交到packageA,就可以在projectA 中使用这些更改。

当 packageA 足够稳定时,符号链接将被删除,一切都会恢复正常,使用来自 VCS/packagist 的版本。

随着时间的推移,我尝试了不同的解决方案,我发现上述方法最适合我。

我可以使用的另一种解决方案是为每个前缀手动注册 PSR-0 目录:

<?php

$autoloader = require_once __DIR__.'/vendor/autoload.php';
$autoloader->add('MyVendor\\Dummy\\', '/path/to/dummy-component/src');

// now you can use MyVendor\Dummy as normal.

注意:对于 PSR-4,有 addPsr4() 方法。

【讨论】:

  • 非常感谢您的意见。据我所知,这似乎是一个有用的解决方案。从未将全局 config.json 用于作曲家,但这可能是/可能是我正在寻找的缺失链接。谢谢!
  • 但这仍然意味着您必须至少提交 packageA 中的 composer.json 文件才能运行composer update 所以它确实安装了依赖项,对吧?
  • @Thasmo 正确。您需要在 packageA 中提交 composer.json 以便安装该包。
  • 出于某种原因,我在淋浴时往​​往会记住一些事情。 @Thasmo:我用另一种方法更新了我的答案。也许你更喜欢那个。
猜你喜欢
  • 1970-01-01
  • 2010-12-30
  • 1970-01-01
  • 2011-10-08
  • 1970-01-01
  • 2013-02-19
  • 2015-01-04
  • 1970-01-01
相关资源
最近更新 更多