梱包計画を作る
Package.swift と xtool.yml を読み、アプリ本体と App Extension に対応するライブラリ製品、リソース、Info.plist、entitlements を決めます。xtool.yml がなければ com.example を組織 ID として続行します。
Cross-platform Xcode replacement / xtool-org/xtool
xtool は、Xcode のビルド・署名・実機インストールを置き換える CLI です。SwiftPM パッケージを iOS アプリ(.app / .ipa)に組み立て、Apple Developer Services で証明書とプロビジョニングプロファイルを用意し、USB で接続した iPhone へインストールします。
CLI は Linux、WSL、macOS で動きます。Linux と WSL では、Apple が配布する Xcode.xip から iOS 用の Swift SDK を生成して使います。macOS ではインストール済みの Xcode の SDK を使いますが、Xcode のビルドシステムは使いません。
言語: Swift 6(strict concurrency)· 配布: Linux は AppImage、macOS は Homebrew または xtool.app · 作者: Kabir Oberai
リポジトリは 1 つの Swift Package です。CLI 本体とは別に、署名や実機操作を担う XKit をライブラリとして公開しています。
| ターゲット | 役割 |
|---|---|
xtool / XToolSupport | CLI の入口とサブコマンド(setup、dev、sdk、auth など) |
PackLib | xtool.yml の読み込み、SwiftPM の依存グラフからの梱包計画(Planner)、.app の組み立て(Packer)、Xcode プロジェクト生成 |
XKit | Apple Developer Services への認証(GrandSlam / API キー)、証明書・App ID・プロファイルの発行、署名、実機へのインストール。iOS でも動く |
DeveloperAPI | App Store Connect API の OpenAPI 定義から生成したクライアント |
XcodeProjects | xtool dev generate-xcode-project 用の .xcodeproj 書き出し |
自作アプリから XKit を使う場合は、SwiftPM の依存に追加します。
// package dependency:
.package(url: "https://github.com/xtool-org/xtool", .upToNextMinor(from: "1.2.0"))
// target dependency:
.product(name: "XKit", package: "xtool")xtool dev の流れxtool dev は xtool dev run の省略形です。パッケージのルートで実行すると、ビルドから起動可能な状態までを 1 回で進めます。
Package.swift と xtool.yml を読み、アプリ本体と App Extension に対応するライブラリ製品、リソース、Info.plist、entitlements を決めます。xtool.yml がなければ com.example を組織 ID として続行します。
ターゲット arm64-apple-ios で SwiftPM がビルドし、Packer が xtool/<App>.app を組み立てます。初回は iOS SDK のモジュールをビルドするため数分かかります。
デバイスを Apple ID に登録し、証明書・App ID・プロファイルを用意して署名し、インストールします。進捗は Provisioning、Signing、Installing などの段階で表示されます。
Hello$ xtool dev
Planning...
Building for debugging...
Build of product 'Hello-App' complete! (4.94s)
Waiting for device to be connected...
Installing to device: Kabir's iPhone (udid: *****)
[Unpacking app] 100%
[Logging in] 100%
[Preparing device] 100%
[Provisioning] 100%
[Signing] 100%
[Packaging] 100%
[Connecting] 100%
[Installing] 100%
[Verifying] 100%xtool dev run --simulator で arm64-apple-ios-simulator 向けにビルドし、iOS Simulator へインストールします。この場合はログインもデバイス接続も不要です。| 項目 | Linux / WSL | macOS |
|---|---|---|
| Swift | Swift 6.4 ツールチェーン(swift.org から) | Xcode 同梱の Swift |
| iOS SDK | Xcode.xip(Xcode 27)から xtool setup が生成 | インストール済み Xcode の SDK |
| デバイス接続 | usbmuxd。WSL は USBIPD で USB をパススルー | OS 標準 |
| xtool 本体 | GitHub Release の xtool-<arch>.AppImage | brew install xtool-org/tap/xtool または xtool.app |
# 前提: Swift 6.4 と usbmuxd を入れ、Xcode.xip をブラウザーでダウンロードしておく
swift --version
sudo apt-get install usbmuxd
# xtool を PATH に置く
curl -fL \
"https://github.com/xtool-org/xtool/releases/latest/download/xtool-$(uname -m).AppImage" \
-o xtool
chmod +x xtool
sudo mv xtool /usr/local/bin/
# ログインと SDK の生成
xtool setup
swift sdk list # darwin が表示されれば完了xtool setup のログイン方式| 方式 | 条件 | 仕組み |
|---|---|---|
| API Key(推奨) | 有料の Apple Developer Program | 公開 API の App Store Connect API。App Manager ロールの Team Key を発行して入力する |
| Password | 任意の Apple ID(無料アカウント可) | メールアドレス・パスワード・2FA で Apple の非公開 API に認証する |
curl では取得できません。xtool setup でファイルのパスを入力すると、展開して Darwin 用の Swift SDK をインストールします。SDK は後から xtool sdk で更新・削除できます。xtool new Hello でテンプレートを作ります。Package.swift、xtool.yml、.bsp/xtool.json、SwiftUI の HelloApp.swift と ContentView.swift が生成されます。Hello ディレクトリで xtool dev を実行します。xtool dev を再実行します。Developer$ xtool new Hello
Creating package: Hello
Creating Package.swift
Creating xtool.yml
Creating .gitignore
Creating .bsp/xtool.json
Creating Sources/Hello/HelloApp.swift
Creating Sources/Hello/ContentView.swift.bsp/xtool.json は Build Server Protocol 経由で xtool にビルド情報を問い合わせる設定です。VS Code なら Swift 拡張を入れれば、iOS SDK の型にもホバーで説明が出ます。コードを直したら xtool dev を再実行します。2 回目以降はキャッシュが効きます。xtool.yml の設定SwiftPM のライブラリをどう iOS アプリに梱包するかを書くファイルです。version: 1 と、bundleID または orgID のどちらかが必須です。
| キー | 内容 |
|---|---|
bundleID / orgID | バンドル ID。orgID の場合は <orgID>.<製品名> になる |
product | アプリ本体にするライブラリ製品。製品が複数あるときに指定する |
infoPath | 追加・上書きしたいキーだけを書いた Info.plist。自動生成の内容にマージされる |
entitlementsPath | entitlements の plist |
iconPath | アプリアイコン。PNG のみ |
resources | アプリバンドル直下に置くファイル。通常のリソースは SwiftPM の resources: で足りる |
extensions | App Extension の一覧。各項目に product と infoPath が必須 |
skipLSP | .bsp/xtool.json の自動作成を止める |
Package.swift に HelloWidget ライブラリを追加したうえで、アプリ本体と拡張を区別します。
version: 1
bundleID: com.example.Hello
product: Hello
extensions:
- product: HelloWidget
infoPath: HelloWidget-Info.plist| 区分 | コマンド | 内容 |
|---|---|---|
| 設定 | setup | ログインと SDK の準備をまとめて行う |
| 設定 | auth login / logout / status | Apple Developer Services の認証 |
| 設定 | sdk build / install / update / remove / status | Darwin Swift SDK の管理 |
| 開発 | new | テンプレートからプロジェクトを作る |
| 開発 | dev(= dev run) | ビルドして実機またはシミュレーターで実行 |
| 開発 | dev build [--sign] [--ipa] | ビルドのみ。--sign で署名、--ipa で .ipa を出力 |
| 開発 | dev generate-xcode-project | macOS で Xcode を使いたいときの .xcodeproj を生成 |
| 開発 | ds teams / devices / identifiers / certificates / profiles | Developer Services 上の資源を一覧する |
| デバイス | devices / install / uninstall / launch | 接続中デバイスの一覧、.ipa のインストール、削除、起動 |
XTL-1234.com.example.Hello。無料アカウント同士で同じバンドル ID を使えないため、共有時の衝突を避ける措置です。AFCClient.Error.muxError が出る場合は、Windows 側の iTunes 経由で接続を中継する方法が issue #19 で案内されています。brew upgrade で更新できます。xtool new から実機での起動まで