ぶていのログでぶログ

思い出したが吉日

asdf/rtxでFATAL: Found legacy version file 'main.tf' with unsupported required version constraint expressionがでる

結論から書くとasdf-hashicorpに含まれるparse-legacy-fileがrequired_versionパラメータのパースができなくてエラーになっている。

github.com

このスクリプトがどのように使われているか正しく理解していないのだが、名前から察するに古いTerraformを使うプロジェクトにおいて使用するソフトウェアのバージョンを正しく検知するためのものだと思う。 rtxにおいてはこのエラーが出てしまうとrtx経由で何も操作できなくなってしまうのでとても困る。。。 これを回避するには ~/.config/rtx/config.toml に以下の設定を行う。

[settings]
legacy_version_file_disable_tools = ["terraform", "packer"]

手元の環境では、main.tfがあるとterraformだけでなくpacker経由のparse-legacy-fileもエラーになっていた(同じスクリプトだからね…)ので両方入れておくと良さそう。 なお、asdfでは ~/.asdfrc に以下の設定を行うとよいらしい(未検証)。

legacy_version_file = no

別解: require_versionの書き方を変更して回避する

parse-legacy-fileで使われている正規表現をみていると ^=?[[:digit:]]+\.[[:digit:]]+.[[:digit:]]+ っとなっている。 そのため、main.tfにおいて以下のようにrequired_versionが指定されている場合 = で始めるようにするとエラーがなくなる。

# 🆖
required_version = ">= 1.1.7"

# 🆗
require_version = "=1.1.7"

しかしながら元々の意味合いが変わってしまうのでこの方法で回避するなら、asdf/rtx側でlegacy_version_file/legacy_version_file_disable_toolsを無効にしたほうが良いと思う。

おまけ: rtx settings setが動かない?

~/.config/rtx/config.tomlrtx settings で操作できるようなのだが、手元の環境ではエラーになってしまった。謎い

$ rtx settings get legacy_version_file_disable_tools
[]

$ rtx settings set legacy_version_file_disable_tools terraform
rtx Unknown setting: legacy_version_file_disable_tools
rtx Run with RTX_DEBUG=1 for more information

getはできるのだがsetにするとUnknownと言われてしまううーん。 過去のrtxバージョンで動いていたかは試していない。

$ rtx version
2023.9.1 linux-x64 (c6d59d7 2023-09-13)

参考