jeichorn/composer-monorepo-plugin

安装次数: 96,499

依赖者: 0

建议者: 0

安全性: 0

星级: 0

关注者: 1

分支: 41

类型:composer-plugin

v0.12.6 2017-06-14 21:58 UTC

README

Build Status

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的包,它使用该包中定义的所有依赖(来自其他Monorepo包或常规Composer包)生成一个vendor/autoload.php文件。

此插件从Google Blaze/Bazel 和Facebook Buck 获得了灵感,它们实现了一个单一的大型仓库来处理整个项目/公司。这是使用PHP和Composer进行单一仓库工作流程所缺少的部分。

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

分支

这是原始版本 https://github.com/beberlei/composer-monorepo-plugin 的分支版本,因为它已不再活跃开发。

安装

将composer monorepo插件添加到您的根composer.json中

$ composer require jeichorn/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,此插件将检测所有包,并为每个包生成一个自定义的autoload器,就像子目录中存在composer.json一样模拟composer dump-autoload

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

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

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

配置模式 monorepo.json

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

  • autoload - 配置当前包类和文件的自动加载设置。
  • autoload-dev - 配置开发自动加载需求。当前 始终 进行评估。
  • deps - 使用相对路径到项目根目录的包名,以数组形式配置所需的依赖项(没有带有版本的键值对)。
  • deps-dev - 配置所需的开发依赖项
  • bin-deploy-method - symlink|copy,标准方法 symlink,将 vendor/bin 脚本作为符号链接部署到父 vendor/bin。这会破坏您想在子仓库中使用自动加载及其依赖的情况。复制将 bins 复制到子 vendor/bin 中,然后将其符号链接,以便标准脚本发现。

构建的 Git 集成

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

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