Package Manager Command Names
01 何が問題だったのか
Swift Package Manager(SwiftPM)は、登場当初 swift build と swift test という2つのトップレベルコマンドで機能を提供していました。この2コマンドはSwiftと密接に統合されていることを示しやすく、swift のサブコマンドとして発見しやすいという利点がありました。
しかし、パッケージマネージャの役割が「ビルドする」「テストする」だけにとどまらず、新しいパッケージの雛形生成や依存パッケージの更新といった操作にも広がってくると、これらをすべて swift build のオプションとして提供する運用に無理が出てきました。実際、当時は次のようにフラグで表現されていました。
$ swift build --init
$ swift build --fetch
$ swift build --update
$ swift build --generate-xcodeproj
これらはどれも「ビルドを修飾するフラグ」ではなく、それ自体がひとつの独立したコマンドです。にもかかわらずビルドコマンドのフラグとして実装されていたため、名前と役割の対応が分かりにくく、パッケージマネージャの機能を今後拡張していく際の窮屈さにもつながっていました。
サブコマンドで表すべきものをフラグで表すのをやめ、今後増えていくパッケージマネージャの機能を、すっきりと、そして分かりやすく呼び出せる構文を整える必要がありました。
02 どのように解決されるのか
新しくトップレベルコマンド swift package を導入し、パッケージマネージャの各種機能をそのサブコマンドとして整理します。一方で、頻繁に使われる swift build と swift test は、利便性のためトップレベルコマンドとして残します。
フラグからサブコマンドへ
これまで swift build のフラグとして提供されていた操作は、swift package のサブコマンドとして置き換えられます。
$ swift build --init → $ swift package init
$ swift build --fetch → $ swift package fetch
$ swift build --update → $ swift package update
$ swift build --generate-xcodeproj → $ swift package generate-xcodeproj
一方、--configuration のように「ビルドそのものの挙動を修飾する」フラグは、今までどおり swift build のフラグとして残ります。今後新しく機能を追加するときは、それが独立したコマンドとして意味を持つなら swift package のサブコマンドとして、既存コマンドの挙動を変えるだけなら該当サブコマンドのフラグとして加える、という方針が示されます。
移行期間として、旧来の swift build --init などのフラグ形式も当面はエイリアスとしてしばらく受け付けられますが、Swift 3のリリースまでに削除される、とされていました。
swift build / swift test の位置づけ
swift build と swift test は、それぞれ swift package build と swift package test の別名として動作します。実装としてはSwiftの多機能ツール(multitool)が swift-package ツールを呼び出す形に一本化されますが、利用者から見ると次のどちらでも同じことができます。
$ swift build
$ swift package build
$ swift test
$ swift package test
推奨される呼び出し方は、短い swift build / swift test のほうです。swift package build / swift package test も動作はしますが、普段使いのエントリポイントとしては swift 直下の2コマンドが想定されています。
命名についての判断
このコマンド体系を決めるにあたり、より短いコマンド名として swift pm や独立した swiftpm コマンドなども検討されました。最終的には、Swiftの命名慣習に沿って略さずに綴る swift package が採用されています。swift package は頻繁には打たないコマンドであること、頻出の build と test は swift 直下に露出していて短く書けることから、全体としては冗長になりすぎないという判断です。短い別名が必要だと分かった時点で、後から swiftpm のようなエイリアスを追加する余地は残されています。
利用者として知っておくべきこと
- 新しくパッケージを作ったり、依存を更新したりといった操作は、
swift build --…ではなくswift package <subcommand>で行うのが標準の形です。今日のSwiftPMで目にするswift package initやswift package updateといったコマンド体系は、この提案で定められたものです。 - 普段のビルドとテストは、従来どおり
swift buildとswift testで実行できます。これらはswift package build/swift package testの短縮形という位置づけです。