Swift + ObjC プロジェクトを Xcode 8 (Swift 2.3) に更新したところ、Xcode がインクリメンタル ビルドではなくプロジェクトの完全なリビルドを行う時間の 50% 以上が見つかりました。
行われた変更は、単純な print ステートメントを追加することです。完全な再構築をいつ実行するかについての論理はないようです。
これを決定する「依存関係の確認」フェーズに表示されます。Xcode 7 では、これは問題ではないようです。
他の誰かがこれに遭遇しましたか?
Swift + ObjC プロジェクトを Xcode 8 (Swift 2.3) に更新したところ、Xcode がインクリメンタル ビルドではなくプロジェクトの完全なリビルドを行う時間の 50% 以上が見つかりました。
行われた変更は、単純な print ステートメントを追加することです。完全な再構築をいつ実行するかについての論理はないようです。
これを決定する「依存関係の確認」フェーズに表示されます。Xcode 7 では、これは問題ではないようです。
他の誰かがこれに遭遇しましたか?
これは一貫して機能することがわかりましたが、ブリッジングヘッダーに含まれるヘッダーを変更すると、swift ファイルがコンパイルされます。git ブランチを前後に切り替えると、完全なコンパイルも実行されます。
最初に、デバッグの最適化レベルが [なし] に設定されていることを確認します (モジュール全体の最適化ではありません)。
次に、https ://forums.developer.apple.com/thread/62737 Apple スタッフ (ddunbar) によると:
私たちはその設定を信じています:
HEADERMAP_USES_VFS = YES
プロジェクトで (またはすべてのターゲットで) true にすることは、多くの人にとって効果的な回避策になる可能性があります。これが動作することは保証されていません (これがデフォルトでオンになっていない理由です) が、ほとんどのプロジェクトで動作するはずです。
これは、ターゲットのビルド設定の下にある「ユーザー定義設定の追加」から追加する必要があります。
.
わかりました、これがなぜ起こっているのかに対する答えですが、解決策はわかりません。「その他の Swift フラグ」 -driver-show-incremental を使用すると、Xcode は依存関係に基づいてコンパイルする必要があると判断したものを出力します。次のようなものが表示されます。
Queuing EditProfileViewController.swift because of dependencies discovered later
Queuing ChangePasswordViewController.swift because of dependencies discovered later
Queuing JoinViewController.swift because of dependencies discovered later
Queuing JoinProfileViewController.swift because of dependencies discovered later
Queuing FormViewBuildable.swift because of dependencies discovered later
Queuing RadioTextFormView.swift because of dependencies discovered later
Queuing TextFieldFormView.swift because of dependencies discovered later
Queuing AccountProfileViewController.swift because of dependencies discovered later
変換する前にこの問題は発生していなかったので、これが Swift 3 の問題であるかどうか疑問に思っています。私は小さなサンプルプロジェクトを作成しました
FileA には FileB のものが含まれる FileB には FileC のものが含まれる
どこでも使用されていないファイルのプライベートな変更を FileC に追加しても、依存関係のために FileA、FileB、および FileC がコンパイルのためにキューに入れられます。今日の後半に Xcode 7 でこの例をテストして、何が起こるかを確認します。
そのため、swift 3 の依存関係の解決がうまく機能していないようです。私はこれを他の2つのswift 3プロジェクトでテストしましたが、同じことが当てはまります。任意のファイルに変更を加えると、すべてのファイルがコンパイルされます。約 15,000 行のコードを含むプロジェクトに着手するまで、遅く感じることはありません。少し中規模の Swift 3 アプリを使用していない限り、インクリメンタル コンプリケーションが正しく機能していないことに気付かないでしょう。さらに何かわかったら更新します。