Upgrade to Pro — share decks privately, control downloads, hide ads and more …

片田舎のおっさん、 Swift Buildのダイアモンド問題解決の不具合修正PRを出すが、解決...

Avatar for yimajo yimajo
August 20, 2026

片田舎のおっさん、 Swift Buildのダイアモンド問題解決の不具合修正PRを出すが、解決方法がキャッシュをしないようにすることであり、ビルド時間が伸びると言われてマージされないので高速化もする/swiftbuild

Avatar for yimajo

yimajo

August 20, 2026

More Decks by yimajo

Other Decks in Programming

Transcript

  1. ダイアモンド問題の解決できていないなら? もし、Feature AがStaticで、Feature BがDynamic App と固定されていて、CommonがそれぞれStaticとし てLinkされると… Static Feature A

    ビルド時にAppはFeatureA経由でCommonをStatic Link Dynamic Feature B Static Static で含んでいて、アプリ起動時にDynamic LinkでFeatureB 経由で別のCommonを呼び出してしまう。 これで、2つのCommonが1アプリに重複して存在してし Common Common まう。 potatotips #96 04
  2. Swift Buildの潜在的不具合 App Dynamic固定 Embedded Framework • Step1: top-levelなTargetからダイアモンド判定 •

    そしてそれを重複判定しないようにキャッシュ化 • キャッシュ化された子のTargetを判定から外す Dynamic判定 • Step2: その他TargetもDynamic判定 • -> 子が別のTargetから重複しているのに判定から外される Feature X Feature A • 例 判定から外す • Feature AがAppとEmbeddedFrameworkからリンク • Dynamic判定されるが、FeatureAの子Commonは判 定材料から無視される • FeatureXのCommonは2つあるので本来Dynamic判定 すべきだが、判定材料の対象として見つからない Common Common Commonは重複だがもう一方の Commonは存在しないものとさ れDynamic化されない potatotips #96
  3. 不具合修正の解決: PR #1424 やったこと 1. 不具合が再現するプロジェクトを用意 2. 不具合の再現をテストコードとして用意し失敗を確認 • このテストが成功することを目指す

    3. DFS(深さ優先探索)アルゴリズムを調べる • 型を作りそのメソッドにロジックを書く • テストコードを書いておく 4. 上記2種類のテストが成功するように 5. 再現プロジェクトでも不具合起きないようにする potatotips #96
  4. 不具合修正の解決: PR #1424 思ったこと • しかし不具合解決と高速化を1つのPRでやりたくないん だけどその理由は差分がわけわからんことになるから • (そもそも既存コードがわけわからんすぎる) •

    PRの差分の読みづらさを許容するんかい • こちらはもっとやりたいようにコードを書く • フォーマットはこちらが読み易いようにもする potatotips #96
  5. Feature AとBそれぞれからシングルトンを作成しようとすると それぞれ2つできる Feature A static let sharedな何か Feature B

    static let sharedな何か この例はCommonへのStatic Linkが2個だけど CommonへStatic LinkがN個かつDynamic LinkがM個という状況でもダメ potatotips #96