giginet / Scipio

A new build tool to generate XCFramework

Home Page:https://giginet.github.io/Scipio/documentation/scipio

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

`--disable-library-evolution` をデフォルトにしたい

omochi opened this issue · comments

--disable-library-evolution をデフォルトにしてほしいです。

Library Evolutionは配布用のバイナリライブラリを作るための言語機能です。

一方、scipioのツールとしての目的は、
依存先ライブラリを事前ビルドして、開発中のリビルド時間を減らすことだと思います。

この目的においては、
ビルドしたキャッシュとしてのライブラリを再配布することは無いので、
Library Evolutionは不要です。

一方で、Library Evolutionは以下のようなデメリットがあります。

  1. swift-nioなどの一部のパッケージがビルドできなくなる
  2. 最適化に制限がかかりパフォーマンスが低下する、

2については開発中だけなので許容できるかもしれませんが、
1についてはそれによって全く利用できなくなるのでとても不便です。

そして現在のところ、Swiftのライブラリコミュニティでは、
バイナリ配布はほとんど実施されていません。
むしろswift-nioのようにLibrary Evolution非対応があるぐらいです。

Discordでも同様の意見があったのでご確認ください。
https://discord.com/channels/291054398077927425/304939011904897024/1135810276969689089

Discordでコメントしたものです。

多くのアプリ・ライブラリで使用されているswift-collectionsも @inlinable を使用しており、Library Evolution非対応です。
https://github.com/search?q=repo%3Aapple%2Fswift-collections%20inlinable&type=code

依存を含めるとLibrary Evolution非対応のライブラリは数多く存在し、それらがデフォルトでビルド出来ないのは非常に不便に感じます。

xcodebuildの create-xcframework では、標準設定ではLibrary Evolutionが無効のFrameworkからはXCFrameworkを作れないようです。
swiftinterfaceがないFrameworkからXCFrameworkを作るには、 -allow-internal-distribution オプションが必要で、そちらがイレギュラーに思えたので、デフォルトではLibrary Evolutionを有効化しています。
https://github.com/giginet/Scipio/blob/main/Sources/ScipioKit/Producer/PIF/XCBuildClient.swift#L163-L165

どちらが標準かは決めの問題で、しっかりとドキュメンテーションされていれば、Scipioの初期動作がどちらでも大きな問題ではないと思ってます。
ご指摘の通り、Scipioのキャッシュシステムを前提として扱うのであれば、無効がデフォルトの方が良いかも知れません。
正式リリース前のこのタイミングで変更してしまおうかなと思います。

なるほど、 create-xcframework の仕様が念頭にあったのですね。

バイナリライブラリには、配布とキャッシュという2つの大きな用途がある中で、
XCFrameworkという技術単体にとっては、配布が主目的だから、
-allow-internal-distribution が追加的なオプションとなるのは合理的だと思います。

一方で、 Scipio の主目的はキャッシュの方だから、
scipioがcreate-xcframeworkをするときにややこしいことになるのは当然で、特に問題ないと思います。

Scipioのユーザにとっては create-xcframework の**や事情は隠蔽して設計するのが良いと思います。