我是新手,试图打包我的一个小项目。构建我的分发包时,结构如下:
bin
我想要实现的是在项目根文件夹中使用启动脚本而不是my-project.zip
|
+- my-project
|
+- lib
+- xyz (folders from src/dist)
+- my-project.bat
+- my-project.sh
子文件夹(我知道这是某种约定,但我也想从应用程序中启动我的应用程序文件夹):
tasks.startScripts.outputDir
这可能吗?
我已尝试设置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')
}
}
,但没有成功(脚本已从分发包中完全删除)。
更新
除了lu.koerfer的回答,我还必须修改启动脚本以考虑更改后的APP_HOME:
Result Set
答案 0 :(得分:2)
您不想关心创建启动脚本(startScripts
任务),而是关于创建zip文件(distZip
任务)来控制文件将被放置。为此,您可以直接使用Gradle Distribution插件中的distZip
任务或DistributionContainer
,该插件会自动应用于Gradle应用程序插件。 DistributionContainer
允许您在Gradle项目中管理多个发行版的创建,而应用程序插件默认使用main
发行版。
distributions.main {
contents {
from startScripts
}
}
这段代码只是将startScripts
任务的输出添加到main
分发内容中。它们将被放置在此发行版的根文件夹中,因为您未使用CopySpec
方法指定子into
。
我假设您希望根文件夹中的启动脚本仅,但也不希望在bin
文件夹中。由于您只能根据源路径而不是目标路径排除Copy
任务的文件,因此您需要在复制时通过eachFile
方法将其排除(因为然后他们的目的地已知):
distZip {
eachFile { file ->
if (file.path.contains('bin')) {
file.exclude()
}
}
}
当然,这段代码将从zip文件中删除整个bin
目录,因此您可能需要在闭包中重新描述其他用例的条件。