Skip to content

Commit 6f47556

Browse files
authored
👷 Add hot reload support using compose-hot-reload (#2994)
1 parent 4dc5d69 commit 6f47556

File tree

3 files changed

+64
-23
lines changed

3 files changed

+64
-23
lines changed

app/build.gradle.kts

Lines changed: 56 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import org.gradle.api.tasks.testing.logging.TestLogEvent
33
import org.gradle.nativeplatform.platform.internal.DefaultNativePlatform
44
import org.jetbrains.compose.desktop.application.dsl.TargetFormat
5+
import org.jetbrains.compose.reload.gradle.ComposeHotRun
56
import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi
67
import org.yaml.snakeyaml.LoaderOptions
78
import org.yaml.snakeyaml.Yaml
@@ -23,6 +24,7 @@ version = versionProperties.getProperty("version")
2324

2425
plugins {
2526
alias(libs.plugins.compose.compiler)
27+
alias(libs.plugins.compose.hot.reload)
2628
alias(libs.plugins.conveyor)
2729
alias(libs.plugins.download)
2830
alias(libs.plugins.jetbrainsCompose)
@@ -197,6 +199,52 @@ tasks.named("desktopProcessResources") {
197199
dependsOn("copyDevProperties")
198200
}
199201

202+
private fun initJvmArgs(
203+
jvmArgs: (Array<String>) -> Unit,
204+
buildFullPlatform: Boolean = false,
205+
) {
206+
// Add system properties that need to be set for all platforms
207+
val loggerLevel = project.findProperty("loggerLevel")?.toString() ?: "info"
208+
val appEnv = project.findProperty("appEnv")?.toString() ?: "DEVELOPMENT"
209+
val globalListener = project.findProperty("globalListener")?.toString() ?: "true"
210+
jvmArgs(
211+
arrayOf(
212+
"-DloggerLevel=$loggerLevel",
213+
"-DappEnv=$appEnv",
214+
"-Djava.net.preferIPv4Stack=true",
215+
"-Djava.net.preferIPv6Addresses=false",
216+
"-DglobalListener=$globalListener",
217+
"-Dio.netty.maxDirectMemory=268435456",
218+
"-DloggerDebugPackages=com.crosspaste.routing,com.crosspaste.net.clientapi,com.crosspaste.net.plugin",
219+
),
220+
)
221+
222+
// Open modules required for all platforms
223+
jvmArgs(arrayOf("--add-opens", "java.desktop/sun.awt=ALL-UNNAMED"))
224+
jvmArgs(arrayOf("--add-opens", "java.desktop/java.awt.peer=ALL-UNNAMED"))
225+
226+
val os: OperatingSystem = DefaultNativePlatform.getCurrentOperatingSystem()
227+
228+
if (os.isMacOsX || buildFullPlatform) {
229+
jvmArgs(arrayOf("--add-opens", "java.desktop/sun.lwawt=ALL-UNNAMED"))
230+
jvmArgs(arrayOf("--add-opens", "java.desktop/sun.lwawt.macosx=ALL-UNNAMED"))
231+
jvmArgs(
232+
arrayOf(
233+
"-Dapple.awt.enableTemplateImages=true",
234+
"-Dmac.bundleID=com.crosspaste.mac",
235+
),
236+
)
237+
}
238+
239+
if (os.isLinux || buildFullPlatform) {
240+
jvmArgs(arrayOf("-Dlinux.force.trayType=AppIndicator"))
241+
}
242+
}
243+
244+
tasks.withType<ComposeHotRun>().configureEach {
245+
initJvmArgs(this::jvmArgs)
246+
}
247+
200248
compose.desktop {
201249

202250
val buildFullPlatform: Boolean = System.getenv("BUILD_FULL_PLATFORM")?.lowercase() == "true"
@@ -293,24 +341,15 @@ compose.desktop {
293341
// includeAllModules = true
294342
modules("jdk.charsets", "java.net.http")
295343

296-
// Open modules required for all platforms
297-
jvmArgs("--add-opens", "java.desktop/sun.awt=ALL-UNNAMED")
298-
jvmArgs("--add-opens", "java.desktop/java.awt.peer=ALL-UNNAMED")
299-
300-
// Add system properties that need to be set for all platforms
301-
val loggerLevel = project.findProperty("loggerLevel")?.toString() ?: "info"
302344
val appEnv = project.findProperty("appEnv")?.toString() ?: "DEVELOPMENT"
303-
val globalListener = project.findProperty("globalListener")?.toString() ?: "true"
304-
305-
jvmArgs("-DloggerLevel=$loggerLevel")
306-
jvmArgs("-DappEnv=$appEnv")
307-
jvmArgs("-Djava.net.preferIPv4Stack=true")
308-
jvmArgs("-Djava.net.preferIPv6Addresses=false")
309-
jvmArgs("-DglobalListener=$globalListener")
310-
jvmArgs("-Dio.netty.maxDirectMemory=268435456")
311-
jvmArgs(
312-
"-DloggerDebugPackages=com.crosspaste.routing,com.crosspaste.net.clientapi,com.crosspaste.net.plugin",
313-
)
345+
346+
val jvmArgsLambda: (Array<String>) -> Unit = { args ->
347+
args.forEach {
348+
jvmArgs(it)
349+
}
350+
}
351+
352+
initJvmArgs(jvmArgsLambda, buildFullPlatform)
314353

315354
if (appEnv != "DEVELOPMENT") {
316355
tasks.withType<Jar> {
@@ -348,11 +387,6 @@ compose.desktop {
348387
"""
349388
}
350389

351-
jvmArgs("--add-opens", "java.desktop/sun.lwawt=ALL-UNNAMED")
352-
jvmArgs("--add-opens", "java.desktop/sun.lwawt.macosx=ALL-UNNAMED")
353-
jvmArgs("-Dapple.awt.enableTemplateImages=true")
354-
jvmArgs("-Dmac.bundleID=$bundleID")
355-
356390
val process = Runtime.getRuntime().exec(arrayOf("uname", "-m"))
357391
val result =
358392
process.inputStream
@@ -397,7 +431,6 @@ compose.desktop {
397431
}
398432

399433
if (os.isLinux || buildFullPlatform) {
400-
jvmArgs("-Dlinux.force.trayType=AppIndicator")
401434
linux {
402435
targetFormats(TargetFormat.Deb)
403436

gradle/libs.versions.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@ conveyor-control = "1.1"
99
cryptography = "0.5.0"
1010
download = "5.6.0"
1111
filekit = "0.10.0-beta04"
12+
foojay-resolver = "1.0.0"
1213
guava = "33.4.8-jre"
14+
hot-reload = "1.0.0-beta03"
1315
icu4j = "77.1"
1416
imageio = "3.12.0"
1517
intellij-kotlinx-coroutines = "1.10.1-intellij-5"
@@ -114,8 +116,10 @@ turbine = { module = "app.cash.turbine:turbine", version.ref = "turbine" }
114116

115117
[plugins]
116118
compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" }
119+
compose-hot-reload = { id = "org.jetbrains.compose.hot-reload", version.ref = "hot-reload" }
117120
conveyor = { id = "dev.hydraulic.conveyor", version.ref = "conveyor" }
118121
download = { id = "de.undercouch.download", version.ref = "download" }
122+
foojay-resolver-convention = { id = "org.gradle.foojay-resolver-convention", version.ref = "foojay-resolver" }
119123
jetbrainsCompose = { id = "org.jetbrains.compose", version.ref = "compose-plugin" }
120124
kotlinMultiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" }
121125
kotlinSerialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" }

settings.gradle.kts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,8 @@ dependencyResolutionManagement {
2323
}
2424
}
2525

26+
plugins {
27+
id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0"
28+
}
29+
2630
include(":app")

0 commit comments

Comments
 (0)