この記事の要点
- アプリケーションの設定(configuration)を統一的かつ型安全に読み取るためのライブラリ Swift Configuration が、安定版の 1.0 に到達しました。2025 年 10 月の最初の発表以降、40 を超えるプルリクエストを経て、本番環境で利用できる品質になっています。
- このライブラリの核心は、設定を どう読むか(コード側のアクセス方法)と どこから来るか(設定の供給元)を分離する抽象化にあります。これにより、ライブラリ側が供給元を強制せずに設定を受け取れるようになり、さまざまなデプロイ環境をまたいで組み合わせやすくなります。
- 環境変数・コマンドライン引数・JSON / YAML ファイルなどの組み込みプロバイダが用意されており、数行で使い始められます。複数のプロバイダを優先順位付きで重ねることで、デフォルト値とオーバーライドを明確に管理できます。
- 公開された
ConfigProviderプロトコルを実装すれば、シークレットストアやフィーチャーフラグサービスなど、独自の設定供給元を作って共有できます。
何が発表されたのか
あらゆるアプリケーションは設定を持ちます。環境変数、設定ファイル、リモートサービスから取得する値、コマンドラインフラグ、API キーのようなシークレットを保管するストアなど、その供給元はさまざまです。これまで Swift では、こうした供給元を個別に手で結線し、パース処理が散在し、アプリケーションコードが特定の設定供給元と密結合してしまいがちでした。
Swift Configuration は、この問題に統一的で型安全なアプローチを持ち込みます。単に設定ファイルを読めるだけでなく、コードが設定にアクセスする方法と、その設定がどこから来るかを切り離す点が特徴です。この分離によって、ライブラリは供給元を指定せずに設定を受け取れるようになり、デプロイ環境をまたいで真に組み合わせ可能になります。
1.0 では API が安定し、今後は後方互換性を保つ形で進化していくことが期待できます。これにより、ライブラリやツールが Swift Configuration を「設定を読むための共通の統合ポイント」として安心して依存できるようになりました。
設定管理が特に複雑になりやすいのはサーバーサイド Swift のエコシステムで、複数のシステムやツールから設定を読み込む場面が多くあります。Swift Configuration はそうした用途で特に力を発揮しますが、コマンドラインツール・GUI アプリケーション・ライブラリなど、柔軟な設定管理が必要なあらゆる場面でも同様に役立ちます。
何に使えるのか
パッケージ依存を追加したあとは、数行のコードで設定値を読み取れます。ConfigReader にプロバイダを渡し、キーと型を指定して値を取得します。
import Configuration
let config = ConfigReader(provider: EnvironmentVariablesProvider())
let timeout = config.int(forKey: "http.timeout", default: 60)
ただし、Swift Configuration の本当の強みは、複数のプロバイダを明確で予測可能な階層に組み合わせられる点にあります。これにより、妥当なデフォルト値を用意しつつ、デプロイのシナリオごとにきれいにオーバーライドできます。
たとえば、デフォルトの設定を JSON ファイルで持っておきます。
{
"http": {
"timeout": 30
}
}
そのうえで、環境変数によるオーバーライドを許したいとします。
# Environment variables:
HTTP_TIMEOUT=15
これら 2 つを「プロバイダ」として重ねます。プロバイダは指定した順にチェックされ、先に書いたプロバイダが後のものをオーバーライドし、最後にフォールバックのデフォルト値が使われます。
let config = ConfigReader(providers: [
EnvironmentVariablesProvider(),
try await FileProvider<JSONSnapshot>(filePath: "/etc/config.json")
])
let timeout = config.int(forKey: "http.timeout", default: 60)
print(timeout) // 15
この例では、環境変数プロバイダが JSON ファイルプロバイダより優先されるため、timeout は環境変数の 15 になります。どの設定供給元が実際に使われているのかが曖昧にならない点が利点です。
本番環境向けの機能
基本的な値の読み取りに加えて、本番環境を想定した機能も備えています。
- 複数のアクセスパターン: 同期・非同期・監視(watching)の各パターンから選べます。
- ホットリロード: サービスを再起動せずに設定の更新を反映できます。
- 名前空間とスコープ付きリーダー: 設定値をネストして整理できます。
- アクセスログ: 詳細な可観測性により設定の問題をデバッグしやすくします。
- シークレットの秘匿(redaction): 機微な設定値が誤って露出するのを防ぎます。
ライブラリやアプリケーションでの利用
Swift Configuration は、利用する側の立場に応じて次のような使い方ができます。
- ライブラリで:
ConfigReaderを起点とした設定エントリポイントを公開することで、供給元を強制せずに設定を受け取れる、組み込みやすいライブラリを作れます。 - アプリケーションで:
ConfigReaderを生成して依存コンポーネントに渡します。JSON / YAML ファイル・環境変数・リモートシステムなど、任意のConfigProviderを組み合わせられます。 - カスタムプロバイダの実装で: 新しいフォーマットや外部の供給元に対応する
ConfigProviderを実装し、エコシステムを拡張できます。
1.0 のリリース以前から、Vapor や Hummingbird などのフレームワーク、Temporal Swift SDK などのプロジェクトが Swift Configuration の採用や実験を始めており、TOML・Vault・AWS 向けのカスタムプロバイダも実験的に登場しています。
導入・今後の位置づけ
API が安定したことで、ライブラリやアプリケーションは Swift Configuration を基盤として、自分自身の設定統合を仕上げ、API 安定版をリリースしていけるようになりました。
導入を始めるには、プロジェクトのドキュメントが参考になります。ハードコードされた値から柔軟なプロバイダ階層へとサンプルサービスを段階的に発展させていく解説として、ServerSide.swift カンファレンス(ロンドン)での講演動画も公開されています。
フィードバックは GitHub リポジトリの issue やプルリクエスト、あるいは Swift Forums を通じて受け付けられています。