跳至主要内容

版本约束

在任何 OpenTofu 允许您指定某个内容的可接受版本范围的地方,它都期望一个特殊格式的字符串,称为版本约束。版本约束用于配置

版本约束语法

OpenTofu 的版本约束语法与 Bundler 和 NPM 等其他依赖项管理系统使用的语法非常相似。

代码块
version = ">= 1.2.0, < 2.0.0"

版本约束是一个 字符串字面量,包含一个或多个条件,这些条件用逗号分隔。

每个条件都包含一个运算符和一个版本号。

版本号应为用句点分隔的一系列数字(如 1.2.0),可选地带一个后缀以指示测试版发布。

以下运算符有效

  • =(或无运算符):仅允许一个确切的版本号。不能与其他条件组合。

  • !=:排除确切的版本号。

  • >>=<<=:与指定的版本进行比较,允许比较结果为真的版本。“大于”请求较新版本,“小于”请求较旧版本。

  • ~>:仅允许最右边的版本组件递增。例如,要允许特定次要版本内的新的补丁版本,请使用完整版本号:~> 1.0.4 将允许安装 1.0.51.0.10,但不允许安装 1.1.0。这通常称为悲观约束运算符。

版本约束行为

满足所有适用约束的版本号被认为是可接受的。

OpenTofu 会参考版本约束来确定它是否具有其自身、任何必需的提供程序插件和任何必需的模块的可接受版本。对于插件和模块,它将使用满足适用约束的最新已安装版本。

如果 OpenTofu 没有必需插件或模块的可接受版本,它将尝试下载满足适用约束的最新版本。

如果 OpenTofu 无法获取外部依赖项的可接受版本,或者它没有其自身的可接受版本,它将不会继续执行任何计划、应用或状态操作。

根模块和任何子模块都可以约束 OpenTofu 及其使用的任何提供程序的可接受版本。OpenTofu 将这些约束视为相等,并且只有在所有约束都能满足时才会继续执行。

预发布版本是指包含由连字符引入的后缀的版本号,例如 1.2.0-beta。预发布版本只能通过精确版本约束(= 运算符或无运算符)选择。预发布版本与诸如 >=~> 等非精确运算符不匹配。

最佳实践

模块版本

  • 当依赖于第三方模块时,需要指定特定版本以确保更新仅在您方便时发生。

  • 对于在您的组织内维护的模块,如果一致地使用语义版本控制或存在避免意外更新的明确定义的发布流程,则指定版本范围可能是合适的。

OpenTofu 核心和提供程序版本

  • 可重用模块应仅约束其 OpenTofu 和提供程序的最低允许版本,例如 >= 0.12.0。这有助于避免已知的兼容性问题,同时允许模块的用户灵活地升级到 OpenTofu 的较新版本,而无需更改模块。

  • 根模块应使用 ~> 约束为其依赖的每个提供程序设置版本的下限和上限。