WWDC Quick Look 💓 By SwiftGGTeam
Meet Swift Package plugins

Meet Swift Package plugins

元の動画を見る

ハイライト

Xcode 14 では Swift パッケージ プラグインが導入されており、開発者は Swift スクリプトを使用して Swift パッケージまたは Xcode プロジェクトでカスタム操作を実行できます。これには、寄稿者リストの書式設定や生成などの開発ワークフロー タスク用のコマンド プラグインや、コンパイル時にソース コードとリソースを生成するためのビルド ツール プラグインが含まれます。

主要内容

開発プロセスには、コードの書式設定、データ ファイルに基づくコードの生成、著作権ステートメントの更新、コード インジケーターのカウントなど、繰り返しのタスクが常に存在します。以前は、これらは通常、シェル スクリプトまたは Makefile を使用して解決されていましたが、これらはプロジェクト全体に散在しており、保守が困難でした。

Swift Package Plugins は、これらのタスクを Swift Package システムに組み込みます。プラグイン自体は、他のツール パッケージに依存できる Swift パッケージであり、Xcode またはコマンド ラインを通じて呼び出すことができ、サンドボックスで実行できます。

Xcode 14 は 2 つのプラグインをサポートしています。

コマンド プラグイン: いつでも実行できるカスタム操作。たとえば、SwiftFormat を呼び出してコードをフォーマットしたり、Git 履歴に基づいて貢献者のリストを生成したりできます。ファイル システムに書き込む必要があるプラグインは、ユーザーの承認を要求します。

ビルド ツール プラグイン: ビルド システムの依存関係グラフを拡張します。コンパイル時にソース コードまたはリソースを生成し、入力が変更された場合にのみ再実行し、インクリメンタル コンパイルをサポートします。

Xcode でコマンド プラグインを使用する

アプリ プロジェクトとローカル パッケージで構成されるジオメトリ iOS アプリがあるとします。パッケージを独立したリポジトリに分割する場合は、寄稿者リスト ファイルを生成する必要があります。

パッケージ マニフェストに依存関係を追加できます。

// Package.swift
dependencies: [
    .package(url: "https://github.com/example/SourceCodeUtilities", from: "1.0.0")
]

Xcode が依存関係を取得した後、パッケージを右クリックすると、プラグインによって提供されるコマンドがメニューに表示されます。例えば:

  • 「SwiftFormat でフォーマット」 — コードをフォーマットする
  • 「貢献者の生成」 — Git 履歴に基づいて貢献者のリストを生成します。
  • 「著作権日付の更新」 - 著作権声明の年を更新します。

コマンドを選択した後、プラグインがファイルを変更する必要がある場合、Xcode は許可の確認をポップアップ表示します。プラグインのソース コードをチェックして安全であることを確認し、実行を承認できます。

コマンドライン呼び出し

プラグインはターミナルでも使用できます (08:49):

cd CoreLibs
swift package plugin --list
swift package generate-contributors --allow-writing-to-package-directory
swift package generate-contributors --verbose

--allow-writing-to-package-directoryCI 環境で対話型の確認をスキップするために使用されます。

詳細

プラグインの仕組み

プラグインは、必要に応じてコンパイルされ、独立したプロセスとして実行される Swift スクリプトです (05:56)。

プラグインによって取得される情報:

  • ソースファイルパスを含むパッケージの要約表現
  • パッケージの依存関係情報
  • ビルド出力ディレクトリへの書き込み権限

プラグインはサンドボックス内で実行されます。

  • ネットワークアクセスをブロックする
  • ビルド出力ディレクトリへの書き込みのみを許可します
  • コマンド プラグインは、パッケージのソース コード ディレクトリへの書き込み権限を要求できます。

プラグインでできること:

  • コマンドラインツールを呼び出す
  • ファイルとディレクトリの作成
  • 警告とエラーを Xcode に送信します
  • ビルド ツール プラグインは、Xcode が実行するコンパイル コマンドを定義できます。

コマンドプラグインの実装

コマンドプラグインの主な種類は次のとおりです。CommandPluginプロトコル (08:33):

import PackagePlugin

@main
struct MyPlugin: CommandPlugin {

    /// 操作 Swift Package 时的入口点
    func performCommand(context: PluginContext, arguments: [String]) throws {
        debugPrint(context)
    }
}

#if canImport(XcodeProjectPlugin)
import XcodeProjectPlugin

extension MyPlugin: XcodeCommandPlugin {

    /// 操作 Xcode 项目时的入口点
    func performCommand(context: XcodePluginContext, arguments: [String]) throws {
        debugPrint(context)
    }
}
#endif

キーポイント:

  • @mainエントリーポイントをマークする
  • PluginContextパッケージ情報とツールパスを提供する
  • 条件付きコンパイルを通じて Swift パッケージと Xcode プロジェクトの両方をサポート
  • argumentsユーザーから渡されたカスタムパラメータを受け取る

ビルドツールプラグインの実装

ビルドツールのプラグインは次のとおりですBuildToolPluginプロトコル (11:13):

import PackagePlugin

@main
struct MyPlugin: BuildToolPlugin {

    /// 操作 Swift Package 时的入口点
    func createBuildCommands(context: PluginContext, target: Target) throws -> [Command] {
        debugPrint(context)
        return []
    }
}

