Swift ArgumentParser に version 番号出力がビルトインサポートされる
Swift ArgumentParser に version 番号出力がビルトインサポートされる
以前、Swift ArgumentParser でバージョン番号を出力する方法 - griffin-stewieのブログ というエントリに当時の Swift ArgumentParser で --version
フラグでバージョン番号を出力する方法を紹介しました。その時のエントリでも ArgumentParser 側でサポートされたらいいなということを書いていましたが、1週間前の 3/31 にその機能が実装されました。
Add built-in support for --version flag (#102) · apple/swift-argument-parser@31799bc
まだ、リリースはされていませんが、どのように変わったのかを紹介します。
これまでの実装方法
import ArgumentParser struct MyEcho: ParsableCommand { static var configuration = CommandConfiguration(commandName: "myEcho") struct Version: ParsableArguments { @Flag() var version: Bool func validate() throws { if version { throw CleanExit.message("1.0.0") } } } @OptionGroup() var version: Version @Argument() var text: String func run() throws { print(text) } } MyEcho.main()
上記サンプルコードは前回のエントリで紹介した、必須引数とバージョンフラグの両立をするためのコード例です。--version
フラグでバージョン番号を出力させるために
Version
struct の定義とfunc validate() throws
の実装@OptionGroup
でversion
プロパティを実装
というそれなりの行数を必要としていました。
built-in support された ArgumentParser を使った場合
import ArgumentParser struct MyEcho: ParsableCommand { static var configuration = CommandConfiguration(commandName: "myEcho", version: "1.0.0") @Argument() var text: String func run() throws { print(text) } } MyEcho.main()
CommandConfiguration
のイニシャライザにバージョンの文字列を渡すだけです。これだけで 1.0.0
と出力されるようになります。
ちゃんとヘルプにも --version
フラグがの説明が表示されます。
% myEcho --help USAGE: myEcho <text> ARGUMENTS: <text> OPTIONS: --version Show the version. -h, --help Show help information.
まとめ
- 以前のような
--version
フラグをサポートするだけのためにワークアラウンドは不要になった -v
のようなショートオプションは未サポート- どうしても
--version
以外の指定方法をサポートしたい場合は以前の方法で実装すればよい
- どうしても
- 簡単
蛇足
この機能が実装される Pull Request で唐突に Nate さんから「どう思う?」って聞かれてビビりました。
僕からは
- ヘルプに
--version
フラグの説明ないよ --version
以外の名前のカスタマイズはサポートしないの?
というリアクションをおくったらヘルプメッセージは対応してくれました。カスタマイズに関しては、コード補完機能を実装したあとに検討するようです。