marcosmarcolin/beberlei-composer-monorepo-plugin

1.0.0 2022-07-30 14:42 UTC

This package is auto-updated.

Last update: 2024-08-29 05:44:36 UTC


README

Note: this project is still experimental. Please provide feedback!

此插件为使用Composer包管理器时添加了对Monorepos的支持。它引入了一种可维护的方法来管理单个存储库中多个包的依赖项,同时不会失去为每个单独的包拥有显式依赖项的好处。

此插件管理的存储库包含两种类型的包

  1. 由单个全局 composer.json 定义的Composer包,其中所有外部依赖项位于存储库的根目录。
  2. 项目子文件夹中的许多monorepo包,每个包都有自己的 monorepo.json,一个简化的 composer.json 文件。

monorepos中的依赖项可以是列在 composer.json 中的第三方Composer包,或者是项目中的monorepo包。

此插件的构建步骤为每个具有访问显式指定依赖项的包生成autoloaders,使用 vendor/autoload.php 文件。

此插件在构建autoloads时执行以下步骤

  1. 它检测子目录中的 monorepo.json 文件(排除 vendor/),并将它们标记为包的根。
  2. 然后,它从本地安装的包中检索所有composer包。
  3. 最后,对于具有 monorepo.json 的每个包,它使用该包中定义的所有依赖项生成一个 vendor/autoload.php 文件,这些依赖项来自其他monorepo包或常规Composer包。

此插件从Google Blaze/Bazel 和Facebook Buck 中汲取灵感,它们实现了整个项目/公司的单一仓库。它是使用PHP和Composer进行单一仓库工作流程所缺失的部分。

更多关于Gregory Szorc博客上的推理细节

v0.12版本中的向后不兼容更改

在v0.12中,我们移除了 fiddler 脚本和构建PHAR存档的可能性。现在,此项目仅作为一等Composer插件,并且需要Composer v1.1+才能使用 composer monorepo: 命令。

必须将 fiddler.json 文件重命名为 monorepo.json

如果您不想在项目中破坏这一点,请使用v0.11.6或更低版本。

安装

使用以下命令将composer monorepo插件添加到您的根composer.json中

$ composer require beberlei/composer-monorepo-plugin

它将自动添加为Composer插件。

用法

每当Composer生成autoload文件(在安装、更新或dump-autoload期间)时,它将找到所有包含 monorepo.json 文件的子目录,并为它们生成子包autoloaders。

您可以通过调用以下命令仅对子包执行autoload生成步骤

$ composer monorepo:build

您在项目根目录中创建一个 composer.json 文件,并使用此单一来源的供应商库跨所有自己的包。

起初,这可能看起来与Composer方法背道而驰,但它极大地简化了大型项目的依赖项管理。通常,如果您每个包都使用一个composer.json,您会有大量的更新潮,在10-20个包中更新一些基本库,如“symfony/dependency-injection”,或者在所有地方都有大量过时的包和许多不同的版本。

然后,您的每个自己的包都包含一个使用几乎与Composer相同的语法的 monorepo.json

{
    "deps": [
        "components/Foo",
        "vendor/symfony/symfony"
    ],
    "autoload": {
        "psr-0": {"Foo\\": "src/"}
    }
}

然后在 composer.json 所在的根目录下运行 composer dump-autoload,该插件将检测所有包,通过模拟 composer dump-autoload 的行为,就像子目录中存在 composer.json 一样,为每个包生成一个自定义的自动加载器。

此插件将解决所有依赖关系(因为没有版本限制,因为它假设代码在单体仓库中具有正确的版本)。

deps 中的包名称是从项目根目录的相对目录名称,不是 Composer 包名称。

你可以在每个包中直接使用 require "vendor/autoload.php;,就像使用 Composer 一样。只包含来自 monorepo.json 的自动加载,这意味着所有依赖都必须明确指定。

配置模式 monorepo.json

对于你的单体仓库中的每个包,你必须添加一个 monorepo.json,它借鉴了 composer.json 格式。以下键是可用的:

  • autoload - 配置当前包类和文件的自动加载设置。
  • autoload-dev - 配置开发自动加载需求。目前 总是 进行评估。
  • deps - 使用相对于项目根目录的相对路径作为包名称,以数组形式配置所需的依赖关系(没有带版本的键值对)。
  • deps-dev - 配置所需的开发依赖关系。
  • replace - 配置包的替代品。

构建的 Git 集成

在单体仓库中,对于你想要知道哪些组件更改的每个 git 提交范围,你可以使用 git-changed? 命令进行测试。

composer monorepo:git-changed? components/foo $TRAVIS_COMMIT_RANGE
if [ $? -eq 0 ]; then ant build fi