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

时间:2018-11-01 07:50:28

标签: gradle

我有一个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无法识别为任务

预先感谢您的帮助。

3 个答案:

答案 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来验证结果。