Slide 1

Slide 1 text

SwiftPM の Plugin 入門 2023.01.17(Tue) Voicy Tech Bar #1 @the_uhooi

Slide 2

Slide 2 text

iOS app developer @uhooi @uhooi @the_uhooi

Slide 3

Slide 3 text

SwiftPM の Plugin を使ったことが あるよって人〜?

Slide 4

Slide 4 text

LT の目的 SwiftPM の Plugin の 概要を理解し、iOS アプリ開発で 導入できるようにする

Slide 5

Slide 5 text

そもそも Plugin って何?

Slide 6

Slide 6 text

・Swift Package Manager 5.6 で追加された機能 「Plugin」とは?

Slide 7

Slide 7 text

・Swift Package Manager 5.6 で追加された機能 ・CLI ツールを SwiftPM で使いやすくラップしたもの 「Plugin」とは? これだけでも覚えて 帰ってください

Slide 8

Slide 8 text

Swift Package Manager 5.7.1 現在、Plugin は2種類ある (5.6 から変わっていない) ・Build Tool Plugin ・Command Plugin Plugin の種類

Slide 9

Slide 9 text

01 Build Tool Plugin

Slide 10

Slide 10 text

・ビルド時に自動で実行するプラグイン 「Build Tool Plugin」とは?

Slide 11

Slide 11 text

・ビルド時に自動で実行するプラグイン 入出力がはっきりしていて、成果物(出力)を  ビルドに含めたいときに使う  いい感じにキャッシュしてくれる 「Build Tool Plugin」とは?

Slide 12

Slide 12 text

・ビルド時に自動で実行するプラグイン 入出力がはっきりしていて、成果物(出力)を  ビルドに含めたいときに使う  いい感じにキャッシュしてくれる 成果物がない(リント)  パッケージ内のファイルの更新(フォーマット) 「Build Tool Plugin」とは?

Slide 13

Slide 13 text

Build Tool Plugin の導入 // Package.swift // ... dependencies: [ .package(url: "https://github.com/SwiftGen/SwiftGenPlugin", from: "6.6.2"), ], プラグインのリポジトリを 依存関係に追加する

Slide 14

Slide 14 text

Build Tool Plugin の導入 // Package.swift // ... targets: [ .target( // ... plugins: [ .plugin(name: "SwiftGenPlugin", package: "SwiftGenPlugin"), ]), ] 適用するターゲットごとに プラグインを指定する

Slide 15

Slide 15 text

・SwiftGen  https://github.com/SwiftGen/SwiftGenPlugin ・R.swift  https://github.com/mac-cain13/R.swift#packageswift-based-spm-project ・swift-protobuf  https://github.com/apple/swift-protobuf/blob/main/Sources/protoc-gen-swift/ Docs.docc/spm-plugin.md Build Tool Plugin を提供している主な CLI ツール

Slide 16

Slide 16 text

・SE-0303: Package Manager Extensible Build Tools  https:/ /github.com/apple/swift-evolution/blob/main/proposals/0303-swiftpm- extensible-build-tools.md ・SE-0325: Additional Package Plugin APIs  https:/ /github.com/apple/swift-evolution/blob/main/proposals/0325-swiftpm- additional-plugin-apis.md Build Tool Plugin の公式ドキュメント プロポーザルしか公式ドキュメントがない (ほかにあったら教えてほしいです)

Slide 17

Slide 17 text

02 Command Plugin

Slide 18

Slide 18 text

・手動で実行するプラグイン 「Command Plugin」とは?

Slide 19

Slide 19 text

・手動で実行するプラグイン ・swift package {verb} {arguments} で実行する ・Xcode 上からも実行できる 「Command Plugin」とは?

Slide 20

Slide 20 text

・手動で実行するプラグイン ・swift package {verb} {arguments} で実行する ・Xcode 上からも実行できる 出力がなくてもいい(リント)  入力がはっきりしていなくてもいい(全ファイル対象)  パッケージ内のファイルを更新できる(フォーマット) 「Command Plugin」とは?

Slide 21

Slide 21 text

Command Plugin の導入 // Package.swift // ... dependencies: [ .package(url: "https://github.com/SwiftGen/SwiftGenPlugin", from: "6.6.2"), ], プラグインのリポジトリを 依存関係に追加するのみ

Slide 22

Slide 22 text

・swift package plugin --list で導入されている  Command Plugin の一覧を出力する Command Plugin の確認 $ swift package plugin --list ‘generate-manual’ (plugin ‘Generate Manual’ in package ‘swift-argument-parser’) ‘generate-code-for-resources’ (plugin ‘SwiftGen-Generate’ in package ‘SwiftGenPlugin’) verb の確認に便利

Slide 23

Slide 23 text

・swift-docc-plugin  https://github.com/apple/swift-docc-plugin ・swift-format (ドキュメントはまだない)  https://github.com/apple/swift-format ・SwiftFormat  https://github.com/nicklockwood/SwiftFormat/blob/master/README.md#swift- package-manager-plugin Command Plugin を提供している主な CLI ツール

Slide 24

Slide 24 text

・SE-0332: Package Manager Command Plugins  https://github.com/apple/swift-evolution/blob/main/proposals/0332-swiftpm- command-plugins.md Command Plugin の公式ドキュメント プロポーザルしか公式ドキュメントがない (ほかにあったら教えてほしいです)

Slide 25

Slide 25 text

Tips: Makefile でラップすると使いやすい // Makefile .PHONY: lint lint: swift package plugin lint-source-code .PHONY: format format: swift package plugin --allow-writing-to-package-directory format-source-code

Slide 26

Slide 26 text

Tips: Makefile でラップすると使いやすい // Makefile .PHONY: lint lint: swift package plugin lint-source-code .PHONY: format format: swift package plugin --allow-writing-to-package-directory format-source-code plugin は省略できる っぽい

Slide 27

Slide 27 text

Tips: Makefile でラップすると使いやすい // Makefile .PHONY: lint lint: swift package plugin lint-source-code .PHONY: format format: swift package plugin --allow-writing-to-package-directory format-source-code パッケージ内のファイルを 更新する際に付ける

Slide 28

Slide 28 text

03 まとめ

Slide 29

Slide 29 text

・SwiftPM 5.6 で追加されたプラグイン機能は便利 まとめ

Slide 30

Slide 30 text

・SwiftPM 5.6 で追加されたプラグイン機能は便利 ・モジュール分割を Swift Package で行うと、  プラグインを導入しやすい まとめ

Slide 31

Slide 31 text

・SwiftPM 5.6 で追加されたプラグイン機能は便利 ・モジュール分割を Swift Package で行うと、  プラグインを導入しやすい ・まだ公式ドキュメントや導入記事が少ない ホントは Plugin ファイルや Artifact bundle についても話したかったけど時間が足りない… まとめ

Slide 32

Slide 32 text

Build Tool Plugin の導入記事を書きました