beberlei / composer-monorepo-plugin
Requires
- composer-plugin-api: ^2.0
Requires (Dev)
- php: ^5.5|^7.0|^8.0
- composer/composer: ^2.0.7
- phake/phake: ^2.2|^3.0
- phpunit/phpunit: ^5|^6|^7|^8|^9
- dev-master
- v0.17.5
- v0.17.4
- v0.17.3
- v0.17.2
- v0.17.1
- v0.17
- v0.16.5
- v0.16.4
- v0.16.3
- v0.16.2
- v0.16.1
- v0.16
- v0.15
- v0.14
- v0.13
- v0.12.1
- v0.12
- v0.11.6
- v0.11.5
- v0.11.4
- v0.11.3
- v0.11.2
- v0.11.1
- v0.11
- v0.10.3
- v0.10.2
- v0.10.1
- v0.10
- v0.9
- v0.8.1
- v0.8
- v0.7
- v0.6
- v0.5
- v0.4
- v0.3
- v0.2
- v0.1
- dev-GH-70-installed
- dev-fsutil
- dev-Composer-Plugin
This package is auto-updated.
Last update: 2024-08-27 21:23:21 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博客上的推理细节
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。
您可以通过调用
$ 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