先日、こちらの記事「Kotlin/Native ProjectをBitriseのiOSプラットフォームでビルドする」を書いたのですが、Gradleの知識が足りなかったためすごく遠回りなことをしていました。もっと簡単にできるので書きたいと思います
Androidの依存関係を切り離す
上記に書いてある通り、iOSのビルドの時だけAndroidの依存関係を切り離せばAndroidSDKは不要になります。
まず初めに思い付いたのが、タスク実行時にプロジェクトプロパティ、例えば./gradlew packForXcode -Pis_ios
のようにして、project.hasProperty('is_ios')
で分岐して、プロパティがなければinclude
しないという方法なのですが、そうすると_iOSのビルドなのにis_ios
を付与する_と意味合いが矛盾してしまいます
そこで、実行するタスク名を取得して、packForXcode
の時だけAndroidの依存関係を切り離す、という様にします。そうすると、実行する側はプロジェクトプロパティを気にしなくていいのと、iOS実行時にはAndroidSDKは必要ない、といった自然な流れになります。
具体的にはsettings.gradle
にその処理を書きます
include ':app' ':common'
を
include ':common'
if (startParameter.taskNames.any { it.contains('packForXCode') } ) {
include ':app'
}
の様に書き換えます。こうすることで、packForXcode
の時はinclude ':app'
が実行されなく、それ以外の時は実行されるようになります。
実際に、元のsettings.gradle
のままで./gradlew packForXcode
を実行すると、
FAILURE: Build failed with an exception.
* What went wrong:
A problem occurred configuring project ':app'.
> SDK location not found. Define location with sdk.dir in the local.properties file or with an ANDROID_HOME environment variable.
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
* Get more help at https://help.gradle.org
BUILD FAILED in 0s
とapp(Androidのビルド)のconfigure時にANDROID_HOMEが無いから実行できないと怒られます。
書き換えた後のsettings.gradle
で実行すると、
> Configure project :common
Kotlin Multiplatform Projects are an experimental feature.
BUILD SUCCESSFUL in 1s
2 actionable tasks: 2 up-to-date
無事ビルドが成功した事がわかります
これで、わざわざ毎回CI上でAndroidSDKをインストールしたりせずに済みます!
まだまだ勉強中なので良い方法があれば随時更新していきたいと思います