diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/CocoaPodsIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/CocoaPodsIT.kt index 24fa8d57cd3..179f2842c7d 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/CocoaPodsIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/CocoaPodsIT.kt @@ -52,6 +52,7 @@ class CocoaPodsIT : BaseGradleIT() { super.defaultBuildOptions().copy(customEnvironmentVariables = getEnvs()) val PODFILE_IMPORT_DIRECTIVE_PLACEHOLDER = "" + val PODFILE_IMPORT_POD_PLACEHOLDER = "#import_pod_directive" private val cocoapodsSingleKtPod = "native-cocoapods-single" private val cocoapodsMultipleKtPods = "native-cocoapods-multiple" @@ -979,6 +980,33 @@ class CocoaPodsIT : BaseGradleIT() { project.testWithWrapper(":podPublishXCFramework") } + @Test + fun testPodInstallUpToDateCheck() { + project = getProjectByName(cocoapodsSingleKtPod) + val subProjectName = "kotlin-library" + val subprojectPodImportTask = ":$subProjectName$podImportTaskName" + val subprojectPodspecTask = ":$subProjectName$podspecTaskName" + val subprojectPodInstallTask = ":$subProjectName$podInstallTaskName" + with(project) { + preparePodfile("ios-app", ImportMode.FRAMEWORKS) + build(subprojectPodImportTask, "-Pkotlin.native.cocoapods.generate.wrapper=true") { + assertTasksExecuted(listOf(subprojectPodspecTask, subprojectPodInstallTask)) + } + gradleBuildScript(subProjectName).addPod(defaultPodName) + build(subprojectPodImportTask, "-Pkotlin.native.cocoapods.generate.wrapper=true") { + assertTasksExecuted(listOf(subprojectPodspecTask, subprojectPodInstallTask)) + } + build(subprojectPodImportTask, "-Pkotlin.native.cocoapods.generate.wrapper=true") { + assertTasksNotExecuted(listOf(subprojectPodspecTask, subprojectPodInstallTask)) + } + addPodToPodfile("ios-app", defaultPodName) + build(subprojectPodImportTask, "-Pkotlin.native.cocoapods.generate.wrapper=true") { + assertTasksNotExecuted(listOf(subprojectPodspecTask)) + assertTasksExecuted(listOf(subprojectPodInstallTask)) + } + } + } + // paths private fun CompiledProject.url() = externalSources().resolve("url") @@ -1459,6 +1487,12 @@ class CocoaPodsIT : BaseGradleIT() { } } + private fun Project.addPodToPodfile(iosAppLocation: String, pod: String) { + val iosAppDir = projectDir.resolve(iosAppLocation) + iosAppDir.resolve("Podfile").takeIf { it.exists() }?.modify { + it.replace(PODFILE_IMPORT_POD_PLACEHOLDER, "pod '$pod'") + } + } private fun kotlinLibraryPodspecContent(frameworkName: String? = null) = """ Pod::Spec.new do |spec| diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-cocoapods-single/ios-app/Podfile b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-cocoapods-single/ios-app/Podfile index 8a8f0548f39..a250a65d297 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-cocoapods-single/ios-app/Podfile +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/native-cocoapods-single/ios-app/Podfile @@ -6,4 +6,5 @@ target 'ios-app' do pod 'pod_dependency', :path => '../pod_dependency' pod 'subspec_dependency', :path => '../subspec_dependency' pod 'kotlin_library', :path => '../kotlin-library' + #import_pod_directive end \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/cocoapods/KotlinCocoapodsPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/cocoapods/KotlinCocoapodsPlugin.kt index 489cf3767e3..97febfe01b2 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/cocoapods/KotlinCocoapodsPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/cocoapods/KotlinCocoapodsPlugin.kt @@ -397,6 +397,7 @@ open class KotlinCocoapodsPlugin : Plugin { it.group = TASK_GROUP it.description = "Invokes `pod install` call within Podfile location directory" it.podfile.set(cocoapodsExtension.podfile) + it.podspec.set(podspecTaskProvider.map { podspecTask -> podspecTask.outputFile }) it.frameworkName = project.provider { cocoapodsExtension.frameworkNameInternal } it.dependsOn(podspecTaskProvider) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/AdvancedCocoapodsTasks.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/AdvancedCocoapodsTasks.kt index e0d5050cf16..714c47858a6 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/AdvancedCocoapodsTasks.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/tasks/AdvancedCocoapodsTasks.kt @@ -56,9 +56,15 @@ open class PodInstallTask : DefaultTask() { internal lateinit var frameworkName: Provider @get:Optional - @get:Input + @get:PathSensitive(PathSensitivity.ABSOLUTE) + @get:InputFile internal val podfile = project.objects.property(File::class.java) + @get:Optional + @get:PathSensitive(PathSensitivity.ABSOLUTE) + @get:InputFile + internal val podspec = project.objects.property(File::class.java) + @get:Optional @get:OutputDirectory internal val podsXcodeProjDirProvider: Provider?