比较软件包的版本

优质
小牛编辑
124浏览
2023-12-01

软件包的版本号是个奇怪的东西。它们看起来像十进制的数字,但它们不是。 例如,一个版本号通常的形式为 2.6.4。如果你需要比较两个版本号, 不能做简单的字符串比较,因为 2.6.4 会比 2.6.12 大;也不能进行数字比较, 因为它们不是有效地数字。

Puppet 的 versioncmp 函数会帮我们解决这个问题。 若你给它传递两个版本号,它会比较它们,并返回一个值,指出谁是更大的:

  versioncmp( A, B )

将返回如下值:

  • 若 A 和 B 相同,则返回 0

  • 若 A 大于 B ,则返回大于 1 的值

  • 若 A 小于 B ,则返回小于 0 的值

操作步骤

  1. 添加如下代码到你的配置清单:

    $app_version = "1.2.2"
    $min_version = "1.2.10"
    
    if versioncmp( $app_version, $min_version ) >= 0 {
      notify { "Version OK": }
    } else {
      notify { "Upgrade needed": }
    }
    
  2. 运行 Puppet:

    notice: Upgrade needed
  3. 现在更变 $app_version 的值:

    $app_version = "1.2.14"
    
  4. 在次运行 Puppet:

    notice: Version OK

工作原理

我们指定了可接受的最小版本($min_version)是 1.2.10。 所以在上面的例子中,我们用 $app_version 为 1.2.2 的版本号与之比较。

简单的对两个字符串进行比较(例如,Ruby 中的字符串比较)将会给出错误的结果, 然而 versioncmp 却可以正确地检测出 1.2.2 小于 1.2.10 并提示我们 Upgrade needed

当改变 $app_version 的值为 1.2.14 后,由于 versioncmp 正确地检测出 $app_version 大于 $min_version,所以提示我们 Version OK