gradle:如何在配置阶段使用任务结果(插件ospackage)

gradle:如何在配置阶段使用任务结果(插件ospackage),gradle,Gradle,我有一个gradle脚本,其中我使用变量配置了一个插件(在我的示例中是ospackage,但我想这同样适用于另一个插件),如下所示: ospackage { ... version project.ext.my_version ... } 首先初始化此变量,然后使用我在构建脚本中首先调用的任务更新此变量: ext { ... my_version = "XXX" ... } task init{ group 'ho'

我有一个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没有被视为一项任务

提前感谢您的帮助。

根据,任务类型为
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
}