甜蜂 / composer-suite
生成原始 composer.json 的多个变体
Requires
- php: >=7.4
- composer-plugin-api: ^2.0
- ext-json: *
- sweetchuck/composer-suite-handler: ^1.0
- symfony/filesystem: ^4.4 || ^5.4 || ^6.0 || ^7.0
- symfony/finder: ^4.4 || ^5.0 || ^6.0 || ^7.0
Requires (Dev)
- codeception/codeception: ^4.0
- codeception/module-asserts: ^2.0
- codeception/module-cli: ^2.0
- codeception/module-filesystem: ^2.0
- composer/composer: ^2.0
- mikey179/vfsstream: ^1.6
- nuvoleweb/robo-config: 2.x-dev
- squizlabs/php_codesniffer: ^3.5
- stecman/symfony-console-completion: ^0.11
- sweetchuck/git-hooks: 2.x-dev
- sweetchuck/robo-git: 2.x-dev
- sweetchuck/robo-phpcs: 2.x-dev
- sweetchuck/robo-phpmd: 2.x-dev
- symfony/error-handler: ^5.0 || ^6.0 || ^7.0
README
生成原始 composer.json 的多个变体
- 您必须在 composer.json#/extra/composer-suite 中定义差异,以下为示例。
- 下一步是运行以下命令生成替代 composer.json 文件:
composer -vv suite:generate - 通过设置 COMPOSER 环境变量 激活其中一个替代 composer.json 文件。
export COMPOSER='composer.my-suite-01.json'composer update --lock
其他好处是,如果 composer.json 中有任何相对路径,例如在 #/repositories/FOO/url 或 #/extra 下的任何位置,那么这些路径也将与替代 composer.*.json 文件一起工作。
示例 composer.json - 多版本依赖
{
"require": {
"symfony/console": "^4.0 || ^5.0",
"symfony/process": "^4.0 || ^5.0"
},
"require-dev": {
"phpunit/phpunit": "^8.0"
},
"scripts": {
"test": "phpunit"
},
"extra": {
"composer-suite": {
"symfony4": {
"description": "Make sure Symfony 4.x will be used.",
"actions": [
{
"type": "replaceRecursive",
"config": {
"items": {
"require": {
"symfony/console": "^4.0",
"symfony/process": "^4.0"
}
}
}
}
]
},
"symfony5": {
"description": "Make sure Symfony 5.x will be used.",
"actions": [
{
"type": "replaceRecursive",
"config": {
"items": {
"require": {
"symfony/console": "^5.0",
"symfony/process": "^5.0"
}
}
}
}
]
}
}
}
}
运行: composer suite:generate
生成的文件
composer.symfony4.json
{
"require": {
"symfony/console": "^4.0",
"symfony/process": "^4.0"
},
"require-dev": {
"phpunit/phpunit": "^8.0"
},
"scripts": {
"test": "phpunit"
},
"extra": {}
}
composer.symfony5.json
{
"require": {
"symfony/console": "^5.0",
"symfony/process": "^5.0"
},
"require-dev": {
"phpunit/phpunit": "^8.0"
},
"scripts": {
"test": "phpunit"
},
"extra": {}
}
然后
unset COMPOSER composer update --lock composer suite:generate export COMPOSER='composer.symfony4.json' composer update composer run test export COMPOSER='composer.symfony5.json' composer update composer run test # Back to normal. unset COMPOSER composer update --lock
示例 composer.json - 本地开发
用例
某些第三方服务必须集成到框架中。
Composer 包
- RestAPI 客户端(类型:库)
- 框架的模块/插件(类型:库)
- 框架(类型:项目)
{
"type": "project",
"repositories": {},
"require": {
"my/module_01": "^1.0"
},
"require-dev": {
"sweetchuck/composer-suite": "^1.0"
},
"extra": {
"composer-suite": {
"local": {
"description": "Local development",
"actions": [
{
"type": "prepend",
"config": {
"parents": ["repositories"],
"items": {
"my/module_01": {
"type": "path",
"url": "../../my/module_01-1.x",
"options": {
"repo-path": {
"url": "https://github.com/my/module_01.git",
"branch": "1.x"
}
}
},
"my/restapi_client_01": {
"type": "path",
"url": "../../my/restapi_client_01-1.x",
"options": {
"repo-path": {
"url": "https://github.com/my/restapi_client_01.git",
"branch": "1.x"
}
}
}
}
}
},
{
"type": "replaceRecursive",
"config": {
"parents": ["require"],
"items": {
"my/module_01": "1.x-dev",
"my/restapi_client_01": "1.x-dev"
}
}
}
]
}
}
}
}
运行: composer suite:generate
生成的文件
composer.local.json
{
"type": "project",
"repositories": {
"my/module_01": {
"type": "path",
"url": "../../my/module_01-1.x",
"options": {
"repo-path": {
"url": "https://github.com/my/module_01.git",
"branch": "1.x"
}
}
},
"my/restapi_client_01": {
"type": "path",
"url": "../../my/restapi_client_01-1.x",
"options": {
"repo-path": {
"url": "https://github.com/my/restapi_client_01.git",
"branch": "1.x"
}
}
}
},
"require": {
"my/module_01": "1.x-dev",
"my/restapi_client_01": "1.x-dev"
},
"require-dev": {
"sweetchuck/composer-suite": "^1.0"
},
"extra": {}
}
然后
unset COMPOSER composer update --lock composer suite:generate cp ./composer.lock ./composer.local.lock export COMPOSER='composer.local.json' composer update --lock # You can work on both libraries (restapi_client_01 and module_01) on-the-fly. # Back to normal. unset COMPOSER composer update --lock
套件
您可以拥有任意多的套件。
如上例所示,套件可以在 composer.json#/extra/composer-suite 中定义,但套件定义也可以存储在外部文件中。
例如 ./.composer-suite/composer-suite.*.json。然后,是否将这些文件跟踪到 VCS 由您决定。
示例 ./.composer-suite/composer-suite.foo.json
{
"name": "foo",
"description": "My foo suite.",
"actions": []
}
键 name 是可选的。如果省略,则套件名称将从文件名中解析。
如果有两个套件具有相同的名称,则来自外部文件的套件具有最高优先级。
操作
您可以在 extra/composer-suite/<suite-id> 键下定义不同的数组操作。
操作有两个主要属性
- type (字符串) 操作的标识符。
- config (混合) 数据类型通常是数组,但取决于
type。
操作 - replaceRecursive
官方 PHP 文档: array_replace_recursive()
- parents: 数组
- items: 数组
{
"require": {
"a/b": "^1.0",
"symfony/console": "^4.0",
"symfony/process": "^4.0"
},
"extra": {
"composer-suite": {
"my-suite-01": {
"actions": {
"type": " replaceRecursive",
"config": {
"parents": [],
"items": {
"require": {
"symfony/console": "^5.0",
"symfony/process": "^5.0"
}
}
}
}
}
}
}
}
结果
{
"require": {
"a/b": "^1.0",
"symfony/console": "^5.0",
"symfony/process": "^5.0"
},
"extra": {}
}
操作 - unset
删除指定的元素。
- parents: 数组
{
"name": "a/b",
"foo": {
"bar": "delete me"
},
"extra": {
"composer-suite": {
"my-suite-01": {
"actions": {
"type": "unset",
"config": {
"parents": [
"foo",
"bar"
]
}
}
}
}
}
}
结果
{
"name": "a/b",
"foo": {},
"extra": {}
}
在 "config.parents" 数组中,最后一个项可以是数组
{
"name": "a/b",
"foo": {
"a": "delete me 1",
"b": "keep me",
"c": "delete me 2"
},
"extra": {
"composer-suite": {
"my-suite-01": {
"actions": {
"type": "unset",
"config": {
"parents": [
"foo",
[
"a",
"c"
]
]
}
}
}
}
}
}
结果
{
"name": "a/b",
"foo": {
"b": "keep me"
},
"extra": {}
}
操作 - prepend
在数组的开头添加新元素。
- parents: 数组
- items: 数组
{
"repositories": {
"old/p1": {}
},
"extra": {
"composer-suite": {
"local": {
"actions": [
{
"type": "prepend",
"config": {
"parents": [
"repositories"
],
"items": {
"new/p1": {},
"new/p2": {}
}
}
}
]
}
}
}
}
结果
{
"repositories": {
"new/p1": {},
"new/p2": {},
"old/p1": {}
},
"extra": {}
}
操作 - append
在数组的末尾添加新元素。
- parents: 数组
- items: 数组
操作 - insertBefore
插入一个或多个 "items"。 "parents" 中的最后一个项是参考点。
- parents: 数组
- items: 数组
操作 - insertAfter
插入一个或多个 "items"。 "parents" 中的最后一个项是参考点。
- parents: 数组
- items: 数组
命令
此 Composer 插件定义了以下命令
composer suite:listcomposer suite:generate
验证
您可以通过运行官方 COMPOSER='composer.json' composer validate 命令检查自动生成的文件状态。
如果其中一个自动生成的文件 存在且过时,则退出码将不是 0。
此命令不会报告关于缺少 composer.*.json 文件的问题。
链接
其他
"$(composer config bin-dir)/codecept" _completion --generate-hook --program codecept | source /dev/stdin