前提・実現したいこと
Rustのdotenvで任意のconfigファイルを読み込むことができるようにすることで、
設定を切り替えたいと思っております。
発生している問題・エラーメッセージ
該当のソースコードに記載したものは、ネット検索した例を基にしておりますが、 なぜかファイルの読み込み結果が”None”になってしまいます。 設定ファイルを認識してくれない原因をお教えいただけると幸いです。 ・エラーメッセージ thread 'main' panicked at 'VAR is not defined: NotPresent', src\main.rs:26:31 note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
該当のソースコード
Rust
1use dotenv; 2use std::env; 3use std::path::PathBuf; 4 5fn main() -> std::io::Result<()> { 6 7 // Config File Read 8 // 環境変数読み込み 9 let result: Vec<(String, String)> = dotenv::vars().collect(); 10 println!("{:?}", result); 11 // 特定の設定ファイル読み込み 12 let my_path = PathBuf::from(r"C:\Users****\test.env"); 13 let res = dotenv::from_path(my_path.as_path()).ok(); 14 println!("{:?}", res); // ここでの結果が”None” 15 let var = env::var("VAR").expect("VAR is not defined"); // ここでエラー 16 println!("{}", var); 17 18 Ok(()) 19} 20 21
試したこと
以下のコードの「********」部分を、相対パスに変えてみたり、
test.envの中身を変えてみたりしたのですが、結果が変わりませんでした。
let res = dotenv::from_path(********).ok();
補足情報(FW/ツールのバージョンなど)
・Windows10
・rustc 1.57.0
`dotenv::from_path`はResultを返すので、まずはそのエラーを確認してはどうですか?
こちらの質問にもご回答いただき、ありがとうございます!
コードを以下のように変更して確認してみたところ、以下のような結果になっておりました。
度々申し訳ないのですが、dotenv::from_pathを通すと、なぜ違うディレクトリを認識して
しまうのでしょうか?
・println!の出力結果
最初のprintln! ⇒ "test1 C:/Users/*****/test.env"
次のprintln! ⇒ "test2 Err(LineParse("C:\\Users\\*****\\Downloads", 3))"
・ソースコード
let my_path = PathBuf::from(r"C:/Users/*****/test.env");
println!("test1 {:?}", my_path);
let res = dotenv::from_path(&my_path);
println!("test2 {:?}", res);
途中のパスがわからないとなんとも言えないですね
分かり辛くて申し訳ありません。
PathBuf::fromに記載のパスを変更してみました。(が、結果は変わらずでした。)
※以下の{ユーザ名}はアルファベット小文字で5文字になります(abcdeのような)
・println!の出力結果
最初のprintln! ⇒ "test1 C:/Users/test.env"
次のprintln! ⇒ "test2 Err(LineParse("C:\\Users\\{ユーザ名}\\Downloads", 3))"
・ソースコード
let my_path = PathBuf::from("C:/Users/test.env");
println!("test1 {:?}", &my_path);
let res = dotenv::from_path(&my_path);
println!("test2 {:?}", res);
dotenvのソースを詳しく読んでみました
LineParseの第一要素は「読み込めなかった行の内容」のようなので、test.env の中身が表示されているはずです
.envファイルは「名前=要素」の形式になっていないといけないのですが、そのようになっていますか?
脇道ですが、teratailは一問一答形式のサイトなので、このように複数の問題が絡む場合にはあまり向いていません
もしよろしければ、日本のrustコミュニティのSlackがありますので、そちらへの参加をご検討ください。
https://rust-jp.rs/
ご回答いただき、ありがとうございます!
「名前=要素」の形式になっていたのですが、test.envの中身の記載内容を
「C:\Users\{ユーザ名}\Downloads」⇒「C:/Users/{ユーザ名}/Downloads」
に変更したところ、読み込むことができるようになりました。
また、rustコミュニティをご紹介いただきありがとうございます!
参加させていただこうと思います。
ここでやりとりされているのに気づかず、自分のWindows上のRust環境で動作させてみましたが、「該当のソースコード」の****を自分のユーザー名に変え、該当パスにtest.envを配置するだけで動作しました。
不思議ですね。ひょっとして、ユーザー名部分に空白が含まれていたりしますか?
あなたの回答
tips
プレビュー