⛵
【Rust】envファイルで環境毎に設定を管理したい
概要
RailsやNode.jsなど、様々な言語やフレームワークで用意されているdotenvでは、envファイルで環境変数を設定できます。Reactの環境変数をdotenv-cliで切り替えてみたで紹介されているdotenv-cli
のようなものを利用することで、envファイルを環境毎に管理することもできます。
今回はrustでenvファイルを環境毎にどう管理するか、考えてみたのでメモ書きします。
対応方針
-
Rustのdotenvの使い方まとめの記事にまとめられている通り、rustでもdotenvのライブラリが用意されています。
dotenv-cli
のように環境毎に読み込むファイルを変える機能は無いですが、記事に指定されている通りファイルを指定して読み込めるので、今回はこの機能を使用します。 - 対象とする環境は環境変数に直接設定するものとします。Rustで環境変数を扱うの記事の通り、
std::env
で値を取得します。
実装サンプル
例として、actix-webのmain関数でallowed_origin
に設定するドメインを、envファイルから取得します。
use actix_cors::Cors;
use actix_web::http;
use actix_web::App;
use actix_web::HttpServer;
use dotenv;
use std::env;
#[actix_web::main]
async fn main() -> std::io::Result<()> {
// 「ENVIRONMENT」という環境変数に事前に環境をセット(未設定の場合はlocal)
let environment = match env::var("ENVIRONMENT") {
Ok(val) => val,
Err(_) => "local".to_string(),
};
// 環境毎にファイルを配置して読み込み
dotenv::from_filename(".env.".to_string() + &environment).ok();
HttpServer::new(|| {
let cors = Cors::default()
// envファイルに設定したドメインを設定
.allowed_origin(&env::var("FRONT_DOMAIN").unwrap())
.allowed_methods(vec!["GET", "POST", "PUT", "OPTIONS", "DELETE"])
.allowed_header(http::header::CONTENT_TYPE);
App::new()
.wrap(cors)
.service(controller::search_controller::get_search_condition)
})
.bind("0.0.0.0:8080")?
.run()
.await
}
Discussion