最近あんまり Swift でプログラムを書いていなかったので、Swift で コマンドラインツール を作り始めました。

環境は Swift 5.3.2。
Xcode 12.3 についてる Swift です。

$ swiftc -v
Apple Swift version 5.3.2 (swiftlang-1200.0.45 clang-1200.0.32.28)
Target: x86_64-apple-darwin20.2.0

Swift でコマンドラインツールを作るには、Swift Package Manager(SwiftPM) で作る方法と、Xcode で作る方法があるようです。
どんな違いがあるか両方で作って違いを確かめてみました。

SwiftPM で作るコマンドラインツール

swift package init--type executableを指定すると

$ mkdir Swift-CLI
$ cd Swift-CLI
$ swift package init --type executable
Creating executable package: Swift-CLI
Creating Package.swift
Creating README.md
Creating .gitignore
Creating Sources/
Creating Sources/Swift-CLI/main.swift
Creating Tests/
Creating Tests/LinuxMain.swift
Creating Tests/Swift-CLITests/
Creating Tests/Swift-CLITests/CLITests.swift
Creating Tests/Swift-CLITests/XCTestManifests.swift

swift run コマンドで実行可能なソースが生成されます。

$ swift run Swift-CLI
[3/3] Linking Swift-CLI
Hello, world!

swift package generate-xcodeprojで、xcodeprojを生成するとXcodeで開発できるようになります。

$ swift package generate-xcodeproj
generated: ./Swift-CLI.xcodeproj

ちなみに、swift testでテストも実行可能です。

$ swift test
[4/4] Linking Swift-CLIPackageTests
Test Suite 'All tests' started at 2021-01-01 00:17:57.893
Test Suite 'Swift-CLIPackageTests.xctest' started at 2021-01-01 00:17:57.894
Test Suite 'Swift_CLITests' started at 2021-01-01 00:17:57.894
Test Case '-[Swift_CLITests.Swift_CLITests testExample]' started.
Test Case '-[Swift_CLITests.Swift_CLITests testExample]' passed (0.101 seconds).
Test Suite 'Swift_CLITests' passed at 2021-01-01 00:17:57.995.
	 Executed 1 test, with 0 failures (0 unexpected) in 0.101 (0.101) seconds
Test Suite 'Swift-CLIPackageTests.xctest' passed at 2021-01-01 00:17:57.995.
	 Executed 1 test, with 0 failures (0 unexpected) in 0.101 (0.101) seconds
Test Suite 'All tests' passed at 2021-01-01 00:17:57.995.
	 Executed 1 test, with 0 failures (0 unexpected) in 0.101 (0.102) seconds

Xcode から作るコマンドラインツール

Xcodeのプロジェクト新規作成からCommandLineToolを選択すると、main.swift.xcodeprojだけでシンプルすぎるプロジェクトができます。
Swift-CLIという名前で作成した時のディレクトリ構成は下記。

Swift-CLI/main.swift 
Swift-CLI.xcodeproj

Xcode から run することはできますが、terminal からの実行は swift runswift test もできませんでした。

というわけで、特別な理由がない限りは Xcode から作らない方がよさそうです。