[Gradle, JS] jsJar dependsOn PublicPackageJsonTask

But package.json included into jar only if public npm dependencies exists
This commit is contained in:
Ilya Goncharov
2020-07-03 13:56:37 +03:00
parent 5c968acb13
commit f76a1f0e86
3 changed files with 19 additions and 17 deletions
@@ -16,6 +16,7 @@ import org.gradle.api.internal.artifacts.dependencies.SelfResolvingDependencyInt
import org.gradle.api.tasks.TaskDependency import org.gradle.api.tasks.TaskDependency
import org.gradle.internal.component.local.model.DefaultLibraryBinaryIdentifier import org.gradle.internal.component.local.model.DefaultLibraryBinaryIdentifier
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin
import org.jetbrains.kotlin.gradle.targets.js.npm.NpmDependency.Scope.DEV
import org.jetbrains.kotlin.gradle.targets.js.npm.NpmProject.Companion.PACKAGE_JSON import org.jetbrains.kotlin.gradle.targets.js.npm.NpmProject.Companion.PACKAGE_JSON
import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinCompilationNpmResolution import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinCompilationNpmResolution
import java.io.File import java.io.File
@@ -157,4 +158,7 @@ internal fun moduleName(directory: File): String {
return directory.name return directory.name
} }
fun NpmDependency.isPublicDependency(): Boolean =
scope != DEV
const val FILE_VERSION_PREFIX = "file:" const val FILE_VERSION_PREFIX = "file:"
@@ -43,11 +43,8 @@ constructor(
private val realExternalDependencies: Collection<NpmDependency> private val realExternalDependencies: Collection<NpmDependency>
get() = compilationResolution.externalNpmDependencies get() = compilationResolution.externalNpmDependencies
@Input
var skipOnEmptyNpmDependencies: Boolean = false
@get:OutputFile @get:OutputFile
var packageJson: File by property { var packageJsonFile: File by property {
project.buildDir project.buildDir
.resolve("tmp") .resolve("tmp")
.resolve(npmProject.publicPackageJsonTaskName) .resolve(npmProject.publicPackageJsonTaskName)
@@ -57,9 +54,6 @@ constructor(
@TaskAction @TaskAction
fun resolve() { fun resolve() {
packageJson(npmProject, realExternalDependencies).let { packageJson -> packageJson(npmProject, realExternalDependencies).let { packageJson ->
if (skipOnEmptyNpmDependencies && packageJson.skipRequired()) {
return
}
packageJson.apply { packageJson.apply {
listOf( listOf(
@@ -71,7 +65,7 @@ constructor(
packageJson.devDependencies.clear() packageJson.devDependencies.clear()
packageJson.saveTo(this@PublicPackageJsonTask.packageJson) packageJson.saveTo(this@PublicPackageJsonTask.packageJsonFile)
} }
} }
@@ -89,13 +83,6 @@ constructor(
} }
} }
private fun PackageJson.skipRequired() =
dependencies.isEmpty() &&
peerDependencies.isEmpty() &&
optionalDependencies.isEmpty() &&
optionalDependencies.isEmpty() &&
bundledDependencies.isEmpty()
companion object { companion object {
const val NAME = "publicPackageJson" const val NAME = "publicPackageJson"
} }
@@ -56,7 +56,6 @@ internal class KotlinCompilationNpmResolver(
npmProject.publicPackageJsonTaskName, npmProject.publicPackageJsonTaskName,
listOf(compilation) listOf(compilation)
) { ) {
it.skipOnEmptyNpmDependencies = true
it.dependsOn(nodeJs.npmInstallTaskProvider) it.dependsOn(nodeJs.npmInstallTaskProvider)
it.dependsOn(packageJsonTaskHolder) it.dependsOn(packageJsonTaskHolder)
}.also { packageJsonTask -> }.also { packageJsonTask ->
@@ -65,7 +64,7 @@ internal class KotlinCompilationNpmResolver(
.withType(Zip::class.java) .withType(Zip::class.java)
.named(npmProject.target.artifactsTaskName) .named(npmProject.target.artifactsTaskName)
.configure { .configure {
it.from(packageJsonTask) it.dependsOn(packageJsonTask)
} }
} }
} }
@@ -180,6 +179,18 @@ internal class KotlinCompilationNpmResolver(
internalDependencies.add(projectResolver[main]) internalDependencies.add(projectResolver[main])
} }
val hasPublicNpmDependencies = externalNpmDependencies
.any { it.isPublicDependency() }
if (compilation.isMain() && hasPublicNpmDependencies) {
project.tasks
.withType(Zip::class.java)
.named(npmProject.target.artifactsTaskName)
.configure { task ->
task.from(publicPackageJsonTaskHolder)
}
}
plugins.forEach { plugins.forEach {
it.hookDependencies( it.hookDependencies(
internalDependencies, internalDependencies,