$30 off During Our Annual Pro Sale. View Details »

SwiftPMのPlugin入門 / introduction_to_swiftpm_plugin

uhooi
January 17, 2023

SwiftPMのPlugin入門 / introduction_to_swiftpm_plugin

【オフライン開催】Voicy Tech Bar #1
https://voicy.connpass.com/event/269791/

## 参考リンク

### Build Tool Plugin

#### Build Tool Plugin を提供している主な CLI ツール

- 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 の公式ドキュメント

- 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 の導入記事
https://qiita.com/uhooi/items/c051d2f503f77d7f4193

### Command Plugin

#### Command Plugin を提供している主な CLI ツール

- 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 の公式ドキュメント

- SE-0332: Package Manager Command Plugins
https://github.com/apple/swift-evolution/blob/main/proposals/0332-swiftpm-command-plugins.md

#### その他

- Command Plugin をラップした Makefile
https://github.com/uhooi/Loki/blob/3061f10556696c50d8c3545b2be0175a1e63b311/LokiPackage/Makefile

uhooi

January 17, 2023
Tweet

More Decks by uhooi

Other Decks in Programming

Transcript

  1. SwiftPM の

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

    View Slide

  2. iOS app developer @uhooi
    @uhooi
    @the_uhooi

    View Slide

  3. SwiftPM の Plugin を使ったことが

    あるよって人〜?

    View Slide

  4. LT の目的

    SwiftPM の Plugin の

    概要を理解し、iOS アプリ開発で

    導入できるようにする

    View Slide

  5. そもそも Plugin って何?

    View Slide

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

    View Slide

  7. ・Swift Package Manager 5.6 で追加された機能

    ・CLI ツールを SwiftPM で使いやすくラップしたもの
    「Plugin」とは?
    これだけでも覚えて

    帰ってください

    View Slide

  8. Swift Package Manager 5.7.1 現在、Plugin は2種類ある

    (5.6 から変わっていない)


    ・Build Tool Plugin

    ・Command Plugin
    Plugin の種類

    View Slide

  9. 01 Build Tool Plugin

    View Slide

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

    View Slide

  11. ・ビルド時に自動で実行するプラグイン

    入出力がはっきりしていて、成果物(出力)を

     ビルドに含めたいときに使う

     いい感じにキャッシュしてくれる
    「Build Tool Plugin」とは?

    View Slide

  12. ・ビルド時に自動で実行するプラグイン

    入出力がはっきりしていて、成果物(出力)を

     ビルドに含めたいときに使う

     いい感じにキャッシュしてくれる

    成果物がない(リント)

     パッケージ内のファイルの更新(フォーマット)
    「Build Tool Plugin」とは?

    View Slide

  13. Build Tool Plugin の導入
    // Package.swift

    // ...

    dependencies: [

    .package(url: "https://github.com/SwiftGen/SwiftGenPlugin", from: "6.6.2"),

    ],
    プラグインのリポジトリを

    依存関係に追加する

    View Slide

  14. Build Tool Plugin の導入
    // Package.swift

    // ...

    targets: [

    .target(

    // ...

    plugins: [

    .plugin(name: "SwiftGenPlugin", package: "SwiftGenPlugin"),

    ]),

    ]
    適用するターゲットごとに

    プラグインを指定する

    View Slide

  15. ・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 ツール

    View Slide

  16. ・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 の公式ドキュメント
    プロポーザルしか公式ドキュメントがない

    (ほかにあったら教えてほしいです)

    View Slide

  17. 02 Command Plugin

    View Slide

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

    View Slide

  19. ・手動で実行するプラグイン

    ・swift package {verb} {arguments} で実行する

    ・Xcode 上からも実行できる
    「Command Plugin」とは?

    View Slide

  20. ・手動で実行するプラグイン

    ・swift package {verb} {arguments} で実行する

    ・Xcode 上からも実行できる

    出力がなくてもいい(リント)

     入力がはっきりしていなくてもいい(全ファイル対象)

     パッケージ内のファイルを更新できる(フォーマット)
    「Command Plugin」とは?

    View Slide

  21. Command Plugin の導入
    // Package.swift

    // ...

    dependencies: [

    .package(url: "https://github.com/SwiftGen/SwiftGenPlugin", from: "6.6.2"),

    ],
    プラグインのリポジトリを

    依存関係に追加するのみ

    View Slide

  22. ・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 の確認に便利

    View Slide

  23. ・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 ツール

    View Slide

  24. ・SE-0332: Package Manager Command Plugins

     https://github.com/apple/swift-evolution/blob/main/proposals/0332-swiftpm-
    command-plugins.md
    Command Plugin の公式ドキュメント
    プロポーザルしか公式ドキュメントがない

    (ほかにあったら教えてほしいです)

    View Slide

  25. 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

    View Slide

  26. 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 は省略できる

    っぽい

    View Slide

  27. 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
    パッケージ内のファイルを

    更新する際に付ける

    View Slide

  28. 03 まとめ

    View Slide

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

    View Slide

  30. ・SwiftPM 5.6 で追加されたプラグイン機能は便利

    ・モジュール分割を Swift Package で行うと、

     プラグインを導入しやすい
    まとめ

    View Slide

  31. ・SwiftPM 5.6 で追加されたプラグイン機能は便利

    ・モジュール分割を Swift Package で行うと、

     プラグインを導入しやすい

    ・まだ公式ドキュメントや導入記事が少ない


    ホントは Plugin ファイルや Artifact bundle についても話したかったけど時間が足りない…
    まとめ

    View Slide

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

    View Slide