.envファイルは、シンプルなキーと値の形式で環境変数を保存し、アプリケーションのソースコードから設定を分離します。The Twelve-Factor App(2011)によると、設定はコードから厳密に分離されるべきであり、.envファイルはこのアプローチの標準となっています。.env Fileを使用すると、プロジェクトを再コンパイルせずに、APIキー、サーバーURL、ビルドフラグの異なる値を注入できます。
主要ポイント
.env Fileは、シンプルなテキスト形式KEY=VALUEで環境変数を保存する設定ファイルです。各行には1つの変数が含まれています:キー名とその値が等号で区切られています。
.envファイルは、現代の開発における根本的な問題を解決します:異なる環境(ローカル、テスト、本番)はまったく異なる設定を必要とします。ローカルマシンのAPIサーバーURLはhttp://localhost:8080ですが、本番サーバーではhttps://api.production.comです。これらの値がアプリケーションコードに直接ハードコードされている場合、異なる環境用のビルドごとにソースコードの変更が必要になります。
メインのアプリケーションコードの外部に設定を保存するプラクティスは、The Twelve-Factor Appマニフェスト(2011)で標準化され、環境変数がアプリケーションを設定する唯一の正しい方法として特定されました。JetBrains Developer Ecosystem調査(2024)によると、67%以上のモバイル開発者がプロジェクトで.envファイルを使用しています。
モバイル開発にとって、.envには追加の利点があります:値はGradle(Android)またはxcconfig(iOS)を介してビルド段階で置き換えられ、ソースコードを変更せずに開発、ステージング、本番用の個別のビルドを作成できます。
.envはチームでの作業時に特に便利です:各開発者は自分の環境に合わせた設定(ローカルDBパス、デバッグAPIキー)で独自のローカル.envを作成し、共通の設定はリポジトリに.env.exampleとして固定されます。これにより、git pull後に開発者のビルドが、知らされていない環境変数の欠如によって壊れる状況を排除します。新しいチームメンバーは.env.exampleを.envにコピーして、自分のローカル値を入力するだけです。
.env形式は非常にシンプルです:各行はKEY=VALUE形式の1つの変数です。等号の周りのスペースは通常無視されますが、ほとんどのライブラリでは値の一部と見なされるため、避けるのが良いでしょう。
コメントは#文字で始まります—その後の行全体が無視されます。空行もスキップされます。値にスペースが含まれる場合は、二重引用符または一重引用符で囲まれます。
# 基本環境設定
APP_NAME=MyMobileApp
APP_ENV=development
# API設定
API_BASE_URL=http://localhost:3000/api
API_TIMEOUT=30000
# 機密データ
DB_PASSWORD=secret_password_123
JWT_SECRET=your_jwt_secret_key
.envのすべての変数は文字列ですが、ローダーライブラリはそれらを必要な型に変換できます。特殊文字をエスケープするには、バックスラッシュと引用符が使用されます。値にテキストの一部として#文字が含まれる場合は、\#としてエスケープする必要があります。
KEY=valueまたはKEY="value with spaces"PORT=8080DEBUG=trueKEY=line1\
line2DB_URL=${DB_HOST}:${DB_PORT}.envをロードする際、ライブラリは変数補間を実行できます—あるキーの値を別のキーの内部に置き換えます。例えば、変数DATABASE_URL=postgres://${DB_USER}:${DB_PASS}@localhost/dbは、同じファイルからDB_USERとDB_PASSを展開します。
.envの接続方法はプラットフォームによって異なります。AndroidはGradleプラグイン、iOSはxcconfig設定ファイル、Flutterのようなクロスプラットフォームソリューションは専門のライブラリを使用します。
Androidでは、.envはgradle-dotenvプラグインを介してロードされます。プラグインはプロジェクトルートから.envを読み取り、値をBuildConfigに追加し、その後生成されたフィールドを通じてKotlinまたはJavaコードで利用可能になります。
// build.gradle.kts(アプリレベル)
plugins {
id("co.uzzu.dotenv") version "4.0.0"
}
android {
buildFeatures {
buildConfig = true
}
}
kotlin {
// コード内でのアクセス:BuildConfig.API_BASE_URL
buildConfigField("String", "API_BASE_URL",
"\"" + dotenv.get("API_BASE_URL") + "\"")
}
iOSでは、環境変数は通常xcconfigファイルを介して設定されます。Swiftで.envをロードするには、DotEnvライブラリまたはカスタムキーを使用した組み込みのInfo.plistメカニズムが使用されます。
// Swiftプロジェクトでの.envのロード
import DotEnv
struct AppConfig {
static func load() {
let env = DotEnv(Bundle.main)
env.load()
let apiURL = ProcessInfo.processInfo
.environment["API_BASE_URL"] ??
"https://default.api.com"
}
}
Flutterにはflutter_dotenvパッケージがあり、アプリケーションの初期化中に.envから変数をロードします。.envファイルはプロジェクトルートに配置され、変数はdotenvクラスを介して利用可能になります。
// pubspec.yaml
dependencies:
flutter_dotenv: ^5.1
// main.dart — 起動時にロード
import 'package:flutter_dotenv/flutter_dotenv.dart';
void main() async {
await dotenv.load(fileName: '.env');
var apiUrl = dotenv.get('API_BASE_URL');
runApp(MyApp(baseUrl: apiUrl));
}
3つのアプローチはすべて共通の原則を共有しています:.envはビルド段階またはアプリケーション起動時にロードされ、値はキャッシュされて生成された定数を介してコードで使用されます。これにより、機密データがリポジトリに到達するのを防ぎます。
React Nativeでは、react-native-configパッケージが使用され、ビルド段階でプロジェクトルートの単一の.envファイルからAndroid用のBuildConfigクラスとiOS用のInfo.plistの定数を自動的に生成します。これは、Expoやbare workflowを使用するスタートアップにとって特に便利です:ルートレベルの単一の.envで、すべてのプラットフォームが設定を複製することなく同じ環境変数を受け取れます。
すべての利点にもかかわらず、.envは本番環境で機密情報を保存するための完全なソリューションではありません。基本的な保護レベルを提供しますが、誤って使用すると機密データの漏洩につながる可能性があります。
最も重要なルール—.envは決してリポジトリのバージョン管理システムに入れてはいけません。ファイルは作成後すぐに.gitignoreに追加され、空またはダミーの値を持つサンプルファイル.env.exampleのみがリポジトリにコミットされます。
# .env.example — リポジトリにコミット
APP_NAME=
APP_ENV=development
API_BASE_URL=http://localhost:3000
API_TIMEOUT=30000
# DB_PASSWORD — 例でも指定しないでください!
# JWT_SECRET — 例でも指定しないでください!
# .gitignore
# Dotenvファイル
.env
.env*.local
本番プロジェクトでは、専門的なシークレット管理ソリューションを使用することをお勧めします。本番での.envは、ファイルがサーバーのdocument-rootの外部にあり、厳格なアクセス権限がある場合にのみ許容されます。
Snyk State of Open Source Security(2024)によると、リポジトリを介した.envファイルの漏洩は、調査対象企業のAPIキー開示インシデント全体の12%以上の原因となっています。専用のシークレットマネージャーを使用することで、このリスクをゼロに減らせます。
pre-commitフックを実装することで追加の保護が達成され、huskyやlint-stagedなどのツールを使用して、開発者が誤って.envをコミットに追加していないかチェックします。git-secrets(AWS)やtalismanなどのツールは、各コミットをAPIキー、トークン、パスワードのパターンについてスキャンし、検出された場合はコミットをブロックします。CIパイプラインでは、detect-secretsを追加することをお勧めします—これは、開発者が間違いを犯した場合でも、.envファイルがリポジトリに入るのを防ぐ自動スキャナーです。
よくある質問
いいえ、.envをGitにコミットすべきではありません。ファイルには機密データが含まれており、.gitignoreに追加する必要があります。代わりに、必要なすべての変数のテンプレートを含む.env.exampleがリポジトリに配置されます。
.envは本番の値を持つ実際のファイルで、決してコミットされません。.env.exampleファイルには同じキーが含まれていますが、空または偽の値で—新しい開発者向けのサンプルとしてリポジトリにコミットされます。
はい、ただし追加の保護なしでは推奨されません。本番サーバーで.envを使用する場合、ファイルはWebサーバーのdocument-rootの外側に、アクセス権限600(所有者のみ)で配置する必要があります。重要なプロジェクトでは、シークレットマネージャーが推奨されます。
gradle-dotenvプラグイン(co.uzzu.dotenv)を介して行います。プラグインはプロジェクトルートから.envを読み取り、値をBuildConfigにエクスポートします。変数はコンパイル時にコード内でBuildConfig.VARIABLE_NAMEとして利用可能になります。
はい、多くのパーサーが${VAR_NAME}形式の補間をサポートしています。例えば、URL=${HOST}:${PORT}は同じファイルからHOSTとPORTの値を置き換えます。ただし、この機能は特定のローダーライブラリに依存します。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。