#version #monorepo #yaml #cli-tool #file-path #file-format #cli

app monoverse

用于在单一代码库中管理版本号的命令行工具

7次发布

0.1.6 2024年5月23日
0.1.5 2024年3月28日
0.1.2 2024年2月28日
0.1.0 2024年1月29日

#436开发工具

Download history 117/week @ 2024-05-17 47/week @ 2024-05-24 1/week @ 2024-06-28

651 每月下载量

Apache-2.0

64KB
1.5K SLoC

monoverse

Crates.io Version Crates.io Total Downloads GitHub License

简介

Monoverse是一个使用CalVer版本控制方案的版本管理工具。它旨在与单一代码库一起使用,但也可以用于单个项目。

对于许多项目来说,它们实际上并不需要遵循语义版本控制。例如,如果你正在构建一个包含许多微服务的Web应用程序,你通常不会将其发布为库。相反,它们将作为具有各自生命周期的独立API部署。

CalVer是一个基于日历的简单版本控制方案。CalVer的monoverse实现遵循YY.MM.MICRO格式,其中YY是当前年份,MM是当前月份,MICRO是一个单调递增的数字,并在每月开始时重置为0

Ubuntu是一个使用(CalVer的变体)的项目的著名例子。只需记住,它并不是语义版本控制的替代品。如果你正在构建库,你可能应该坚持使用语义版本控制,因为从CalVer回退并不容易。

安装

Cargo

Monoverse是用Rust编写的,因此它目前需要安装Rust工具链。安装Rust最简单的方法是使用rustup

一旦安装了Rust,你可以通过运行以下命令来安装monoverse的最新发布版本:

cargo install monoverse

这将构建monoverse二进制文件并将其安装到你的~/.cargo/bin目录,之后你可以在任何地方使用它。

你也可以通过以下命令克隆仓库并自己构建二进制文件:

cargo install --path .

Docker

Monoverse 还可以用作 Docker 容器。该镜像可在 GitHub 容器注册库中找到。

docker pull ghcr.io/jannekem/monoverse:latest

您可以通过将容器挂载为卷到容器中的 /repo 目录来在本地存储库上运行容器。向 monoverse 命令添加适当的参数以运行所需的子命令。例如

docker run --rm -v /path/to/repository:/repo ghcr.io/jannekem/monoverse:latest release <project-name>

容器包含 git,这使得运行与存储库交互的自定义脚本成为可能。这在使用像 Tekton 这样的工具并将 Docker 容器作为构建步骤时,将 monoverse 集成到 CI/CD 流水线变得更加容易。

配置

Monoverse 可以通过在项目根目录中定义配置文件进行配置。支持的文件格式是 jsonyamltoml。配置文件必须命名为 monoverse.{json,yaml,toml}

配置文件定义了属于 monorepo 的项目。每个项目由一个类型和一个路径定义。

项目

应用程序在配置文件的 projects 部分定义。

每个项目都由一个键值对表示,其中键是项目的名称,值是一个包含以下键的映射

描述 允许的值
type 项目的类型。 rustnodehelmtomlyaml
path 项目的路径。 相对于存储库根目录的任何有效目录路径。如果省略,则使用存储库根目录。
manifest_path 项目清单文件的路径。 相对于项目根目录的任何有效文件路径。如果省略,则假定清单文件位于项目路径中。
tag_prefix 标签创建的前缀。 创建新标签时将作为前缀的字符串。如果不需要前缀,可以设置为空字符串。默认为 <project-name>-
selector 版本号的选择器。 选择器格式取决于项目的 type
dependents 项目的依赖项。 在项目发布时应更新的依赖文件列表。有关更多信息,请参阅 项目依赖项 部分。

使用 selector 键的项目类型的选择器格式

项目类型 选择器格式
toml TOML 文件中版本号的点分隔路径。例如:package.version
yaml YAML 文件中版本号的点分隔路径。例如:package.version

项目依赖项

