当前位置: 首页 > 知识库问答 >
问题:

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

程墨竹
2023-03-14

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

事先谢谢你的帮助。

共有2个答案

汪德明
2023-03-14

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

其中:

version版本字段,默认值为Project.version

可能会给RPM插件一个尝试。

宫铭
2023-03-14

在我看来,你的问题的本质是围绕着点播价值的。我的理解是,您希望在配置阶段设置一个版本号,并在执行阶段使用该值使用ospackage插件设置包版本。

问题是ospackage文档仅提供了在配置阶段设置包常量的示例(到目前为止)。显然,这是行不通的,因为这是您设置版本的同一时间(必须能够并行完成的事情)。您对dolast有正确的想法。我发现来自ospackage的一些东西不能放在“dolast”块中,如packageName(如果您有多个相同的包/任务类型),所以我只是将需要按需评估的东西放在那个块中(版本,因为我们需要将其评估延迟到执行阶段)。

我的解决方案是创建一个变量来保存解析版本的函数。

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中的参数时,我需要显式调用它。

 类似资料:
  • https://docs.gradle.org/current/userguide/custom_tasks.html 如何使此任务在执行阶段运行?正在传递一个空闭包 唯一的解决办法? 但是hello任务似乎是在构建的配置阶段调用的。

  • 我是格雷德尔的新手。我正在尝试使用一个插件,但我想在执行过程中更改插件的默认值 我希望在执行过程中使用project.version中存在的版本值。但看起来该值是在执行任何任务之前设置的。有什么想法吗?

  • 下面我们假设每个时间点只有一个Spark作业在运行。 以下是我所理解的在Spark中发生的事情: 创建时,每个工作节点都启动一个执行器。执行程序是单独的进程(JVM),它连接回驱动程序。每个执行器都有驱动程序的jar。退出驱动程序,关闭执行程序。每个执行程序可以保存一些分区。 执行作业时,将根据沿袭图创建执行计划。 执行作业被拆分为多个阶段,其中阶段包含相同数量的相邻转换和操作(在沿袭图中),但不

  • 试图了解如何创建自定义插件。但我无法完成我的新任务。我得到这个错误: 无法应用插件[id为“Code4Reference”] 更新:现在我面临另一个问题,当执行我的新任务,应该签署所有的RPM在路径上找到。我知道这在大楼里很好用。格拉德尔: 在libs.gradle.sign类型的任务“:MyTask”上找不到参数[libs.gradle.sign$_showmessage_closure1@4b

  • 我有一个Gradle任务,简单地将文件从一个文件夹复制到另一个文件夹。 当在配置阶段调用copy'from''into'方法时,它可以工作,但当在执行阶段调用它们时,它就不工作了。 这样做是有效的 gradle copyServerConfig 如果我把它放在doFirst{}块中,也会发生同样的事情。 我不明白的另一件事是: gradle task1 但如果我改成这样: gradle task1

  • 我正在尝试将Gradle插件中的一些任务配置从Groovy转换为Kotlin。我发现的所有示例都是关于普通构建脚本的,这种方法似乎并没有直接转化为插件的使用。我的尝试如下: 产生以下错误: 类型不匹配:推断类型是()- 做这件事的正确方法是什么?