Slide 1

Slide 1 text

isowords の構成で 3週間 開発して得た知見 2021/05/19 CA.swift #14 1

Slide 2

Slide 2 text

● iOS エンジニア として 21新卒入社 ● 出身地:北海道恵庭市 ● 出身校:会津大学 ● 配属:メディア(ABEMA) @ry_itto
 ry-itto
 伊藤凌也
 (いとうりょうや)
 2

Slide 3

Slide 3 text

話すこと ● isowords とは ● 従来のプロジェクト管理について ● SPM+xcworkspace プロジェクト管理 ○ メリット ○ デメリット ○ パッケージ管理について ■ CocoaPods ■ Carthage ○ ツール周り ● まとめ 3

Slide 4

Slide 4 text

isowords とは ● Point-Free の作った SwiftUI, SceneKit を使ったゲームアプリ ● SPM を使用したプロジェクト・パッケージ管理 をしている ● アセットの管理に git-lfs を使用している ● アーキテクチャは Composable Architecture 4

Slide 5

Slide 5 text

従来のプロジェクト管理 5

Slide 6

Slide 6 text

従来の プロジェクト管理 種類 大きく分けて二つ ● Pure な XcodeProject で構成 ● XcodeGen, Tuist 等で Project ファイルを生成せず構成 6 OR

Slide 7

Slide 7 text

従来の プロジェクト管理 課題 大きく分けて二つ ● Pure な XcodeProject で構成 project.pbxproj でのコンフリクト 多発 ● XcodeGen, Tuist 等で Project ファイルを生成せず構成 → ツールメンテナーが対応しないと 新規機能など使用できない → 外部ツール依存が増える 7

Slide 8

Slide 8 text

SPM + xcworkspace プロジェクト管理 8

Slide 9

Slide 9 text

SPM + xcworkspace プロジェクト管理 概要 ● アプリのソースを Swift Package として切り出した上で吐き出し、アプ リケーションターゲットで使用する方 法 ● ターゲットごとにリソースを持たせた りできる 9

Slide 10

Slide 10 text

10 ライブラリを吐き出す Framework に追加する

Slide 11

Slide 11 text

メリット その1 ● ソースファイルを project.pbxproj で認識する必要がない ● Pacakge.swift を使用して自由に ターゲットを作成できる ● 外部のツールが必要ない ● Xcode で使える新機能が導入タイ ミングから使える 11

Slide 12

Slide 12 text

メリット その2 ● プロジェクトごとアプリを分けること が懸念なくできる 12

Slide 13

Slide 13 text

メリット つまり ● ソースファイルを project.pbxproj で認識する必要がない → コンフリクトが(ほぼ)しない ● Pacakge.swift を使用して自由に ターゲットを作成できる → マルチモジュール化が容易 → 差分ビルドを用いたビルド速度改 善が図れる 13

Slide 14

Slide 14 text

メリット つまり ● ソースファイルを project.pbxproj で認識する必要がない → コンフリクトが(ほぼ)しない ● Pacakge.swift を使用して自由に ターゲットを作成できる → マルチモジュール化が容易 → 差分ビルドを用いたビルド速度改 善が図れる 14 XcodeGen や Tuist を使用するこ とによる美味しさも持っている

Slide 15

Slide 15 text

メリット つまり ● 外部のツールが必要ない ● Xcode で使える新機能が導入タイ ミングから使える ● プロジェクトごとアプリを分けること が懸念なくできる 15 他にないメリットも兼ね備えている

Slide 16

Slide 16 text

デメリット ● Swift Package Sources 配下に ファイルを追加すると一定時間ビル ドができなくなる ● SwiftUI Previews が使えなくなる 場合がある ● Package.swift を更新してもたまに “Resolving Package Graph” が 行われない 16

Slide 17

Slide 17 text

デメリット ● Swift Package Sources 配下に ファイルを追加すると一定時間ビル ドができなくなる ● SwiftUI Previews が使えなくなる 場合がある ● Package.swift を更新してもたまに “Resolving Package Graph” が 行われない 17 「できるはずのこと」ができない状態となっ てしまう(たまに)

Slide 18

Slide 18 text

パッケージ管理 ● 基本的には SwiftPM経由でパッ ケージを入れるのが一番楽 ● CocoaPods, Carthage 経由で入 れたものも導入は可能 ● *.framework のみが公開されてい るものはそのままでは導入できない 18

Slide 19

Slide 19 text

パッケージ管理 Carthage ● carthage での Pre-build 時に XCFramework を生成すればOK ● 使い方 19

Slide 20

Slide 20 text

パッケージ管理 CocoaPods ● Pods のプロジェクトをそのまま依存 に入れるのは難しかった → Pre-build する ● そもそもどうしてこれがしたい? → Podfile しかないライブラリがた まにある。。 サンプル https://github.com/ry-itto-playground/SPM-coc oapods 20

Slide 21

Slide 21 text

パッケージ管理 CocoaPods 21

Slide 22

Slide 22 text

パッケージ管理 CocoaPods ● なぜ自前でビルドのスクリプトを書い たのか? → cocoapods-binary では xcframework で吐き出せなかった ため。 22

Slide 23

Slide 23 text

ツール周り 配置 Mint 等を使用しない Swift 製ツールの 導入 ※ SPM + xcworkspace プロジェクト管 理 じゃなくても使用可能。 23

Slide 24

Slide 24 text

ツール周り 追加方法 普通に dependencies に .package で Swift製ツールを追加するだけ 24

Slide 25

Slide 25 text

ツール周り 使い方 プロジェクトルートで --pacakge-path Tools を指定してツールを実行するだけ (swift run だと実行に若干のタイムラグ があるので、事前にビルドして使うのが良 いかもしれない) 25

Slide 26

Slide 26 text

ツール周り ありそうな質問 アプリ自体の Package.swift と同じとこ ろに依存を追加して使ってはダメなんで すか? 26 ダメです。追加したパッケージのどれか一 つでも iOS/macOS に対応していない場 合アプリもビルドすることができなくなりま す

Slide 27

Slide 27 text

ツール周り つまりどころ 追加したパッケージが依存しているパッ ケージのバージョンが全く違うとエラーと なる 27 追加したパッケージの依存しているパッ ケージのバージョンを上げる or 追加したいパッケージ用に Package.swift を作る

Slide 28

Slide 28 text

まとめ 28

Slide 29

Slide 29 text

まとめ ● メリットを享受したければ XcodeGen を使うだけでも良さそう ● XcodeGenを使用して開発する際に比べてストレスは多そう ● XcodeGen 等が持っていないメリットを考えても絶対的な選定理由には ならなさそう (”プロジェクトごとアプリを分けることが懸念なくできる” 次第) ● まずは個人開発から導入して試してみると良さそう ● 構成自体は非常に面白い ● 固まるとかそれ以外の懸念がない 29

Slide 30

Slide 30 text

まとめ 30 プロダクションに導入しても良さそうか? 導入自体難しくない。 でもどちらのストレスの方が耐えられるのか十分に検証した方が良い

Slide 31

Slide 31 text

References ● A Tour of isowords: Part 1 ● A Tour of isowords: Part 2 ● Swift PMとマルチプロジェクトでBuild Configurationをクリーンに保つ ● https://github.com/pointfreeco/isowords 31