symplify/monorepo-builder

不仅用于构建Monorepo的Composer工具。

11.2.22 2024-08-23 03:19 UTC

This package is auto-updated.

Last update: 2024-08-23 03:19:24 UTC


README

Downloads total

你是否维护着包含更多包的Monorepo?

此包包含一些有用的工具,可以使构建更容易。.

安装

composer require symplify/monorepo-builder --dev

使用方法

1. 你是Monorepo的新手吗?

快速了解Monorepo的最佳方式是阅读博客文章《你所想了解的所有关于Monorepo的内容,但你害怕提问》(All You Always Wanted to Know About Monorepo)。我们还为您提供了一个简单的命令来简化这个过程

vendor/bin/monorepo-builder init

基本设置已完成!

2. 将本地 composer.json 合并到根文件

将配置的章节合并到根 composer.json 中,这样您就只需编辑特定包的 composer.json,让脚本来同步它。

Monorepo工作所需的章节将被合并

  • 'require'
  • 'require-dev'
  • 'autoload'
  • 'autoload-dev'
  • 'repositories'
  • 'extra'

要合并,请运行

vendor/bin/monorepo-builder merge

包的典型位置是 /packages。但如果你有不同的命名或额外的 /projects 目录呢?

use Symplify\MonorepoBuilder\ComposerJsonManipulator\ValueObject\ComposerJsonSection;
use Symplify\MonorepoBuilder\Config\MBConfig;
use Symplify\MonorepoBuilder\ValueObject\Option;

return static function (MBConfig $mbConfig): void {
    // where are the packages located?
    $mbConfig->packageDirectories([
        // default value
        __DIR__ . '/packages',
        // custom
        __DIR__ . '/projects',
    ]);

    // how to skip packages in loaded directories?
    $mbConfig->packageDirectoriesExcludes([__DIR__ . '/packages/secret-package']);

    // "merge" command related

    // what extra parts to add after merge?
    $mbConfig->dataToAppend([
        ComposerJsonSection::AUTOLOAD_DEV => [
            'psr-4' => [
                'Symplify\Tests\\' => 'tests',
            ],
        ],
        ComposerJsonSection::REQUIRE_DEV => [
            'phpstan/phpstan' => '^0.12',
        ],
    ]);

    $mbConfig->dataToRemove([
        ComposerJsonSection::REQUIRE => [
            // the line is removed by key, so version is irrelevant, thus *
            'phpunit/phpunit' => '*',
        ],
        ComposerJsonSection::REPOSITORIES => [
            // this will remove all repositories
            Option::REMOVE_COMPLETELY,
        ],
    ]);
};

3. 升级包之间的依赖关系

假设你发布了 symplify/symplify 4.0,并且你需要包依赖版本 ^4.0 以相互依赖

vendor/bin/monorepo-builder bump-interdependency "^4.0"

4. 保持同步包版本

在同步的Monorepo中,通常使用相同的包版本来防止错误和问题。因此,如果你的一个包使用 symfony/console 3.4,另一个使用 symfony/console 4.1,这将告诉你

vendor/bin/monorepo-builder validate

5. 保持包别名最新

即使已经发布了3.0版本,您也可以看到这一点

{
    "extra": {
        "branch-alias": {
            "dev-master": "2.0-dev"
        }
    }
}

不好。摆脱这项手动工作,并将此命令添加到您的发布工作流程中

vendor/bin/monorepo-builder package-alias

这将向每个包中的 composer.json 添加别名 3.1-dev

如果您更喜欢 3.1.x-dev 而不是默认的 3.1-dev,您可以进行配置

use Symplify\MonorepoBuilder\Config\MBConfig;

return static function (MBConfig $mbConfig): void {
    // default: "<major>.<minor>-dev"
    $mbConfig->packageAliasFormat('<major>.<minor>.x-dev');
};

6. 将目录拆分为Git仓库

多亏了GitHub Actions,设置从未如此简单。使用 symplify/github-action-monorepo-split

如何配置它?查看我们的本地设置.github/workflows/split_monorepo.yaml

发布流程

当您发布包的新版本时,您必须执行许多手动步骤

  • 升级相互依赖项,
  • 标记此版本,
  • 使用带标签的 git push
  • CHANGELOG.md 的标题 Unreleased 改为 v<version> - Y-m-d 格式
  • 将别名和相互依赖项升级到下一个版本别名

但如果你 忘记了一个或顺序错误,会发生什么?一切都会崩溃!

release 命令会确保您的安全

vendor/bin/monorepo-builder release v7.0

并将以下发布工作者添加到您的 monorepo-builder.php

use Symplify\MonorepoBuilder\Config\MBConfig;
use Symplify\MonorepoBuilder\Release\ReleaseWorker\AddTagToChangelogReleaseWorker;
use Symplify\MonorepoBuilder\Release\ReleaseWorker\PushNextDevReleaseWorker;
use Symplify\MonorepoBuilder\Release\ReleaseWorker\PushTagReleaseWorker;
use Symplify\MonorepoBuilder\Release\ReleaseWorker\SetCurrentMutualDependenciesReleaseWorker;
use Symplify\MonorepoBuilder\Release\ReleaseWorker\SetNextMutualDependenciesReleaseWorker;
use Symplify\MonorepoBuilder\Release\ReleaseWorker\TagVersionReleaseWorker;
use Symplify\MonorepoBuilder\Release\ReleaseWorker\UpdateBranchAliasReleaseWorker;
use Symplify\MonorepoBuilder\Release\ReleaseWorker\UpdateReplaceReleaseWorker;

return static function (MBConfig $mbConfig): void {
    // release workers - in order to execute
    $mbConfig->workers([
        UpdateReplaceReleaseWorker::class,
        SetCurrentMutualDependenciesReleaseWorker::class,
        AddTagToChangelogReleaseWorker::class,
        TagVersionReleaseWorker::class,
        PushTagReleaseWorker::class,
        SetNextMutualDependenciesReleaseWorker::class,
        UpdateBranchAliasReleaseWorker::class,
        PushNextDevReleaseWorker::class,
    ]);
};

这些 TagVersionReleaseWorkerPushTagReleaseWorker 默认启用。如果您想禁用这些默认工作者,可以使用以下代码。

return static function (MBConfig $mbConfig): void {
    $mbConfig->disableDefaultWorkers();
};

您还可以包含您自己的工作者。只需添加实现 ReleaseWorkerInterface 的服务即可。您害怕标记和推送吗?使用 --dry-run 仅查看描述

vendor/bin/monorepo-builder release 7.0 --dry-run

您想发布下一个补丁版本吗,例如当前的 v0.7.1 → 下一个 v0.7.2

vendor/bin/monorepo-builder release patch

您也可以使用 小版本大版本