Open4

dotenv やめるってよ

koko_ukoko_u

背景

  • API 接続時のキーなどを機密情報として .env ファイルに保存したい
  • しかし dotenv クレートは長らくメンテされていない
  • 後継となるツールの開発もちらほら見られるが、似たりよったりの状況
koko_ukoko_u

clap クレートを使う

clap の利用を検討する

  • env フィーチャーによって、環境変数を取得することができる
  • PaaS などにデプロイすることを考えると、コマンドライン引数と環境変数を同時に扱えるとメリットがある
  • .env ファイルを読んで環境変数として扱う方法はいくつかある
    • 個人的には just をコマンドランナーとして常用しているので、これを使う
koko_ukoko_u

サンプルアプリケーション

  • clap をプロジェクトの依存に追加して、env フィーチャーを指定する
  • derive でやるか、builder でやるかはお好みで
依存関係
[dependencies]
clap = { version = "4.5", features = ["derive", "env"] }

  • 非常に単純に secret_value を取り出してプリントするだけ
main.rs
use clap::Parser as _;

#[derive(clap::Parser)]
pub struct EnvArgs {
    #[arg(long, env)]
    pub secret_value: String,
}

fn main() {
    let env_args = EnvArgs::parse();

    println!("My Secret value={}", env_args.secret_value);
}

  • ひみつのファイル
.env ファイル
SECRET_VALUE=Zv4jIAw0iigike4I
koko_ukoko_u

実行する

  • コマンドライン引数を指定して実行する
$ cargo run -- --secret-value='My Secret'
My Secret value=My Secret
  • justfile を使って .env を環境変数として使う
  • set dotenv-load と書くと .env ファイルを環境変数としてロードしてくれるので、justfile の中では環境変数のように SECRET_VALUE が見える
justfile
set dotenv-load

run:
    cargo run

env:
    @echo $SECRET_VALUE
  • just env で環境変数として見えることを確認する
$ just env
Zv4jIAw0iigike4I
  • just run でプログラムを実行する
$ just run
My Secret value=Zv4jIAw0iigike4I