🐦

2022年5月のRustにおけるdotenv事情

2022/05/21に公開

あの夏で待ってるので初投稿です。

環境変数の取り回しでよく使われるやり口としてdotenvというものがあります。これは様々な言語でライブラリ、モジュール、パッケージ etc...として用意されており、広く利用されているものでもあります。
Rustも例に漏れず、dotenvを利用できるcrateが存在するのですが、それについて2022年5月執筆時点で少し注意しておきたい事項があります。そして、それについて言及している記事が見当たらない・見逃していたとしても比較的少数そうだったため、注意喚起の意も込めてそれについて触れておこうと思います。

TL;DR

  • dotenv crateはunmaintained状態なので使う場合はそれを念頭に置いた方がいい
    • 一通り実装はされていて、基本的なdotenvでやりたいことは実現可能なはず
    • ただnew featureやbug fixが取り込まれる雰囲気は現状なさそう
  • 代替crateとしてdotenvyというものが登場しており、使用を検討してもよさそう

dotenv crate

Rust dotenv のような検索クエリを投げると、もっとも目につくのがdotenv crateです。
観測できるかぎりだと、これは多くの日本語記事で言及され利用されているようで、筆者環境だとdocs.rsのリンクも上位に出てきます。
それにより上京したての右も左も分からない人類が「とりあえずこれを使っておけばよさそう」と思ってしまう状態になっていそうです。

Project status

ただここで一歩踏み込んでcrateGitHub repoの状態を見てみると、少し様子がおかしいことに気がつくでしょう。
crates.io上の最新バージョン、そしてrepositoryの最新コミットがともに2020年で止まっています[1]
さらにissues/PRsの状態を見ると、このcrateが枯れていて動きがもう必要ないというよりは、単純にメンテナンスされていない状態であるようだということが推測できるでしょう。
それを示すものとして、Current maintenance state · Issue #74 · dotenv-rs/dotenvというissueが確認できます。

dotenvy crate

上記issueでも触れられていますが、これを見てdotenvyという、dotenv crateをforkし、放置されていた部分について手を加えたcrateが登場しています。
執筆時点でめちゃくちゃ変わっているというわけでもありませんが、少なくとも放置されていた本家PRをいくつか取り込みマシな状態になっているように見受けられます[2][3]
現状、fork repoであり本家のコードをそのまま引き継いでいること、雑に使われていたassert! macroが取り除かれていることなど、とりあえず本家の代わりに採用するのに十分そうな感じです。

実際、Dieselのexample codeでもdotenvの代わりにdotenvy crateが使われるようになるなど、コミュニティでもdotenvがunmaintainedであるという認識は広まっていそうです[4]

まとめ

この記事は、「dotenv crateはメンテされていないのでdotenvy crateを使え!!」ということを主張しているものではなく、あくまでunmaintainedであること、放置されているPRなどを取り込んだものとしてdotenvy crateがあるということを周知するという意味合いが強いです。
冒頭でも触れましたが、観測範囲内でのRustでのdotenv周りについては現状dotenv crate一色であり、そのproject statusについて言及していそうな記事は見当たらなかったというのが記事執筆の一番の動機です。

ただこのライブラリのproject statusについての問題はdotenv crateに限った話ではなく、Rustの他のcrate、ひいては他の言語コミュニティなどにおいても言える広範的な話ではあります。日頃から注意しておく癖をつけておくと良さそうです。

余談ですが、Rustではこういったunmaintainedな、あるいはsecurity的に注意しておくべき状態にあるcrateが依存関係に含まれていないかチェックしてくれるcargo-auditというcrateがあります。興味があれば合わせてご確認ください。

脚注
  1. 執筆時点での最新バージョンはv0.15.0、最新コミットは https://github.com/dotenv-rs/dotenv/commit/3c1a77bc95821777e5ceb996c5e0b082f2a3ea38 でした。 ↩︎

  2. 執筆時点での差分は https://github.com/dotenv-rs/dotenv/compare/master...24890e824abb377c7488b2974ed4072f54aa3f72 でした。本家でのv0.15.0 tagが切られてからのコミットを含めるともう少しあります。 ↩︎

  3. ただまあ、コミットのauthorshipを奪っていそうなのでどうなの?という感はありますが……。 ↩︎

  4. DieselはRustにおいて有名なORMの1つです。 ↩︎

Discussion