[Gradle, JS] Watch options ignore kt file to not trigger webpack
[Gradle, JS] Webpack prod dist not in default dist dir ^KT-57629 fixed ^KT-57630 fixed
This commit is contained in:
committed by
Space Team
parent
4fabe8b29a
commit
95d33da10d
+12
-3
@@ -12,6 +12,7 @@ import org.gradle.api.logging.LogLevel
|
||||
import org.gradle.testkit.runner.BuildResult
|
||||
import org.gradle.util.GradleVersion
|
||||
import org.jetbrains.kotlin.gradle.plugin.KotlinJsCompilerType
|
||||
import org.jetbrains.kotlin.gradle.targets.js.dsl.Distribution
|
||||
import org.jetbrains.kotlin.gradle.targets.js.ir.KLIB_TYPE
|
||||
import org.jetbrains.kotlin.gradle.targets.js.npm.NpmProject
|
||||
import org.jetbrains.kotlin.gradle.targets.js.npm.NpmProjectModules
|
||||
@@ -361,7 +362,7 @@ class Kotlin2JsIrGradlePluginIT : AbstractKotlin2JsGradlePluginIT(true) {
|
||||
fun testKotlinJsPackageModuleName(gradleVersion: GradleVersion) {
|
||||
project("kotlin-js-package-module-name", gradleVersion) {
|
||||
build("assemble") {
|
||||
assertFileInProjectExists("build/distributions/kotlin-js-package-module-name.js")
|
||||
assertFileInProjectExists("build/${Distribution.JS_DIST}/productionExecutable/kotlin-js-package-module-name.js")
|
||||
assertFileInProjectExists("build/js/packages/@foo/bar/kotlin/@foo/bar.js")
|
||||
}
|
||||
}
|
||||
@@ -1147,7 +1148,11 @@ abstract class AbstractKotlin2JsGradlePluginIT(protected val irBackend: Boolean)
|
||||
assertDirectoryInProjectExists("build/js/packages/kotlin-js-browser-lib")
|
||||
assertDirectoryInProjectExists("build/js/packages/kotlin-js-browser-app")
|
||||
|
||||
assertFileInProjectExists("app/build/distributions/app.js")
|
||||
if (irBackend) {
|
||||
assertFileInProjectExists("app/build/${Distribution.JS_DIST}/productionExecutable/app.js")
|
||||
} else {
|
||||
assertFileInProjectExists("app/build/distributions/app.js")
|
||||
}
|
||||
|
||||
if (!irBackend) {
|
||||
assertTasksExecuted(":app:processDceKotlinJs")
|
||||
@@ -1169,7 +1174,11 @@ abstract class AbstractKotlin2JsGradlePluginIT(protected val irBackend: Boolean)
|
||||
if (irBackend) ":app:browserProductionExecutableDistributeResources" else ":app:browserDistributeResources"
|
||||
)
|
||||
|
||||
assertFileInProjectExists("app/build/distributions/index.html")
|
||||
if (irBackend) {
|
||||
assertFileInProjectExists("app/build/${Distribution.JS_DIST}/productionExecutable/index.html")
|
||||
} else {
|
||||
assertFileInProjectExists("app/build/distributions/index.html")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+12
-11
@@ -9,6 +9,7 @@ import com.google.gson.Gson
|
||||
import com.google.gson.JsonObject
|
||||
import org.gradle.util.GradleVersion
|
||||
import org.jetbrains.kotlin.gradle.plugin.KotlinJsCompilerType
|
||||
import org.jetbrains.kotlin.gradle.targets.js.dsl.Distribution.Companion.JS_DIST
|
||||
import org.jetbrains.kotlin.gradle.testbase.*
|
||||
import org.junit.jupiter.api.DisplayName
|
||||
import java.util.zip.ZipFile
|
||||
@@ -31,10 +32,10 @@ abstract class KotlinJsIrLibraryGradlePluginITBase : KGPBaseTest() {
|
||||
fun testSimpleJsBinaryLibrary(gradleVersion: GradleVersion) {
|
||||
project("simple-js-library", gradleVersion) {
|
||||
build("build") {
|
||||
assertFileInProjectExists("build/productionLibrary/js-library.js")
|
||||
assertFileInProjectExists("build/productionLibrary/package.json")
|
||||
assertFileInProjectExists("build/productionLibrary/main.js")
|
||||
projectPath.resolve("build/productionLibrary/package.json").reader()
|
||||
assertFileInProjectExists("build/$JS_DIST/productionLibrary/js-library.js")
|
||||
assertFileInProjectExists("build/$JS_DIST/productionLibrary/package.json")
|
||||
assertFileInProjectExists("build/$JS_DIST/productionLibrary/main.js")
|
||||
projectPath.resolve("build/$JS_DIST/productionLibrary/package.json").reader()
|
||||
.use { Gson().fromJson(it, JsonObject::class.java) }
|
||||
.getAsJsonObject("dependencies")
|
||||
?.entrySet()?.associate { (k, v) -> k to v.asString }
|
||||
@@ -51,9 +52,9 @@ abstract class KotlinJsIrLibraryGradlePluginITBase : KGPBaseTest() {
|
||||
fun testJsBinaryLibraryAndExecutable(gradleVersion: GradleVersion) {
|
||||
project("js-library-with-executable", gradleVersion) {
|
||||
build("build") {
|
||||
assertFileInProjectExists("build/productionLibrary/js-library.js")
|
||||
assertFileInProjectExists("build/productionLibrary/package.json")
|
||||
assertFileInProjectExists("build/productionLibrary/main.js")
|
||||
assertFileInProjectExists("build/$JS_DIST/productionLibrary/js-library.js")
|
||||
assertFileInProjectExists("build/$JS_DIST/productionLibrary/package.json")
|
||||
assertFileInProjectExists("build/$JS_DIST/productionLibrary/main.js")
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -63,11 +64,11 @@ abstract class KotlinJsIrLibraryGradlePluginITBase : KGPBaseTest() {
|
||||
fun testJsBinaryLibraryAndExecutableForBrowserAndNodejs(gradleVersion: GradleVersion) {
|
||||
project("js-library-with-executable-browser-nodejs", gradleVersion) {
|
||||
build("build") {
|
||||
assertFileInProjectExists("build/productionLibrary/js-library.js")
|
||||
assertFileInProjectExists("build/productionLibrary/package.json")
|
||||
assertFileInProjectExists("build/productionLibrary/main.js")
|
||||
assertFileInProjectExists("build/$JS_DIST/productionLibrary/js-library.js")
|
||||
assertFileInProjectExists("build/$JS_DIST/productionLibrary/package.json")
|
||||
assertFileInProjectExists("build/$JS_DIST/productionLibrary/main.js")
|
||||
|
||||
assertFileInProjectExists("build/distributions/js-library.js")
|
||||
assertFileInProjectExists("build/$JS_DIST/productionExecutable/js-library.js")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+3
-2
@@ -60,11 +60,12 @@ rootProject.plugins.withType<org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJ
|
||||
val kotlinNodeJs = rootProject.extensions.getByType<org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootExtension>()
|
||||
|
||||
tasks.register<Exec>("runWebpackResult") {
|
||||
dependsOn(tasks.named("browserProductionWebpack"))
|
||||
val webpackTask = tasks.named<org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpack>("browserProductionWebpack")
|
||||
dependsOn(webpackTask)
|
||||
|
||||
executable(kotlinNodeJs.requireConfigured().nodeExecutable)
|
||||
|
||||
workingDir = File("${buildDir}").resolve("distributions")
|
||||
workingDir(webpackTask.flatMap { it.outputDirectory.asFile })
|
||||
args("./${project.name}.js")
|
||||
}
|
||||
}
|
||||
|
||||
+4
@@ -19,4 +19,8 @@ interface Distribution {
|
||||
var directory: File
|
||||
|
||||
val outputDirectory: DirectoryProperty
|
||||
|
||||
companion object {
|
||||
const val JS_DIST = "js-dist"
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -95,7 +95,7 @@ class Executable(
|
||||
override val distribution: Distribution =
|
||||
createDefaultDistribution(
|
||||
compilation.target.project,
|
||||
if (mode == KotlinJsBinaryMode.PRODUCTION) null else super.distribution.distributionName
|
||||
super.distribution.distributionName
|
||||
)
|
||||
|
||||
val executeTaskBaseName: String =
|
||||
|
||||
+4
-3
@@ -15,7 +15,6 @@ import org.jetbrains.kotlin.gradle.dsl.KotlinJsDce
|
||||
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
|
||||
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
|
||||
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.archivesName
|
||||
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.distsDirectory
|
||||
import org.jetbrains.kotlin.gradle.report.BuildMetricsService
|
||||
import org.jetbrains.kotlin.gradle.targets.js.dsl.ExperimentalDceDsl
|
||||
import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsBinaryMode
|
||||
@@ -114,7 +113,6 @@ abstract class KotlinBrowserJsIr @Inject constructor(target: KotlinJsIrTarget) :
|
||||
binary as Executable
|
||||
|
||||
val mode = binary.mode
|
||||
val distsDirectory = project.distsDirectory
|
||||
val archivesName = project.archivesName
|
||||
|
||||
val runTask = registerSubTargetTask<KotlinWebpack>(
|
||||
@@ -125,7 +123,6 @@ abstract class KotlinBrowserJsIr @Inject constructor(target: KotlinJsIrTarget) :
|
||||
listOf(compilation)
|
||||
) { task ->
|
||||
task.dependsOn(binary.linkSyncTask)
|
||||
task.outputDirectory.convention(distsDirectory).finalizeValueOnRead()
|
||||
|
||||
task.args.add(0, "serve")
|
||||
task.description = "start ${mode.name.toLowerCaseAsciiOnly()} webpack dev server"
|
||||
@@ -145,6 +142,10 @@ abstract class KotlinBrowserJsIr @Inject constructor(target: KotlinJsIrTarget) :
|
||||
)
|
||||
)
|
||||
|
||||
task.watchOptions = KotlinWebpackConfig.WatchOptions(
|
||||
ignored = arrayOf("*.kt")
|
||||
)
|
||||
|
||||
|
||||
task.doNotTrackStateCompat("Tracked by external webpack tool")
|
||||
|
||||
|
||||
+2
-1
@@ -10,6 +10,7 @@ import org.gradle.api.file.DirectoryProperty
|
||||
import org.gradle.api.provider.Property
|
||||
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.distsDirectory
|
||||
import org.jetbrains.kotlin.gradle.targets.js.dsl.Distribution
|
||||
import org.jetbrains.kotlin.gradle.targets.js.dsl.Distribution.Companion.JS_DIST
|
||||
import org.jetbrains.kotlin.gradle.utils.property
|
||||
import java.io.File
|
||||
|
||||
@@ -42,6 +43,6 @@ class DefaultDistribution(
|
||||
}
|
||||
|
||||
override val outputDirectory: DirectoryProperty = project.objects.directoryProperty().convention(
|
||||
distributionName.flatMap { project.layout.buildDirectory.dir(it) }.orElse(project.distsDirectory)
|
||||
distributionName.flatMap { project.layout.buildDirectory.dir("$JS_DIST/$it") }.orElse(project.distsDirectory)
|
||||
)
|
||||
}
|
||||
|
||||
+6
-3
@@ -26,7 +26,6 @@ import org.jetbrains.kotlin.build.report.metrics.BuildMetricsReporter
|
||||
import org.jetbrains.kotlin.build.report.metrics.BuildMetricsReporterImpl
|
||||
import org.jetbrains.kotlin.build.report.metrics.BuildPerformanceMetric
|
||||
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
|
||||
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider
|
||||
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
|
||||
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.archivesName
|
||||
import org.jetbrains.kotlin.gradle.report.UsesBuildMetricsService
|
||||
@@ -34,7 +33,6 @@ import org.jetbrains.kotlin.gradle.targets.js.RequiredKotlinJsDependency
|
||||
import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinWebpackRulesContainer
|
||||
import org.jetbrains.kotlin.gradle.targets.js.dsl.WebpackRulesDsl
|
||||
import org.jetbrains.kotlin.gradle.targets.js.dsl.WebpackRulesDsl.Companion.webpackRulesContainer
|
||||
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin
|
||||
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin.Companion.kotlinNodeJsExtension
|
||||
import org.jetbrains.kotlin.gradle.targets.js.npm.RequiresNpmDependencies
|
||||
import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject
|
||||
@@ -148,6 +146,7 @@ constructor(
|
||||
}
|
||||
|
||||
@get:OutputDirectory
|
||||
@get:Optional
|
||||
abstract val outputDirectory: DirectoryProperty
|
||||
|
||||
@get:Internal
|
||||
@@ -195,6 +194,10 @@ constructor(
|
||||
@Optional
|
||||
var devServer: KotlinWebpackConfig.DevServer? = null
|
||||
|
||||
@Input
|
||||
@Optional
|
||||
var watchOptions: KotlinWebpackConfig.WatchOptions? = null
|
||||
|
||||
@Input
|
||||
var devtool: String = WebpackDevtool.EVAL_SOURCE_MAP
|
||||
|
||||
@@ -223,7 +226,7 @@ constructor(
|
||||
mode = mode,
|
||||
entry = if (forNpmDependencies) null else entry.get().asFile,
|
||||
output = output,
|
||||
outputPath = if (forNpmDependencies) null else outputDirectory.get().asFile,
|
||||
outputPath = if (forNpmDependencies) null else outputDirectory.getOrNull()?.asFile,
|
||||
outputFileName = mainOutputFileName.get(),
|
||||
configDirectory = configDirectory,
|
||||
rules = rules,
|
||||
|
||||
+48
-56
@@ -8,11 +8,7 @@
|
||||
package org.jetbrains.kotlin.gradle.targets.js.webpack
|
||||
|
||||
import com.google.gson.GsonBuilder
|
||||
import org.gradle.api.ExtensiblePolymorphicDomainObjectContainer
|
||||
import org.gradle.api.model.ObjectFactory
|
||||
import org.gradle.api.provider.Provider
|
||||
import org.gradle.api.tasks.*
|
||||
import org.gradle.work.NormalizeLineEndings
|
||||
import org.jetbrains.kotlin.gradle.targets.js.NpmVersions
|
||||
import org.jetbrains.kotlin.gradle.targets.js.RequiredKotlinJsDependency
|
||||
import org.jetbrains.kotlin.gradle.targets.js.appendConfigsFromDir
|
||||
@@ -27,66 +23,34 @@ import java.io.StringWriter
|
||||
|
||||
@Suppress("MemberVisibilityCanBePrivate")
|
||||
data class KotlinWebpackConfig(
|
||||
@Internal
|
||||
val npmProjectDir: Provider<File>? = null,
|
||||
@Input
|
||||
var mode: Mode = Mode.DEVELOPMENT,
|
||||
@Internal
|
||||
var entry: File? = null,
|
||||
@Nested
|
||||
@Optional
|
||||
var output: KotlinWebpackOutput? = null,
|
||||
@Internal
|
||||
var outputPath: File? = null,
|
||||
@Input
|
||||
@Optional
|
||||
var outputFileName: String? = entry?.name,
|
||||
@get:PathSensitive(PathSensitivity.NAME_ONLY)
|
||||
@get:Optional
|
||||
@get:IgnoreEmptyDirectories
|
||||
@get:NormalizeLineEndings
|
||||
@get:InputDirectory
|
||||
var configDirectory: File? = null,
|
||||
@Internal
|
||||
var reportEvaluatedConfigFile: File? = null,
|
||||
@Input
|
||||
@Optional
|
||||
var devServer: DevServer? = null,
|
||||
@Input
|
||||
var watchOptions: WatchOptions? = null,
|
||||
var experiments: MutableSet<String> = mutableSetOf(),
|
||||
@Nested
|
||||
override val rules: KotlinWebpackRulesContainer,
|
||||
@Input
|
||||
@Optional
|
||||
var devtool: String? = WebpackDevtool.EVAL_SOURCE_MAP,
|
||||
@Input
|
||||
var showProgress: Boolean = false,
|
||||
var optimization: Optimization? = null,
|
||||
@Input
|
||||
var sourceMaps: Boolean = false,
|
||||
@Input
|
||||
var export: Boolean = true,
|
||||
@Input
|
||||
var progressReporter: Boolean = false,
|
||||
@Internal
|
||||
@Optional
|
||||
var progressReporterPathFilter: File? = null,
|
||||
@Input
|
||||
var resolveFromModulesFirst: Boolean = false
|
||||
) : WebpackRulesDsl {
|
||||
|
||||
@get:Input
|
||||
@get:Optional
|
||||
val entryInput: String?
|
||||
get() = npmProjectDir?.get()?.let { npmProjectDir -> entry?.relativeOrAbsolute(npmProjectDir) }
|
||||
|
||||
@get:Input
|
||||
@get:Optional
|
||||
val outputPathInput: String?
|
||||
get() = npmProjectDir?.get()?.let { npmProjectDir -> outputPath?.relativeOrAbsolute(npmProjectDir) }
|
||||
|
||||
@get:Input
|
||||
@get:Optional
|
||||
val progressReporterPathFilterInput: String?
|
||||
get() = npmProjectDir?.get()?.let { npmProjectDir -> progressReporterPathFilter?.relativeOrAbsolute(npmProjectDir) }
|
||||
|
||||
@@ -148,6 +112,12 @@ data class KotlinWebpackConfig(
|
||||
var splitChunks: Any
|
||||
) : Serializable
|
||||
|
||||
@Suppress("unused")
|
||||
data class WatchOptions(
|
||||
var aggregateTimeout: Int? = null,
|
||||
var ignored: Any? = null
|
||||
) : Serializable
|
||||
|
||||
fun save(configFile: File) {
|
||||
configFile.writer().use {
|
||||
appendTo(it)
|
||||
@@ -206,11 +176,21 @@ data class KotlinWebpackConfig(
|
||||
}
|
||||
|
||||
private fun Appendable.appendDevServer() {
|
||||
if (devServer == null) return
|
||||
if (devServer != null) {
|
||||
|
||||
appendLine("// dev server")
|
||||
appendLine("config.devServer = ${json(devServer!!)};")
|
||||
appendLine()
|
||||
appendLine("// dev server")
|
||||
appendLine("config.devServer = ${json(devServer!!)};")
|
||||
appendLine()
|
||||
}
|
||||
|
||||
if (watchOptions == null) return
|
||||
|
||||
//language=JavaScript 1.8
|
||||
appendLine(
|
||||
"""
|
||||
config.watchOptions = ${json(watchOptions!!)};
|
||||
""".trimIndent()
|
||||
)
|
||||
}
|
||||
|
||||
private fun Appendable.appendExperiments() {
|
||||
@@ -257,25 +237,25 @@ data class KotlinWebpackConfig(
|
||||
}
|
||||
|
||||
private fun Appendable.appendEntry() {
|
||||
if (
|
||||
entry == null
|
||||
|| outputPath == null
|
||||
|| output == null
|
||||
)
|
||||
return
|
||||
|
||||
val multiEntryOutput = "${outputFileName!!.removeSuffix(".js")}-[name].js"
|
||||
|
||||
//language=JavaScript 1.8
|
||||
appendLine(
|
||||
"""
|
||||
if (entry != null) {
|
||||
//language=JavaScript 1.8
|
||||
appendLine(
|
||||
"""
|
||||
// entry
|
||||
config.entry = {
|
||||
main: [require('path').resolve(__dirname, ${entryInput!!.jsQuoted()})]
|
||||
};
|
||||
|
||||
""".trimIndent()
|
||||
)
|
||||
}
|
||||
|
||||
if (output != null) {
|
||||
val multiEntryOutput = "${outputFileName!!.removeSuffix(".js")}-[name].js"
|
||||
|
||||
//language=JavaScript 1.8
|
||||
appendLine(
|
||||
"""
|
||||
config.output = {
|
||||
path: require('path').resolve(__dirname, ${outputPathInput!!.jsQuoted()}),
|
||||
filename: (chunkData) => {
|
||||
return chunkData.chunk.name === 'main'
|
||||
? ${outputFileName!!.jsQuoted()}
|
||||
@@ -285,7 +265,19 @@ data class KotlinWebpackConfig(
|
||||
${output!!.libraryTarget?.let { "libraryTarget: ${it.jsQuoted()}," } ?: ""}
|
||||
globalObject: "${output!!.globalObject}"
|
||||
};
|
||||
|
||||
""".trimIndent()
|
||||
)
|
||||
}
|
||||
|
||||
if (
|
||||
outputPath == null
|
||||
)
|
||||
return
|
||||
|
||||
//language=JavaScript 1.8
|
||||
appendLine(
|
||||
"""
|
||||
config.output.path = require('path').resolve(__dirname, ${outputPathInput!!.jsQuoted()})
|
||||
""".trimIndent()
|
||||
)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user