jeichorn / composer-monorepo-plugin
Requires
- composer-plugin-api: ^1.0
Requires (Dev)
- php: ^7.0
- composer/composer: ^1.1
- phake/phake: ^2.3
- phpunit/phpunit: ^5.5
This package is auto-updated.
Last update: 2024-09-27 14:05:18 UTC
README
Note: this project is still experimental. Please provide feedback!
此插件在Composer包管理器使用时添加了对Monorepos的支持。它引入了一种可维护的方法来管理单个仓库中多个包的依赖关系,同时不失去为每个单独包有显式依赖关系的优势。
使用此插件管理的仓库包含两种类型的包
- 通过单个全局的
composer.json
定义的Composer包,所有外部依赖都位于仓库的根目录。 - 项目子文件夹中的许多Monorepo包,每个包都有一个自己的
monorepo.json
,这是一个简化的composer.json
文件。
Monorepos中的依赖可以是列在composer.json
中的第三方Composer包,也可以是项目中的Monorepo包。
此插件的构建步骤为每个只有显式指定依赖关系的包生成autoloaders,对应到vendor/autoload.php
文件。
此插件在构建autoloads时执行以下步骤
- 它检测子目录中的
monorepo.json
文件,排除vendor/
,并将它们标记为包的根。 - 然后它从本地安装的包中检索所有Composer包。
- 最后,对于每个具有
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