项目也可以有依赖项。当你有一个被其他项目或存储库中的文件使用的项目时,这很有用。

当项目发布时,其依赖项将使用新版本号进行更新。依赖项在项目配置的 dependents 部分中定义。

依赖项设置可以包含以下键

描述 允许的值
type 依赖项的类型。 regextoml
path 依赖文件的路径。 相对于项目根目录的任何有效文件路径。
selector 在依赖文件中版本号的选择器。 依赖文件版本号的选择器。选择器的格式取决于依赖项的 类型
replace 用于替换选择器匹配的字符串。 用于替换选择器匹配的格式字符串。字符串的格式取决于依赖项的 类型

不同依赖项类型的选择器格式

依赖项类型 选择器格式
regex 匹配依赖文件中任何文本的正则表达式。请注意,您需要转义YAML/TOML解析器可能会解释的字符。例如:v\\d+\\.\\d+\\.\\d+
toml TOML文件中版本号的点分隔路径。例如:dependencies.server.version
yaml YAML文件中版本号的点分隔路径。例如:dependencies.server.version

不同依赖项类型的替换格式

依赖项类型 替换格式
regex 用于替换依赖文件中匹配文本的格式字符串。默认为新版本字符串。例如:v{{version}}
toml N/A
yaml N/A

替换字符串可以包含 {{version}} 占位符,当项目发布时,该占位符将被新版本号替换。

示例YAML配置

projects:
  server:
    type: rust
    path: server
    dependents:
      - type: regex
        path: client/package.json
        selector: "\"server\": \".?\\d+\\.\\d+\\.\\d+\""
        replace: '"server": "{{version}}"'
      - type: toml
        path: dependency.toml
        selector: dependencies.server.version
  client:
    type: node
    path: client
  nginx:
    type: helm
    path: apps/nginx
    manifest_path: apps/nginx/deployment/Chart.yaml

示例TOML配置

[projects.server]
type = "rust"
path = "server"

[[projects.server.dependents]]
type = "regex"
path = "client/package.json"
selector = "\"server\": \".?\\d+\\.\\d+\\.\\d+\""
replace = '"server": "{{version}}"'

[[projects.server.dependents]]
type = "toml"
path = "dependency.toml"
selector = "dependencies.server.version"

[projects.client]
type = "node"
path = "client"

[projects.nginx]
type = "helm"
path = "apps/nginx"
manifest_path = "apps/nginx/deployment/Chart.yaml"

使用

安装Monoverse并创建配置文件后,您可以使用它来管理您项目的版本号。

发布

通过运行 monoverse release 命令创建新版本

monoverse release <project>

其中 <project> 是配置文件中定义的项目键。

然后Monoverse将检查项目自上次发布以来是否已修改。如果有更改,它将根据其类型生成新版本号并更新项目的清单文件。您可以使用 --force 标志强制发布。

如果项目有依赖项,Monoverse还会更新依赖文件以包含新版本号。

清单文件必须没有任何未提交的更改,否则发布将失败。

以下也是可用的参数

  • -f--force:即使项目没有更改,也强制发布。
  • --commit:将更改提交到存储库。
  • --tag:在存储库中创建新的标签,需要 --commit。默认情况下,标签格式为 <project>-<version>。它可以通过配置配置文件中每个项目的 tag_prefix 键进行自定义。

下一步

您还可以通过运行 monoverse next 命令来获取下一个版本号,而无需实际更新项目的清单文件

monoverse next <project>

其中 <project> 是配置文件中定义的项目键。如果需要新发布,程序将打印下一个版本号到标准输出。

设置日志详细程度

默认情况下,Monoverse 只会将错误和警告打印到 stderr。您可以通过使用 -v--verbose 标志来增加日志的详细程度。这可能在调试时很有用。

如果您想抑制警告并只打印错误,可以使用 -q--quiet 标志。您也可以使用 -qq 标志来同时抑制警告和错误。

依赖项

~17–28MB
~487K SLoC