8 个版本 (稳定版)

1.0.5 2022 年 11 月 18 日
1.0.4 2022 年 3 月 19 日
0.1.1 2021 年 9 月 4 日

#1174开发工具

无许可证

43KB
873

版本标记工具(Rust 版本)

coverage Crates.io Docs.rs

Rust 包和命令行工具,用于更新任何类型项目的版本信息。

  • 定义需要更新的文件
  • 三种操作类型;就地更新、创建或复制到现有文件
  • 使用正则表达式在现有文件中查找和替换内容
  • 除了版本号外,还可以存储和插入其他信息,如版权等。
  • 完全自定义您希望对项目进行的版本更新操作类型
  • 支持您希望使用的任何类型版本控制方案

概述

发布新项目通常涉及以下步骤

  • 更新 package.jsonCargo.toml 以及任何源代码文件中的版本号
  • 创建带有版本号的 Git 标签
  • 构建并确保所有测试通过
  • 将更改推送到云端源代码库,例如 GitHub、GitLab 等。
  • 将新铸造并标记的包发布到云端包仓库。

使用此工具可以简化上述所有步骤。

要使用此工具为您的项目,只需

  1. 在项目根目录放置一个 version.json5 文件,其中
    • 描述了项目中包含版本号的文件
    • 在每个文件上执行哪种三种操作(更新、写入或复制到)
    • 您希望执行的版本更新操作类型(《code>incrMajorincrMinor 等)
  2. stampver 作为项目发布脚本的组成部分运行

一旦开始使用 stampver,您将能够从其他项目复制 version.json5 文件,并稍作调整以快速设置。

命令行

命令行工具 stampver 使用 cli 功能标志包含在此包中,该标志默认已安装。

USAGE:
    stampver [OPTIONS] [OPERATION]

ARGS:
    <OPERATION>    The versioning operation to perform

OPTIONS:
    -h, --help                  Print help information
    -i, --input <INPUT_FILE>    Specify the version file explicitly
    -u, --update                Actually do the update
    -V, --version               Print version information

此工具将描述它在每个文件上执行的操作,以便您可以检查它是否按预期执行。

表达式

此软件包使用evalexpr提供自定义不同计算和操作的能力。所有函数都如evalexpr中所述可用,除了 regex函数。 stampver添加以下变量/函数:

标识符 参数数量 参数类型 描述
now::year 0 当前的UTC年
now::month 0 当前的UTC月
now::day 0 当前UTC月中的日
if 3 布尔值/任何/任何 如果表达式atrue,则返回b的值,否则返回c的值

stampver使用Regex crate进行正则表达式。您可以使用惊人的Regex101网站开发并测试您自己的正则表达式。使用与Regex crate最兼容的正则表达式变体PCRE2。

架构文件格式

以下是带有注释的架构文件格式:

{
  vars: {
    major: 3,
    minor: 0,
    patch: 0,
    build: 20210902,
    revision: 0,
    sequence: 6,
    buildType: "test",
    debug: true,
  },
  calcVars: {
    nextBuild: "now::year * 10000 + now::month * 100 + now::day",
    nextSequence: "sequence + 1",
  },
  operations: {
    incrMajor: "major += 1; minor = 0; patch = 0; revision = 0; build = nextBuild",
    incrMinor: "minor += 1; patch = 0; revision = 0; build = nextBuild",
    incrPatch: "patch += 1; revision = 0; build = nextBuild",
    incrRevision: "revision += 1; build = nextBuild",
    incrSequence: "sequence += 1",
    setBetaBuild: 'buildType = "beta"',
    setProdBuild: 'buildType = "prod"',
  },
  targets: [
    {
      description: "JavaScript Files",
      files: ["src/version.js"],
      updates: [
        {
          search: '^(?P<begin>\\s*export\\s*const\\s*version\\s*=\\s*")\\d+\\.\\d+\\.\\d+(?P<end>";?)$',
          replace: 'begin + str::from(major) + "." + str::from(minor) + "." + str::from(patch) + end',
        },
        {
          search: '^(?P<begin>\\s*export\\s*const\\s*fullVersion\\s*=\\s*")\\d+\\.\\d+\\.\\d+\\+\\d+\\.\\d+(?P<end>";?)$',
          replace: 'begin + str::from(major) + "." + str::from(minor) + "." + str::from(patch) + "+" + str::from(build) + "." + str::from(revision) + end',
        },
      ],
    },
    {
      description: "Git Version Tag",
      files: ["scratch/version.tag.txt"],
      write: 'str::from(major) + "." + str::from(minor) + "." + str::from(patch)',
    },
    {
      description: "iOS PList",
      files: ["some-file.plist"],
      copyFrom: '"src/some-file" + if(buildType == "test", "-test", "-prod") + ".plist"',
    },
  ],
}

由于该格式是JSON5,并且是JSON的超集,因此您可以自由使用注释。建议使用Prettier或等效工具。这不仅是为了保持文件格式良好,而且因为stampver需要更新文件,如果格式与上述格式差异太大,它可能会感到困惑。

主要有以下4个部分:

vars

这是版本信息所在的位置,因此实际上它是您项目的简单版本信息数据库。这也是唯一一个在更新版本信息时由工具重写的部分。它这样做是为了保留注释,但工具确实期望布局与上面的示例相似。

calcVars

这些是需要每次工具运行时生成的任何变量。这可能包括基于日期的build号或nextSequence号等。此部分中的值与vars中的值合并,因此请注意命名冲突。

operations

这些是您项目的不同版本操作。例如,incrMajorincrMinorincrPatch是典型操作,但您可以添加适合您项目的任何操作。

targets

targets是一个包含一个description、一个要更新的files数组以及一个动作的对象数组。动作必须是以下之一:

  • updates - 一个包含{ search: , replace: }对象的数组。其中search是一个正则表达式。它可以包含最多两个可选捕获组,必须称为beginend。这些可以在replace替换字符串中使用。
  • write - 将内容写入目标文件。内容是一个表达式。
  • copyFrom - 从另一个文件复制文件,相对于version.json5文件的位置。其他文件的名称是一个表达式。

许可

本软件包遵循Unlicense许可协议的条款。有关详细信息,请参阅UNLICENSE文件。

依赖项

~8–17MB
~213K SLoC