[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.internal.component.local.model.DefaultLibraryBinaryIdentifier
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.resolved.KotlinCompilationNpmResolution
import java.io.File
@@ -157,4 +158,7 @@ internal fun moduleName(directory: File): String {
return directory.name
}
fun NpmDependency.isPublicDependency(): Boolean =
scope != DEV
const val FILE_VERSION_PREFIX = "file:"
@@ -43,11 +43,8 @@ constructor(
private val realExternalDependencies: Collection<NpmDependency>
get() = compilationResolution.externalNpmDependencies
@Input
var skipOnEmptyNpmDependencies: Boolean = false
@get:OutputFile
var packageJson: File by property {
var packageJsonFile: File by property {
project.buildDir
.resolve("tmp")
.resolve(npmProject.publicPackageJsonTaskName)
@@ -57,9 +54,6 @@ constructor(
@TaskAction
fun resolve() {
packageJson(npmProject, realExternalDependencies).let { packageJson ->
if (skipOnEmptyNpmDependencies && packageJson.skipRequired()) {
return
}
packageJson.apply {
listOf(
@@ -71,7 +65,7 @@ constructor(
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 {
const val NAME = "publicPackageJson"
}
@@ -56,7 +56,6 @@ internal class KotlinCompilationNpmResolver(
npmProject.publicPackageJsonTaskName,
listOf(compilation)
) {
it.skipOnEmptyNpmDependencies = true
it.dependsOn(nodeJs.npmInstallTaskProvider)
it.dependsOn(packageJsonTaskHolder)
}.also { packageJsonTask ->
@@ -65,7 +64,7 @@ internal class KotlinCompilationNpmResolver(
.withType(Zip::class.java)
.named(npmProject.target.artifactsTaskName)
.configure {
it.from(packageJsonTask)
it.dependsOn(packageJsonTask)
}
}
}
@@ -180,6 +179,18 @@ internal class KotlinCompilationNpmResolver(
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 {
it.hookDependencies(
internalDependencies,