Jetpack Compose应用Gradle配置:将ps1目录复制到发布目录
如何在Jetpack Compose桌面应用构建时自动复制PowerShell脚本到发布目录
需求说明
我需要让Jetpack Compose桌面应用能够执行项目根目录ps1文件夹中的PowerShell脚本。使用createReleaseDistributable任务构建应用,独立发布版本的生成路径为:
..\MyApp\build\compose\binaries\main-release\app\MyApp-v1.2.3
该目录包含app、runtime文件夹以及MyApp.exe。希望将ps1目录复制到发布目录的以下位置:
..\MyApp\build\compose\binaries\main-release\app\MyApp-v1.2.3\app\resources\ps1
现有尝试
我已编写测试任务copyPs1,但目标路径是临时目录,不符合需求:
tasks.register("copyPs1") { doLast { copy { from("${layout.projectDirectory}/ps1") // 临时目标路径,非预期位置 into("${layout.projectDirectory}/ps2") // 期望目标路径 // into("${SOME_RELEASE_DIR_VARIABLE}/resources/ps1") include("*.ps1") } } }
目前用硬编码路径作为临时方案,绑定到compileKotlin任务,但这种方式不够灵活:
// 临时硬编码路径 into("${layout.buildDirectory.get().asFile}/compose/binaries/main-release/app/MyApp-v${version}/app/resources/ps1")
tasks { compileKotlin { dependsOn("copyPs1") } }
解决方案
可以通过Compose桌面的构建配置动态获取发布目录路径,避免硬编码,同时将复制任务关联到正确的构建阶段:
完整Gradle配置示例
plugins { kotlin("jvm") id("org.jetbrains.compose") } compose.desktop { application { mainClass = "com.example.MyAppKt" // 替换为你的主类路径 nativeDistributions { targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.Deb) packageName = "MyApp" // 应用包名,与发布目录命名一致 packageVersion = version.toString() // 版本号,自动读取项目version } } } // 注册复制ps1脚本的任务 tasks.register<Copy>("copyPs1") { // 源路径:项目根目录下的ps1文件夹 from(layout.projectDirectory.dir("ps1")) include("*.ps1") // 动态构建目标路径:从nativeDistributions配置中获取包名和版本号 val nativeDistConfig = compose.desktop.application.nativeDistributions val targetDir = layout.buildDirectory.dir( "compose/binaries/main-release/app/${nativeDistConfig.packageName.get()}-${nativeDistConfig.packageVersion.get()}/app/resources/ps1" ) into(targetDir) // 确保复制任务在应用打包完成后执行 dependsOn(tasks.named("packageReleaseDistribution")) // 让发布构建任务依赖此复制任务,执行createReleaseDistributable时自动触发复制 tasks.named("createReleaseDistributable").configure { dependsOn(this@register) } }
配置说明
- 动态路径构建:使用
nativeDistributions中的packageName和packageVersion配置项,自动匹配发布目录的命名规则,避免硬编码应用名和版本号。 - 任务依赖顺序:将
copyPs1依赖于packageReleaseDistribution,确保目标目录已由打包任务生成后再执行复制;同时让createReleaseDistributable依赖copyPs1,保证发布构建时自动完成脚本复制。 - 替换原有依赖:移除绑定到
compileKotlin的配置,因为编译阶段发布目录尚未生成,关联到发布相关任务更合理。
执行./gradlew createReleaseDistributable后,ps1文件夹中的脚本会自动复制到目标位置。
内容的提问来源于stack exchange,提问作者t3chb0t
相关产品推荐
相关产品推荐