#if canImport(XcodeProjectPlugin)
import XcodeProjectPlugin

extension MyPlugin: XcodeBuildToolPlugin {

    /// 操作 Xcode 项目时的入口点
    func createBuildCommands(context: XcodePluginContext, target: XcodeTarget) throws -> [Command] {
        debugPrint(context)
        return []
    }
}
#endif

キーポイント:

  • 戻る[Command]どのビルドコマンドを実行するかを Xcode に指示します
  • アクションを直接実行する代わりに、Xcode が適切なタイミングで実行されるようにコマンドを生成します。
  • インクリメンタルコンパイルのサポート: Xcode は、入力ファイルと出力ファイルのタイムスタンプに基づいて再実行が必要かどうかを判断します。

2 つのビルド コマンド

通常のビルド コマンド (BuildCommand): 入力パスと出力パスを指定し、出力が見つからない場合、または入力が変更された場合にのみ実行します (11:40)。

PrebuildCommand: コンパイルの開始前に実行され、出力ファイル名が事前に不明な場合に使用されます。ビルドごとに実行されるため、作業の重複を最小限に抑えるようにしてください。

パッケージでプラグインの依存関係を宣言する

SwiftPM 5.6+ はターゲット定義に追加しますpluginsパラメータ (12:14):

// Package.swift
targets: [
    .target(
        name: "CoreLibs",
        dependencies: [],
        plugins: [
            .plugin(name: "SourceGenerator", package: "SourceCodeUtilities")
        ]
    )
]

追加後、Xcode は対応するターゲットをコンパイルするときにプラグインを自動的に呼び出します。生成されたコードはビルド ディレクトリに保存されるため、バージョン管理に送信する必要はありません。

実際のケース: コード生成

いくつかのデータ ファイルがあり、それらに基づいてタイプ セーフな Swift アクセサーを生成する必要があるとします。以前のアプローチは次のとおりです。

  1. コード生成ツールを手動で実行します。
  2. 生成されたコードをウェアハウスに送信します
  3. データ ファイルが変更された場合は、上記の手順を繰り返します。

ビルド ツール プラグインを使用した後:

  1. パッケージにプラグインの依存関係を追加する 2.ターゲット内pluginsパラメータ内のプラグインを参照する
  2. ウェアハウス内の生成されたコードを削除します
  3. Xcode はコンパイル中にコード生成ツールを自動的に呼び出します。

この方法で生成されたコードは常にデータ ファイルと同期され、ウェアハウスがよりクリーンになります。

重要ポイント

1.自動コードフォーマットワークフロー

対処方法: チームが送信する前にコードを自動的にフォーマットするように SwiftFormat コマンド プラグインを構成します。

実行する価値がある理由: プラグインを Git のコミット前フックに統合すると、チームのコード スタイルの一貫性が確保され、書式設定の問題を手動でレビューする必要がなくなります。

開始方法: SwiftFormat プラグインの依存関係を追加し、ラッパー プラグイン呼び出しを作成します。swift package plugin --allow-writing-to-package-directory format

2. API定義からクライアントコードを生成

対処方法: OpenAPI/Swagger 定義ファイルに基づいて Swift ネットワーク リクエスト コードを自動的に生成するビルド ツール プラグインを作成します。

実行する価値がある理由: API が変更されたときにクライアント コードを自動的に再生成し、手書きのリクエスト コードがバックエンドと同期していないという問題を回避します。

開始方法: 使用するPrebuildCommandモニター.yamlファイルが変更されたら、コード生成ツールを呼び出して、Swift ファイルをビルド ディレクトリに出力します。

3.ローカライズされたリソース ジェネレーター

機能: Excel/CSV 変換テーブルから自動的に生成Localizable.stringsおよびタイプセーフな Swift 文字列列挙型。

実行する価値がある理由: 翻訳者がフォームを変更すると、翻訳漏れやキー名のスペル エラーを避けるために、コンパイル中にすべてのプラットフォームのローカリゼーション ファイルが自動的に更新されます。

開始方法: CSV ファイルを解析して言語ごとに生成します.stringsファイルを作成し、Swift 列挙を生成してコンパイル時のキー名チェックを提供します。

4.アイコンとカラーリソースの生成

機能: Figma/Sketch からエクスポートされた SVG ファイルから Xcode アセット カタログと SwiftUI を自動的に生成しますImage/Color拡大。

実行する価値がある理由: デザイナーがアイコンを更新した後、開発者はファイルを手動でドラッグ アンド ドロップする必要がなく、再コンパイルするだけで最新のリソースを取得できます。

開始方法: 使用するBuildCommandSVG ファイルの変更を監視し、生成する@2x/@3xPNG と対応する Swift コード。

5.テストカバレッジレポートプラグイン

対処法: テストの実行後に HTML カバレッジ レポートを生成し、未カバーのコード領域を強調表示するコマンド プラグインを作成します。

実行する価値がある理由: Xcode のカバレッジ ビュー機能は制限されており、カスタム レポートはモジュールおよびファイルごとの統計を提供できるため、チームのレポートに適しています。

開始方法: 電話するxcodebuild test得る.xcresult、カバレッジ データを解析し、S​​wift を使用して HTML レポートを生成します。

関連セッション

コメント

GitHub Issues · utterances