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 在 开发工具
651 每月下载量
64KB
1.5K SLoC
monoverse
简介
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 可以通过在项目根目录中定义配置文件进行配置。支持的文件格式是 json
、yaml
和 toml
。配置文件必须命名为 monoverse.{json,yaml,toml}
。
配置文件定义了属于 monorepo 的项目。每个项目由一个类型和一个路径定义。
项目
应用程序在配置文件的 projects
部分定义。
每个项目都由一个键值对表示,其中键是项目的名称,值是一个包含以下键的映射
键 | 描述 | 允许的值 |
---|---|---|
type |
项目的类型。 | rust 、node 、helm 、toml 、yaml |
path |
项目的路径。 | 相对于存储库根目录的任何有效目录路径。如果省略,则使用存储库根目录。 |
manifest_path |
项目清单文件的路径。 | 相对于项目根目录的任何有效文件路径。如果省略,则假定清单文件位于项目路径中。 |
tag_prefix |
标签创建的前缀。 | 创建新标签时将作为前缀的字符串。如果不需要前缀,可以设置为空字符串。默认为 <project-name>- 。 |
selector |
版本号的选择器。 | 选择器格式取决于项目的 type 。 |
dependents |
项目的依赖项。 | 在项目发布时应更新的依赖文件列表。有关更多信息,请参阅 项目依赖项 部分。 |
使用 selector
键的项目类型的选择器格式
项目类型 | 选择器格式 |
---|---|
toml |
TOML 文件中版本号的点分隔路径。例如:package.version |
yaml |
YAML 文件中版本号的点分隔路径。例如:package.version |
项目依赖项
项目也可以有依赖项。当你有一个被其他项目或存储库中的文件使用的项目时,这很有用。
当项目发布时,其依赖项将使用新版本号进行更新。依赖项在项目配置的 dependents
部分中定义。
依赖项设置可以包含以下键
键 | 描述 | 允许的值 |
---|---|---|
type |
依赖项的类型。 | regex 、toml |
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