Closed16

TypeScript における envsafe のようなライブラリが Ruby にも欲しい

ピン留めされたアイテム
snakasnaka

「言語依存しない単一バイナリで動作するツール」という方向でも探してみる

単体で実行できるコマンドにはなっていないが、これをベースに CLI を作るとよさそう

https://github.com/duffn/dotenv-validator

snakasnaka

背景

以前 Next.js で envsafe を使ってて、環境変数の定義もれや値の設定ミス(型の違い)が早期に発見できていた。

https://github.com/KATT/envsafe/tree/main

Ruby / Rails においても同様の環境変数の設定ミスを早期に発見するための仕組みが欲しい。

snakasnaka

Ruby / Rails で環境変数を扱うライブラリを調査する

snakasnaka

dotenv

https://github.com/bkeepers/dotenv

リポジトリ名やREADMEは dotenv だけど、dotenv-rails = dotenv ってことらしい...

感想

必須キーの設定ができるらしい (思い出してきた)

# config/initializers/dotenv.rb

Dotenv.require_keys("SERVICE_APP_ID", "SERVICE_KEY", "SERVICE_SECRET")

開発環境やCI環境向けの環境変数を .env* ファイルで管理しましょう。という目的のライブラリなので、欲しい機能はではなさそう。

snakasnaka

dry-validation

https://dry-rb.org/gems/dry-validation/1.10/

(環境変数に限らず)データの型検査を行うライブラリ

感想

サンプルコード(上記ページからの引用)

class NewUserContract < Dry::Validation::Contract
  params do
    required(:email).filled(:string)
    required(:age).value(:integer)
  end

  rule(:email) do
    unless /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i.match?(value)
      key.failure('has invalid format')
    end
  end

  rule(:age) do
    key.failure('must be greater than 18') if value <= 18
  end
end

contract = NewUserContract.new

contract.call(email: 'jane@doe.org', age: '17')
# #<Dry::Validation::Result{:email=>"jane@doe.org", :age=>17} errors={:age=>["must be greater than 18"]}>

サンプルコードも期待してるものに近いように思えるが...

今であればオリジナルのDSLより、RBS 使うのが良さそう... ⇒ RBS は静的な型検査なので実行時の環境変数型検査はできない

snakasnaka

RBS でできることを調べる

(TBD)

snakasnaka

RBSは静的型検査なので求めているもの ( 環境変数に設定されている値の型との整合性検査 ) とは違うか...

snakasnaka

ほしいもの

  • MUST: アプリケーション起動前に必要な環境変数が揃っていることが確認できる
  • MUST: 現在の環境変数を読み取り、.env 形式で標準出力/ファイルに出力できる
  • MAY: ローカル環境やCI/CD環境でも動いてほしい
  • MAY: 型のチェックができると良い
  • MAY: Markdown 形式でドキュメントを出力できる

要件

  • ENV に必須の key が存在しているかチェックできる
  • その値があらかじめ想定した値になっているかチェックできる
    • たとえば:
      • Boolean: true | false
      • URL: http(s):// で始まる
      • email: ... (略)
      • とか
snakasnaka

悩みどころ

環境変数を利用するための設定ファイルをこれ以上増やしたくない

  • ECS TaskDefinition (ecspresso)
    • --envfile=ENVFILE.env ファイルを読み込める
  • .env
  • compose.yml
    • docker compose は env_file.env ファイルを読み込める

こうしてみると、 .env 形式に出力する機能があればなんとかなりそう

snakasnaka

悩みどころ(2)

ecspresso の tfstate Plugin とかで実現していたことが出来なくなると辛い

Bash のコマンド置換 ( $(command ... ) )のような仕組みがあると良いかもしれない。
それさえできれば、tfstate-lookup や AWS CLI などの CLI ツールと組み合わせてどうにでもなりそう。

snakasnaka

言語依存しない単一バイナリで動作するツールでも良いかもしれない

このスクラップは4ヶ月前にクローズされました