環境¶
VaporのEnvironment APIは、アプリの動的な設定を支援します。デフォルトでは、あなたのアプリはdevelopment
環境を使用します。production
やstaging
のような他の有用な環境を定義し、各ケースでアプリがどのように設定されるかを変更できます。また、プロセスの環境や.env
(dotenv)ファイルから変数を読み込むことも、ニーズに応じて可能です。
現在の環境にアクセスするには、app.environment
を使用します。configure(_:)
内でこのプロパティにスイッチして、異なる設定ロジックを実行できます。
switch app.environment {
case .production:
app.databases.use(....)
default:
app.databases.use(...)
}
環境の変化¶
デフォルトでは、アプリは development
環境で実行されます。アプリ起動時に --env
(-e
)フラグを渡すことで、これを変更できます。
swift run App serve --env production
Vapor は以下の環境を含みます。:
名前 | 略称 | 説明 |
---|---|---|
production | prod | ユーザーにデプロイされた状態 |
development | dev | ローカル開発 |
testing | test | ユニットテスト用 |
Info
production
環境は、特に指定されていない場合、デフォルトで notice
レベルのログになります。他の環境はデフォルトでinfoです。
--env
(-e
)フラグには、フルネームか略称のどちらかを渡すことができます。
swift run App serve -e prod
プロセス変数¶
Environment
は、プロセスの環境変数にアクセスするためのシンプルな文字列ベースの API を提供します。
let foo = Environment.get("FOO")
print(foo) // String?
get
に加えて、Environment
は process
経由で動的メンバールックアップ API を提供します。
let foo = Environment.process.FOO
print(foo) // String?
ターミナルでアプリを実行する際は、export
を使って環境変数を設定できます。
export FOO=BAR
swift run App serve
Xcode でアプリを実行する場合は、App
スキームを編集して環境変数を設定できます。
.env (dotenv)¶
Dotenv ファイルには、環境に自動的にロードされるキーと値のペアのリストが含まれています。これらのファイルは、手動で設定することなく環境変数を設定するのを容易にします。
Vapor は、現在の作業ディレクトリにある dotenv ファイルを探します。Xcode を使用している場合は、App
スキームを編集して作業ディレクトリを設定してください。
以下の .env
ファイルがプロジェクトのルートフォルダに配置されているとします:
FOO=BAR
アプリケーションが起動すると、このファイルの内容に他のプロセス環境変数のようにアクセスできます。
let foo = Environment.get("FOO")
print(foo) // String?
Info
.env
ファイルで指定された変数は、プロセス環境に既に存在する変数を上書きしません。
.env
と並行して、Vapor は現在の環境の dotenv ファイルも読み込もうとします。例えば、development
環境では、.env.development
がロードされます。特定の環境ファイルにある値は、一般的な .env
ファイルより優先されます。
一般的なパターンとして、プロジェクトはデフォルト値を含む .env
ファイルをテンプレートとして含めます。特定の環境ファイルは、以下のパターンで .gitignore
に含まれます:
.env.*
プロジェクトが新しいコンピュータにクローンされたとき、テンプレートの .env
ファイルをコピーして正しい値を挿入できます。
cp .env .env.development
vim .env.development
Warning
パスワードなどの機密情報を含む dotenv ファイルは、バージョン管理にコミットしてはいけません。
dotenv ファイルの読み込みに問題がある場合は、--log debug
を使用してデバッグログを有効にすると、より多くの情報が得られます。
カスタム環境¶
カスタム環境を定義するには、Environment
を拡張します。
extension Environment {
static var staging: Environment {
.custom(name: "staging")
}
}
アプリケーションの環境は通常、entrypoint.swift
で Environment.detect()
を使って設定されます。
@main
enum Entrypoint {
static func main() async throws {
var env = try Environment.detect()
try LoggingSystem.bootstrap(from: &env)
let app = Application(env)
defer { app.shutdown() }
try await configure(app)
try await app.runFromAsyncMainEntrypoint()
}
}
detect
メソッドはプロセスのコマンドライン引数を使用し、--env
フラグを自動的に解析します。カスタム Environment
構造体を初期化することで、この動作をオーバーライドできます。
let env = Environment(name: "testing", arguments: ["vapor"])
引数配列には、実行可能な名前を表す少なくとも1つの引数が含まれている必要があります。コマンドライン経由で引数を渡すのをシミュレートするために、さらに引数を供給できます。これは特にテストに役立ちます。