在Gradle构建中自定义开始脚本的位置

fae0ux8s  于 2023-10-19  发布在  其他
关注(0)|答案(2)|浏览(136)

我对 Package 我的一个小项目很陌生。在构建我的分发包时,结构如下:

my-project.zip
|
+- my-project
   |
   +- bin (containing start scripts)
   +- lib
   +- xyz (folders from src/dist)

我想要实现的是将启动脚本放在项目根文件夹中,而不是bin子文件夹中(我知道这是某种约定,但我也喜欢从应用程序文件夹中启动应用程序):

my-project.zip
|
+- my-project
   |
   +- lib
   +- xyz (folders from src/dist)
   +- my-project.bat
   +- my-project.sh

这可能吗?
我试过设置tasks.startScripts.outputDir,但没有成功(脚本完全从分发包中删除)。

更新

除了lu.koerfer的回答之外,我还必须修改启动脚本,以考虑更改后的APP_HOME:

startScripts {
    startScripts.applicationName = artefactsBaseName
    doLast {
        def windowsScriptFile = file getWindowsScript()
        def unixScriptFile = file getUnixScript()
        windowsScriptFile.text = windowsScriptFile.text.replace('set APP_HOME=%DIRNAME%..', 'set APP_HOME=%DIRNAME%')
        unixScriptFile.text = unixScriptFile.text.replace('cd "`dirname \"$PRG\"`/.." >/dev/null', 'cd "`dirname \"$PRG\"`" >/dev/null')
    }
}
omjgkv6w

omjgkv6w1#

您不需要关心启动脚本的创建(startScripts任务),而需要关心zip文件的创建(distZip任务),以控制文件的放置位置。为此,您可以直接使用Gradle分发插件中的distZip任务或DistributionContainer,该任务将通过Gradle应用程序插件自动应用。DistributionContainer允许您管理Gradle项目中多个发行版的创建,而Application插件默认使用main发行版。

distributions.main {
    contents {
        from startScripts
    }
}

这段代码只是将startScripts任务的输出添加到main分发内容中。它们将被放置在此发行版的根文件夹中,因为您没有使用into方法指定子CopySpec
我假设您希望启动脚本在根文件夹中,而不是在bin文件夹中。由于您只能根据Copy任务的源路径而不是目标路径来排除它们,因此您需要在复制它们时通过eachFile方法排除它们(因为这样它们的目标就已知了):

distZip {
    eachFile { file ->
        if (file.path.contains('bin')) {
            file.exclude()
        }
    }
}

当然,这段代码将从zip文件中删除整个bin目录,因此您可能需要重新描述闭包中的条件以用于其他用例。

dhxwm5r4

dhxwm5r42#

对于Gradle v8,脚本略有变化。所以,为了正确设置APP_HOME,我必须这样做:

startScripts {
    doLast {
        def windowsScriptFile = file getWindowsScript()
        def unixScriptFile = file getUnixScript()

        windowsScriptFile.text = windowsScriptFile.text.replace('set APP_HOME=%DIRNAME%..', 'set APP_HOME=%DIRNAME%')
        unixScriptFile.text = unixScriptFile.text.replace('APP_HOME=$( cd "${APP_HOME:-./}.." && pwd -P ) || exit', 'APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit')
    }
}

相关问题