BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース Airbnbで大規模なiOSアプリ構築

Airbnbで大規模なiOSアプリ構築

ブックマーク

原文(投稿日:2021/11/26)へのリンク

Airbnb iOSチームはモバイルアプリのコードベースの肥大化と複雑化の課題に対応した。この対応は、最新のビルドシステム、モジュールタイプ、開発アプリなどの新しいツールとプロセスの採用によって可能となった。

Airbnbチームが回避しなければならなかった最初のハードルはXcodeの速度低下だ。特にファイルのインデックス作成とコードの構築時である。そして、コードバージョン管理システムの「不親切さ」であった。

Xcodeプロジェクトファイルはプルリクエストでレビューするのが難しいだけではありません。これらのプロジェクトファイルでのマージの競合や競合状態の発生率は、より大規模なエンジニアチームが高速に作業することで増加しました。

Xcodeは非常に強力で、AppleによるiOSや他のツールとインテグレーションを比類ないレベルで提供する。しかし、Airbnbのエンジニアにとって重要な機能が欠けている。ビルドアーティファクトのネットワークキャッシュ、ビルドグラフのクエリインターフェイス、依存関係としてカスタムステップを追加する方法などである。

これらの全ての機能を開発者に提供するために、AirbnbはFacebook Buckを選択した。これは、GoogleのBazelで使われているものと同じStarlark言語をベースとするビルドシステムである。Buckを使うと、宣言型ビルドグラフからXcodeワークスペースを生成できる。そのため、iOS開発エコシステムとの最適な統合レベルが保証される。アーティファクトキャッシングのメリットを享受できないXcodeネイティブビルドシステムを使う代わりに、Airbnbは、ビルド用にBuckをシームレスに呼び出すXcodeプロジェクトを生成するようにBuckを拡張した。これにより、Buck HTTPキャッシュが有効になっている場合、ビルドステップが最大5~6倍速くなる。

Airbnbのエンジニアは、インフラストラクチャを改善するだけでなく、モジュールをモジュールタイプと呼ばれるグループとして編成することで、コードベースの発見指向の組織構造を設計した。各モジュールタイプには一式の可視性ルールがある。それは、そのタイプのモジュール間で許可される依存関係を定義しているものである。

たとえば、モジュールタイプがUIViewControllerというfeatureの場合、子としてUIViewControllerを含む場合があるが、他のfeatureは含まない。featureは、より広い可視性を備えた別のモジュールタイプであるfeatureインターフェイスを介してのみ相互に通信できる。

Airbnbのエンジニアによると、モジュールタイプはコードベース全体の目次として機能し、即座にその意味を提供してくれるものである。

Airbnb iOSインフラストラクチャの3番目のイノベーションは、Dev Appsだ。これは、単一モジュールとその依存関係のためのオンデマンドの一時的なXcodeワークスペースである。

AndroidとiOSの両方のDevAppsの人気と成功は、単純な原理によるものです。つまり、IDEスコープを編集中のファイルのみに最小化することで、開発ループが短くしたことです。

Dev Appsは、コマンドラインツールを使用して生成されます。そのツールにより、Buckを使って、要求されたモジュールを構築するために、どのファイルが必要かを見つけ出される。このツールは、featureをホストして実行可能にするコンテナーアプリも生成する。Airbnbのエンジニアによると、ほとんどのDev Appsは2分以内にビルドできる。

この全体を通したアプローチにより、約1,500のモジュールが定義され、コードの所有権を効果的に適用し、テストカバレッジを改善することもできるようになった。

iOSアプリを大規模に構築するためのAirbnbのアプローチには、説明してきたこと以上をここで見つけることができる。興味があれば元の記事をお見逃しなく。

この記事に星をつける

おすすめ度
スタイル

こんにちは

コメントするには InfoQアカウントの登録 または が必要です。InfoQ に登録するとさまざまなことができます。

アカウント登録をしてInfoQをお楽しみください。

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

コミュニティコメント

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

BT