我有一个gradle脚本,在其中我使用一个变量来配置一个插件(在我的情况下是ospackage,但我想同样适用于另一个插件):
ospackage {
...
version project.ext.my_version
...
}
此变量首先被初始化,然后使用我在构建脚本中首先调用的任务进行更新:
ext {
...
my_version = "XXX"
...
}
task init{
group 'ho'
description 'get HO Version'
doLast {
...
project.ext.my_version = getParameter("VERSION")
...
}
}
问题是插件(在我的情况下为ospackage)始终考虑初始值“ XXX”,而不是通过执行init任务设置的正确值。 我知道它与配置和执行阶段有关,但仍然找不到解决方法来完成我想要的事情。
有关信息,我也尝试创建一个类似于以下任务的任务,但由于buildDeb任务似乎不会覆盖ospackage版本参数,因此它也失败了
buildDeb {
doLast {
...
version project.ext.my_version
link('/usr/bin/aa', '/usr/bin/aa.sh')
...
}
}
我还尝试在文件末尾添加以下内容:
ospackage.dependsOn("init")
但是问题是ospackage无法识别为任务
预先感谢您的帮助。
答案 0 :(得分:1)
在我看来,您的问题的实质围绕着按需价值观。我的理解是,您想在配置阶段设置版本号,并在执行阶段使用该值来使用ospackage插件设置软件包版本。
问题是ospackage文档仅提供了示例(到目前为止),这些示例在配置阶段设置了软件包常量。显然,这是行不通的,因为这是在同时设置版本(必须能够并行完成的操作)。您对doLast
有正确的想法。我发现ospackage中的某些内容无法放在packageName
之类的“ doLast”块中(如果您具有多个相同的包/任务类型),因此我只将需要按需评估的内容放入其中。该块(版本,因为我们需要将其评估延迟到执行阶段)。
我的解决方案是创建一个包含用于解析版本的函数的变量。
def versionForRpm = { -> project.version }
创建配置块
configurations.ext {
version = versionForRpm
...
}
这是一个按需值(即延迟评估值)的示例。
task someRpmBuild(type: Rpm) {
// all package configs that require evaluation during execution phase (lazy)
doLast {
version = configurations.ext.version
requires("someotherpackageinthisbuild", configurations.ext.version(), 0)
}
// all package configs that may be evaluated during the configuration phase
release = configurations.ext.release
packageGroup = configurations.ext.packageGroup
license = configurations.ext.license
packager = configurations.ext.packager
user = configurations.ext.user
distribution = configurations.ext.distribution
vendor = configurations.ext.vendor
url = configurations.ext.url
os = configurations.ext.os
buildHost = configurations.ext.buildHost
epoch = configurations.ext.epoch
arch = configurations.ext.arch
}
请注意,configurations.ext.version
将在执行阶段被自动“调用”。但是,当在requires
中用作参数时,我需要显式调用它。
答案 1 :(得分:0)
根据documentation,任务类型为Deb
:
task fooDeb(type: Deb) {
packageName // Default to project.name
packageDescription // Defaults to project.description
version // Version field, defaults to project.version
arch // Architecture, defaults to "all". E.g. "amd64", "all"
multiArch // Configure multi-arch behavior: NONE (default), SAME, FOREIGN, ALLOWED (see: https://wiki.ubuntu.com/MultiarchSpec )
release // DEB Release
epoch // Epoch, defaults to 0
user // Default user to permission files to
permissionGroup // Default group to permission files to, "group" is used by Gradle for the display of tasks
packageGroup
buildHost
license
packager
distribution
vendor
url
signingKeyId
signingKeyPassphrase
signingKeyRingFile
sourcePackage
provides
uid // Default uid of files
gid // Default gid of files
createDirectoryEntry // [Boolean]
maintainer // Defaults to packager
uploaders // Defaults to packager
priority
summary
conflicts
recommends
suggests
enhances
preDepends
breaks
replaces
}
其中:
版本版本字段,默认为
project.version
可以尝试使用RPM插件。
答案 2 :(得分:0)
我能够解决问题,通过使用以下方式将ospackage复制目标的目标设置为计算值:
configurations.ext{
mydestdir = ""
rpmVersion = "1"
releaseNumber = "1"
}
task init{
group 'ho'
description 'get HO Version'
doLast {
...
configurations.ext.mydestdir = "/store/tmp/+getSubDir()"
configurations.ext.rpmVersion = "123"
configurations.ext.releaseNumber = "456"
...
}
}
task fooRpm(type: Rpm) {
dependsOn init
...
doLast(){
version = configurations.rpmVersion
release = configurations.releaseNumber
}
from(project.tempDir) {
into configurations.mydestdir
fileMode = 0644
user = "nobody"
permissionGroup = "nobody"
}
}
我认为您将使用Deb类型并进行一些更改,但这可以加快构建速度,并且可以在更改前后添加--scan来验证结果。