bronek89 / composer-monorepo-plugin

用于处理单一代码仓库的Composer插件。

安装次数: 2,416

依赖者: 0

推荐者: 0

安全: 0

星标: 0

关注者: 2

分支: 41

类型:composer-plugin

v0.13 2017-02-20 19:51 UTC

README

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

此插件为使用Composer包管理器时添加了对单一代码仓库的支持。它引入了一种可维护的方法来管理单个仓库中多个包的依赖关系,同时不失去为每个单独的包明确指定依赖关系的优势。

使用此插件管理的仓库包含两种类型的包

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

单一代码仓库中的依赖关系可以是列在 composer.json 中的第三方Composer包,或者是在项目中包含的单一代码仓库包。

此插件的构建步骤为每个仅访问显式指定依赖关系的包生成带有 vendor/autoload.php 文件的自动加载器。

此插件在构建自动加载器时执行以下步骤

  1. 它检测子目录中的 monorepo.json 文件,排除 vendor/ 目录,并将它们标记为包的根。
  2. 然后它从本地安装的包中获取所有Composer包。
  3. 最后,对于具有 monorepo.json 的每个包,它使用该包中定义的所有依赖关系(无论是其他单一代码仓库包还是常规Composer包)生成一个 vendor/autoload.php 文件。

此插件从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单一代码仓库插件添加到您的根 composer.json 中

$ composer require beberlei/composer-monorepo-plugin

它将自动添加为Composer插件。

用法

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

您可以调用以下命令来仅针对子包执行自动加载生成步骤

$ 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.json的情况来为每个包生成一个自定义的自动加载器。

此插件将解析所有依赖项(因为没有版本约束,因为它假定代码以正确的版本存在于单体存储库中)。

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

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

配置模式 monorepo.json

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

  • autoload - 配置当前包类和文件的自动加载设置。
  • autoload-dev - 配置开发自动加载需求。目前始终评估。
  • deps - 使用相对于项目根目录的相对路径作为包名称,配置数组中的所需依赖项(没有带版本的键值对)。
  • deps-dev - 配置所需的开发依赖项

构建的Git集成

在单体存储库中,对于您想要知道其中哪些组件已更改的每个git提交范围,您可以测试git-changed?命令。

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