YAMLからENV変換における数値の扱い

YAML数値型(整数、浮動小数点、8進数、16進数、infinityなどの特殊値)がENV文字列形式に変換される際の処理方法を学びます。

Basic Conversion

詳細な説明

YAMLは豊富な数値フォーマットセットをサポートしていますが、ENVファイルではすべてがプレーン文字列になります。これらの変換を理解することは、データの損失や誤解を避けるために不可欠です。

YAML数値型:

# 標準的な整数と浮動小数点
port: 8080
timeout: 30.5
negative: -1
zero: 0

# 8進数(ファイルパーミッションでよく使用)
file_mode_v1: 0755       # YAML 1.1 8進数 = 10進数 493
file_mode_v2: 0o755      # YAML 1.2 8進数 = 10進数 493

# 16進数
max_memory: 0xFF         # 10進数 255

# 指数表記
threshold: 1.5e-3        # 0.0015

# 特殊値
max_connections: .inf    # 無限大
undefined_ratio: .nan    # 非数

ENVへの変換:

PORT=8080
TIMEOUT=30.5
NEGATIVE=-1
ZERO=0
FILE_MODE_V1=493
FILE_MODE_V2=493
MAX_MEMORY=255
THRESHOLD=0.0015
MAX_CONNECTIONS=Infinity
UNDEFINED_RATIO=NaN

重要な変換の問題:

  1. 8進数の展開。 YAMLは0755を8進数として解釈し、10進数の493に変換します。リテラル文字列"0755"を意図していた場合(例:chmodのファイルパーミッション引数)、YAML内でクォートする必要があります: file_mode: "0755"。ENV出力ではFILE_MODE=0755となります。

  2. 16進数の変換。 0xFF255になります。16進数表現は失われます。16進数文字列が必要な場合はクォートします: "0xFF"

  3. InfinityとNaN。 これらのYAML特殊値には標準的なENV表現がありません。通常、文字列InfinityNaNになり、使用するアプリケーションで明示的にパースする必要があります。

  4. 指数表記。 1.5e-3はコンバーターにより0.0015に展開されるか、1.5e-3のまま保持される場合があります。どちらも有効な数値表現です。

  5. 先頭のゼロ。 YAML 1.1で007のような値は8進数(10進数7)であり、文字列"007"ではありません。YAML 1.2では007は整数7のまま(8進数ではない)です。リテラル形式が必要な場合は常にクォートしてください。

ベストプラクティス: 文字列表現が数値そのものよりも重要な場合(ファイルパーミッション、ゼロパディングされたID、16進カラーコード)、ENVに変換する前にYAML内で値を常にクォートしてください。

ユースケース

ファイルパーミッション(0755、0644)、16進数表記のメモリ制限、指数表記の閾値を含むYAML設定を、コンテナ化されたアプリケーションの起動スクリプト向けにENV形式に変換する場合。

試してみる — YAML ↔ ENV Converter

フルツールを開く