プログラミング
dotenvy を dotenv-ng にフォークします
We Are Forking dotenvy into dotenv-ng (secretspec.dev)
要約
SecretSpecチームは、環境変数ローディングライブラリであるdotenvyのフォークとして、Rustで書かれたdotenv-ngをリリースしました。dotenvyが.envファイルを読み込む際に、秘密鍵の一部を環境変数として誤解釈するバグを発見したことがきっかけです。dotenv-ngは、この問題に対処し、より堅牢で安全な.envファイル解析とレンダリング機能を提供します。
全文翻訳
dotenvy を dotenv-ng にフォークします
Aug 15, 2026
Domen Kožar
dotenv-ng 1.0 をリリースしました。これは、.env ファイルのロードとレンダリングのためのモダンな Rust 実装です。
これは、dotenvy のパーサーが読み込み中に秘密鍵を誤って解釈したことを受けて、dotenvy のフォークとして始まりました。
これは矛盾しているように聞こえるかもしれません。
SecretSpec は依然として環境変数を秘密鍵インターフェースとして排除するという使命を遂行しており、.env がどこで間違ったかについて書いてきました。
それは秘密鍵の最終的な保管場所であるべきではありません。
しかし、.env から移行するには、それを正しく読み取ることから始まります。
なぜ dotenvy をフォークしたのか
セクション「なぜ dotenvy をフォークしたのか」
直接的な失敗は、SecretSpec の問題 #73 でした。
dotenv ファイルには bcrypt フラグメントを含む値が含まれていました。
TEST="foo:$2a$10$TWoviNHS27HJMw1PKe4tBeIMlms6tWdYS9hKoHANKCQhluDlEt/gu"
ファイルは無傷でした。
dotenv プロバイダーを通してそれを読み取ると、dotenvy がドル記号で始まるフラグメントを変数置換として扱ったため、異なる値が返されました。
この失敗は、パースエラーではなく、後になって認証エラーとして現れました。
置換を設定可能にするためのアップストリームへのリクエストは 2024 年から開かれていました。
2026 年にプルリクエストが到着しましたが、未リリースの API を対象としていました。
移行ツールは、ユーザーに秘密鍵内のパーサー構文を認識してエスケープすることを要求できません。
メンテナンスギャップ
セクション「メンテナンスギャップ」
元の Rust dotenv クレートは 2020 年にリリースを停止し、最終的に RustSec によってメンテナンスされていないとマークされ、dotenvy が代替としてリストされました。
Dotenvy の説明では、依然として「よくメンテナンスされているフォーク」と呼んでいます。
その最新の公開バージョン 0.15.7 は 2023 年 3 月 22 日にリリースされました。
Rust フォーラムの議論では、2025 年に 2 年間のリリースギャップが指摘されました。
bcrypt バグが SecretSpec をブロックしたときには、3 年以上経過していました。
メンテナンスされているフォークがアップストリームのリリース問題を繰り返すという、不快な皮肉があります。
そのメンテナーは私たちにリリースを提供する義務はありませんが、SecretSpec は私たちが制御できるスケジュールで、破壊的な修正を必要としていました。
dotenv-ng は dotenvy に何を改善したのか?
セクション「dotenv-ng は dotenvy に何を改善したのか?」
最初は小さなパッチを検討しました。
パーサーを監査したところ、JSON、Windows パス、Unicode 名、優先順位、および部分的な環境変更に関するさらなる問題が明らかになりました。
したがって、dotenv-ng は dotenvy 0.15.7 から始まりますが、正確さが要求される場合は互換性を意図的に破っています。
バージョン 1.0 は以下を追加します。
ソースを認識するパーサーと構造化されたエラー。
デフォルトでリテラルのドル記号。置換は、呼び出し元が明示的に有効にした場合にのみ利用可能です。
ダッシュ、先頭の数字、先頭のドット、および Unicode をサポートする、より広いキー構文。
値を変更せずに解析するために必要な引用とエスケープのみを追加するレンダラー。
プロセス環境の変更前の検証。
その変更を囲む明示的な unsafe 境界。
プロパティテストは、ランダムな Unicode と構文的に重い値を実行し、引用が必要な場合にのみ使用されることを確認し、完全なドキュメントをラウンドトリップします。
パーサーとレンダラーは、リライトのコアであり、どちらも 100% の行カバレッジを持っています。
完全な互換性と API の変更は、dotenv-ng 1.0 の変更履歴に記録されています。
dotenv-ng 1.0 を試す
セクション「dotenv-ng 1.0 を試す」
パッケージは crates.io で利用可能です。
アプリケーションは、依存関係エイリアスを使用して、おなじみの dotenv クレート名を維持できます。
[dependencies]
dotenv = { package = "dotenv-ng", version = "1" }
SecretSpec 0.20 から、dotenv-ng は SecretSpec 全体で dotenv の解析とレンダリングを強化しています。
SecretSpec 0.19: 秘密鍵の移動とインポート プロバイダー間