bronek89 / composer-monorepo-plugin
用于处理单一代码仓库的Composer插件。
Requires
- composer-plugin-api: ^1.0
Requires (Dev)
- php: ^5.5|^7.0
- composer/composer: ^1.1
- phake/phake: ^2.2
- phpunit/phpunit: ~4.8
README
Note: this project is still experimental. Please provide feedback!
此插件为使用Composer包管理器时添加了对单一代码仓库的支持。它引入了一种可维护的方法来管理单个仓库中多个包的依赖关系,同时不失去为每个单独的包明确指定依赖关系的优势。
使用此插件管理的仓库包含两种类型的包
- 由单个全局
composer.json
定义并由所有外部依赖项在仓库根目录定义的Composer包。 - 项目子文件夹中的许多单一代码仓库包,每个包都有自己的
monorepo.json
,一个简化的composer.json
文件。
单一代码仓库中的依赖关系可以是列在 composer.json
中的第三方Composer包,或者是在项目中包含的单一代码仓库包。
此插件的构建步骤为每个仅访问显式指定依赖关系的包生成带有 vendor/autoload.php
文件的自动加载器。
此插件在构建自动加载器时执行以下步骤
- 它检测子目录中的
monorepo.json
文件,排除vendor/
目录,并将它们标记为包的根。 - 然后它从本地安装的包中获取所有Composer包。
- 最后,对于具有
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