[Gradle, JS] Tasks that uses ArchiveOperations compatible w/ Gradle < 6.6

This commit is contained in:
Alexander Likhachev
2021-01-22 14:27:21 +03:00
parent 15f6bb9506
commit 6eac5e1907
7 changed files with 53 additions and 12 deletions
@@ -12,6 +12,9 @@ import org.junit.Test
import kotlin.test.assertTrue import kotlin.test.assertTrue
class DukatIntegrationIT : BaseGradleIT() { class DukatIntegrationIT : BaseGradleIT() {
override val defaultGradleVersion: GradleVersionRequired
get() = GradleVersionRequired.AtLeast("6.0")
@Test @Test
fun testSeparateDukatKotlinDslRootDependencies() { fun testSeparateDukatKotlinDslRootDependencies() {
testSeparateDukat( testSeparateDukat(
@@ -305,6 +305,9 @@ abstract class AbstractKotlin2JsGradlePluginIT(val irBackend: Boolean) : BaseGra
jsCompilerType = if (irBackend) KotlinJsCompilerType.IR else KotlinJsCompilerType.LEGACY jsCompilerType = if (irBackend) KotlinJsCompilerType.IR else KotlinJsCompilerType.LEGACY
) )
override val defaultGradleVersion: GradleVersionRequired
get() = GradleVersionRequired.AtLeast("6.0")
protected fun CompiledProject.checkIrCompilationMessage() { protected fun CompiledProject.checkIrCompilationMessage() {
if (irBackend) { if (irBackend) {
assertContains(USING_JS_IR_BACKEND_MESSAGE) assertContains(USING_JS_IR_BACKEND_MESSAGE)
@@ -16,6 +16,9 @@ class KotlinJsIrLibraryGradlePluginIT : BaseGradleIT() {
jsCompilerType = KotlinJsCompilerType.IR jsCompilerType = KotlinJsCompilerType.IR
) )
override val defaultGradleVersion: GradleVersionRequired
get() = GradleVersionRequired.AtLeast("6.0")
@Test @Test
fun testSimpleJsBinaryLibrary() { fun testSimpleJsBinaryLibrary() {
val project = Project("simple-js-library") val project = Project("simple-js-library")
@@ -14,7 +14,7 @@ import org.junit.Test
class CleanDataTaskIT : BaseGradleIT() { class CleanDataTaskIT : BaseGradleIT() {
override val defaultGradleVersion: GradleVersionRequired override val defaultGradleVersion: GradleVersionRequired
get() = GradleVersionRequired.AtLeast("5.5.1") get() = GradleVersionRequired.AtLeast("6.0")
@Test @Test
fun testDownloadedFolderDeletion() { fun testDownloadedFolderDeletion() {
@@ -17,7 +17,12 @@ open class NodeJsSetupTask : DefaultTask() {
private val settings = NodeJsRootPlugin.apply(project.rootProject) private val settings = NodeJsRootPlugin.apply(project.rootProject)
private val env by lazy { settings.requireConfigured() } private val env by lazy { settings.requireConfigured() }
private val fs = services.get(FileSystemOperations::class.java) private val fs = services.get(FileSystemOperations::class.java)
private val archives = services.get(ArchiveOperations::class.java) private val archives: Any? = try {
services.get(ArchiveOperations::class.java)
} catch (e: NoClassDefFoundError) {
// Gradle version < 6.6
null
}
val ivyDependency: String val ivyDependency: String
@Input get() = env.ivyDependency @Input get() = env.ivyDependency
@@ -84,12 +89,22 @@ open class NodeJsSetupTask : DefaultTask() {
when { when {
archive.name.endsWith("zip") -> fs.copy { archive.name.endsWith("zip") -> fs.copy {
it.from(archives.zipTree(archive)) val from = if (archives != null) {
(archives as ArchiveOperations).zipTree(archive)
} else {
project.zipTree(archive)
}
it.from(from)
it.into(destination) it.into(destination)
} }
else -> { else -> {
fs.copy { fs.copy {
it.from(archives.tarTree(archive)) val from = if (archives != null) {
(archives as ArchiveOperations).tarTree(archive)
} else {
project.tarTree(archive)
}
it.from(from)
it.into(destination) it.into(destination)
} }
} }
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.gradle.targets.js.npm package org.jetbrains.kotlin.gradle.targets.js.npm
import org.gradle.api.Project
import org.gradle.api.file.ArchiveOperations import org.gradle.api.file.ArchiveOperations
import org.gradle.api.file.FileSystemOperations import org.gradle.api.file.FileSystemOperations
import org.jetbrains.kotlin.gradle.targets.js.JS import org.jetbrains.kotlin.gradle.targets.js.JS
@@ -17,8 +18,9 @@ import java.io.File
* Creates fake NodeJS module directory from given gradle [dependency]. * Creates fake NodeJS module directory from given gradle [dependency].
*/ */
internal class GradleNodeModuleBuilder( internal class GradleNodeModuleBuilder(
val project: Project,
val fs: FileSystemOperations, val fs: FileSystemOperations,
val archiveOperations: ArchiveOperations, val archiveOperations: Any?,
val moduleName: String, val moduleName: String,
val moduleVersion: String, val moduleVersion: String,
val srcFiles: Collection<File>, val srcFiles: Collection<File>,
@@ -31,10 +33,17 @@ internal class GradleNodeModuleBuilder(
srcFiles.forEach { srcFile -> srcFiles.forEach { srcFile ->
when { when {
isKotlinJsRuntimeFile(srcFile) -> files.add(srcFile) isKotlinJsRuntimeFile(srcFile) -> files.add(srcFile)
srcFile.isCompatibleArchive -> archiveOperations.zipTree(srcFile).forEach { innerFile -> srcFile.isCompatibleArchive -> {
when { val archiveFiles = if (archiveOperations != null) {
innerFile.name == NpmProject.PACKAGE_JSON -> srcPackageJsonFile = innerFile (archiveOperations as ArchiveOperations).zipTree(srcFile)
isKotlinJsRuntimeFile(innerFile) -> files.add(innerFile) } else {
project.zipTree(srcFile)
}
archiveFiles.forEach { innerFile ->
when {
innerFile.name == NpmProject.PACKAGE_JSON -> srcPackageJsonFile = innerFile
isKotlinJsRuntimeFile(innerFile) -> files.add(innerFile)
}
} }
} }
} }
@@ -15,15 +15,23 @@ import java.io.File
* Cache for storing already created [GradleNodeModule]s * Cache for storing already created [GradleNodeModule]s
*/ */
internal class GradleNodeModulesCache(nodeJs: NodeJsRootExtension) : AbstractNodeModulesCache(nodeJs) { internal class GradleNodeModulesCache(nodeJs: NodeJsRootExtension) : AbstractNodeModulesCache(nodeJs) {
private val fs = (nodeJs.rootProject as ProjectInternal).services.get(FileSystemOperations::class.java) @Transient
private val archiveOperations = (nodeJs.rootProject as ProjectInternal).services.get(ArchiveOperations::class.java) private val project = nodeJs.rootProject
private val fs = (project as ProjectInternal).services.get(FileSystemOperations::class.java)
private val archiveOperations: Any? = try {
(project as ProjectInternal).services.get(ArchiveOperations::class.java)
} catch (e: NoClassDefFoundError) {
// Gradle version < 6.6
null
}
override fun buildImportedPackage( override fun buildImportedPackage(
name: String, name: String,
version: String, version: String,
file: File file: File
): File? { ): File? {
val module = GradleNodeModuleBuilder(fs, archiveOperations, name, version, listOf(file), dir) val module = GradleNodeModuleBuilder(project, fs, archiveOperations, name, version, listOf(file), dir)
module.visitArtifacts() module.visitArtifacts()
return module.rebuild() return module.rebuild()
} }