こんにちは、コミュニケーションアプリ「LINE」のiOSクライアントアプリにおいて開発基盤を担当している、モバイル・ディベロッパーエクスペリエンスチーム所属のfreddiです。
最近、LINEのiOSプロジェクトでは、社内のアプリ開発者向けにDocCドキュメントを公開しました。試行錯誤を重ねた結果、Swift 6.1のDocCに関する新機能や、社内インフラ、関連ツールを活用することで、使いやすく理想的なDocCドキュメントを提供できるようになりました。これにより、数百を超えるモジュールのリファ レンスでも快適に参照できるようになっています。
この記事では、LINEのような数百モジュールをもつ大規模なiOSプロジェクトのDocCをWeb上にホスティングした事例を紹介します。その中で直面した課題と、その対処法についても解説します。また、Swift 6.1から導入されたDocCの新しい機能なども紹介します。
DocCとは
SwiftのDocCは、SwiftやObjective-Cを利用したプロジェクト向けの強力なドキュメンテーションツールです。コード中のコメントや、Markdownファイルから、自動でAppleが公開しているようなスタイルのドキュメントを生成します。そして、ドキュメントだけでなく、チュートリアルといったさまざまなスタイルのドキュメントを生成できます。詳しくは、AppleのDocC公式ドキュメントを参照してください。
DocCのドキュメントはXcodeからドキュメントとして参照することはもちろん、Webサイトとして公開・ホスティングすることもできます。例として、弊社のgiginetが開発しているScipioは、DocCドキュメントをGitHub Pagesでホスティングしています。
今回、LINE iOSプロジェクトでは、インフラの構成やDNSを設定するといった観点でのスケールも必要だったので、社内クラウドでホスティングすることにしました。
LINE iOSプロジェクトでDocCをホスティングする上での問題点
LINE iOSプロジェクトでいざDocCをホスティングしようとすると、いくつかの大きな課題に直面しました。
多くのターゲットをまとめるページがない
これまでのDocCの仕組みでは、複数のモジュールのドキュメントを一覧するページ、ランディングページを作成する方法が提供されていませんでした。このため、各モジュールごとに別々のページを作成し、ホスティングするしかなく、モジュールを横断的に索引する手段が存在しませんでした。これではドキュメントが数百以上に及ぶプロジェクトでは非常に使い勝手の悪いものになってしまいます。
自前でランディングページを用意するアプローチも取れますが、メンテナンスや生成にはコストがかかります。また、標準に近いランディングページを構築したいという希望もありました。
利用体験の維持が難しい
大規模なLINE iOSプロジェクトにおいては、DocCドキュメントの生成量が膨大であるため、これらをホスティングするにはパフォーマンスといった特別な工夫が求められました。また、GitHub Pagesなどのサービスでは、DNS設定やパフォーマンスの柔軟な調整が難しいという問題がありました。
それぞれの問題点を克服したDocCドキュメントの構築・公開
ランディングページの問題はSwift 6.1から入った新しいDocCの機能を利用して解決し、後者は社内クラウドを用いて解決しました。ここからは、それぞれについて見ていきましょう。
Swift 6.1からの新機能を利用したランディングページの構築
Swift 6.1以前から存在している、docc
コマンドにあるmerge
というサブコマンドを利用すれば、生成されたDocCドキュメント(*.doccarchive
)を一つにマージできます。しかし今までは単にマージするだけで、ランディングページの構築はできませんでした。
ですが、Swift 6.1から、docc merge
コマンドに--synthesized-landing-page-
から始まるオプションが追加されました。 このオプションを利用すると、以下のようなランディングページが生成されたマージ済みDocCドキュメントが生成できます。
ページ下部には、各モジュールで用意されたチュートリアルも配置されており、ランディングページから各コンテンツにすぐに飛べるようになっています。
--synthesized-landing-page-*
から始まるオプションには、以下の3つがあります。
-
--synthesized-landing-page-name
- ドキュメントのタイトルとして表示する文字列(上の画像の「FreddiApp」に当たる部分) -
--synthesized-landing-page-kind
- ドキュメントのサブタイトルとして表示する文字列(上の画像の「Welcome To FreddiApp」に当たる部分) -
--synthesized-landing-page-topics-style
- ドキュメントのスタイル(上画像はcompactGrid
。他にもいくつかスタイルが存在)
LINE iOSプロジェクトではこのオプションを利用して生成した、ランディングページ付きのドキュメントをホスティングしています。
では、実際にこれらのオプションを利用して、どのようにDocCドキュメントを生成しているのか説明します。
docbuild
を利用して.xcworkspace
からビルドする
まず、xcodebuild
のサブコマンドであるdocbuild
を利用して、.xcworkspace
からDocCドキュメントをビルドします。
$xcodebuild docbuild -scheme$スキーム名 \
-workspace $xcworkspaceへのパス \
-derivedDataPath $生成物の出力先パス \
-destination $プラットフォームターゲットやデバイス情報 # 例:platform=iOS Simulator,name=iPhone 16 Pro Max
DocCのビルドでは、スキーム本来の生成物(アプリやフレームワーク)のビルドに加えて、ドキュメントのビルドがある分いつもより少し長くビルド時間がかかります。
生成されたドキュメントのファイル名は{ターゲット名}.doccarchive
になります。特にconfigurationを指定してなければ、指定してた出力先パス以下にあるBuild/Products/Debug-{プラットフォーム名}/
ディレクトリに、ドキュメントが生成されます。
ビルドを行うと、指定したスキームでビルドされる成果物(App Extensionも含む)に依存しているターゲットのDocCドキュメントも生成されます。
docc merge
を利用して各ターゲットの.doccarchive
をマージする
次に、xcrun
でdocc merge
コマンドを呼び出し、それぞれの.doccarchive
をマージします。先程のサンプルと同様のドキュメントを構築する際は、以下のコマンドになります。
$ xcrun docc merge FreddiApp.doccarchive HarukoKit.doccarchive ... \
--synthesized-landing-page-name FreddiApp \ # ドキュメントのタイトル
--synthesized-landing-page-kind "Welcome To FreddiApp" \ # ドキュメントのサブタイトル
--synthesized-landing-page-topics-style compactGrid \
--output-path $生成物の出力先パス # ここでは、`merge.doccarchive`のように、末尾に`.doccarchive`をつける
Xcode 16.2に付属のdoccではまだこの--synthesized-landing-page-*
オプションは使えなかったため、swift-doccレポジトリのrelease/6.1
ブランチをチェックアウトしてビルドしたdocc
コマンドを利用することで、先行してこの機能を試すことができました。
なお、執筆時点の最新バージョンであるXcode 16.3からは、付属しているdoccコマンドで利用できますが、今後もdoccの新機能を先行して試したい時にこの方法は有効です。
静的ホスティングサイトに変換
最後に、docc process-archive transform-for-static-hosting
コマンドで、静的ホスティングサイトに変換します。
$ xcrun docc process-archive transform-for-static-hosting \
--hosting-base-path $ホスティングする際のベースパス \ # 例えば、https://example.com/docs に配置するなら、docsと指定する
merge.doccarchive \ # マージされたドキュメントのパス
--output-path $生成物の出力先パス
指定した生成物の出力先パスに、変換されたドキュメントを含んだディレクトリが生成されます。このディレクトリの中身をホスティングサービスにアップロードすれば、Web上に公開できます。