gradle:如何在配置阶段使用任务结果(插件ospackage)
我有一个gradle脚本,其中我使用变量配置了一个插件(在我的示例中是ospackage,但我想这同样适用于另一个插件),如下所示:gradle:如何在配置阶段使用任务结果(插件ospackage),gradle,Gradle,我有一个gradle脚本,其中我使用变量配置了一个插件(在我的示例中是ospackage,但我想这同样适用于另一个插件),如下所示: ospackage { ... version project.ext.my_version ... } 首先初始化此变量,然后使用我在构建脚本中首先调用的任务更新此变量: ext { ... my_version = "XXX" ... } task init{ group 'ho'
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没有被视为一项任务
提前感谢您的帮助。根据,任务类型为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
}
其中:
versionversion字段,默认为project.version
可能会尝试一下插件。我能够解决我遇到的问题,通过使用
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来验证结果。在我看来,您问题的实质是围绕按需值。我的理解是,您希望在配置阶段设置版本号,并在执行阶段使用该值使用ospackage插件设置包版本 问题在于ospackage文档仅提供了在配置阶段设置包常量的示例(到目前为止)。显然,这是行不通的,因为这是您设置版本的同一时间(必须能够并行完成)。使用
doLast
,您的想法是正确的。我发现ospackage中的一些内容无法放入“doLast”块,如packageName
(如果您有多个相同的包/任务类型),因此我只将需要按需评估的内容放入该块(版本,因为我们需要将其评估延迟到执行阶段)
我的解决方案是创建一个变量来保存解析版本的函数
def versionForRpm = { -> project.version }
创建一个配置块
configurations.ext {
version = versionForRpm
...
}
这是一个按需值(也称为延迟评估值)的示例
请注意,
configurations.ext.version
将在执行阶段自动“调用”。但是,当在requires
中用作参数时,我需要显式调用它。我想我尝试过这个,但是project.ext.my_版本仍然默认为初始值。不过,我不确定我是否在doLast部分中包含了这一点,不幸的是,我要到今晚才能重新尝试。@akasolace什么是getParameter(“VERSION”)
??当只需相应地设置project.version
时,甚至不需要传递包版本。要添加任务依赖项:task fooDeb(dependsOn:init)
getParameter(“version”)是一个函数,它以字符串形式返回版本,如在我的一个java类中定义的:1.0或1.2_BETA。我希望确保project.version与java类中设置的版本相等,以便在运行时动态设置。我也可以在java类和gradle.build中硬编码这个版本,但它看起来不是很干净,而且容易出错。也许我可以设置project.version而不是ext.project.version,但考虑到project.version将在执行时设置,我不知道它将如何解决问题。不,在task fooDeb中,如果我在project.ext.my_version之前放置println(project.ext.my_version),它将打印正确的版本,但是debpackage的版本仍然等于默认值“XXX”。这就像fooDeb不会覆盖ospackage配置设置的值一样。我也有同样的问题。我能看到的唯一解决方案是在配置阶段完成所有工作。(这让我在内部尖叫,因为gradle已经竭尽全力分割配置和执行)试着注释掉你的doLast块,停止强迫它进入执行阶段。如果我找到了,我会添加一个正确的答案。@CalvinTaylor这就是我最后在配置阶段所做的设置。我在配置与执行阶段的经历一直很痛苦…@akasolace在我看来,你的问题的实质是围绕着按需价值观。我再补充一个答案。我也遇到过类似的问题,但问题的根源却不同。是的,看起来这就是解决问题的方法。。。不幸的是,我将不测试这一点,因为我最近将项目移动到install4J以用于构建工件。但是非常感谢你花时间回答并教我一些东西!
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
}