You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)
    }
}

配置说明

  1. 动态路径构建:使用nativeDistributions中的packageName和packageVersion配置项,自动匹配发布目录的命名规则,避免硬编码应用名和版本号。
  2. 任务依赖顺序:将copyPs1依赖于packageReleaseDistribution,确保目标目录已由打包任务生成后再执行复制;同时让createReleaseDistributable依赖copyPs1,保证发布构建时自动完成脚本复制。
  3. 替换原有依赖:移除绑定到compileKotlin的配置,因为编译阶段发布目录尚未生成,关联到发布相关任务更合理。

执行./gradlew createReleaseDistributable后,ps1文件夹中的脚本会自动复制到目标位置。

内容的提问来源于stack exchange,提问作者t3chb0t

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 19:25:15