コンテンツにスキップ

環境

VaporのEnvironment APIは、アプリの動的な設定を支援します。デフォルトでは、あなたのアプリはdevelopment環境を使用します。productionstagingのような他の有用な環境を定義し、各ケースでアプリがどのように設定されるかを変更できます。また、プロセスの環境や.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 に加えて、Environmentprocess 経由で動的メンバールックアップ 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.swiftEnvironment.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つの引数が含まれている必要があります。コマンドライン経由で引数を渡すのをシミュレートするために、さらに引数を供給できます。これは特にテストに役立ちます。