我对 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')
}
}
2条答案
按热度按时间omjgkv6w1#
您不需要关心启动脚本的创建(
startScripts
任务),而需要关心zip文件的创建(distZip
任务),以控制文件的放置位置。为此,您可以直接使用Gradle分发插件中的distZip
任务或DistributionContainer
,该任务将通过Gradle应用程序插件自动应用。DistributionContainer
允许您管理Gradle项目中多个发行版的创建,而Application插件默认使用main
发行版。这段代码只是将
startScripts
任务的输出添加到main
分发内容中。它们将被放置在此发行版的根文件夹中,因为您没有使用into
方法指定子CopySpec
。我假设您希望启动脚本只在根文件夹中,而不是在
bin
文件夹中。由于您只能根据Copy
任务的源路径而不是目标路径来排除它们,因此您需要在复制它们时通过eachFile
方法排除它们(因为这样它们的目标就已知了):当然,这段代码将从zip文件中删除整个
bin
目录,因此您可能需要重新描述闭包中的条件以用于其他用例。dhxwm5r42#
对于Gradle v8,脚本略有变化。所以,为了正确设置
APP_HOME
,我必须这样做: