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

调用一个Gradle任务从另一个与参数

应煌
2023-03-14

我有一个gradle任务,它调用一个脚本,并使用-PARGS将命令行参数传递给脚本。

task taskAll(type: Exec, dependsOn: taskinit) {
    environment['PROJECT_ROOT'] = "${projectDir}"
    workingDir rootProject.projectDir.path
    description = 'Main task'

    executable rootProject.projectDir.path + "/execute.me"
    if (project.hasProperty('ARGS')) {
        args(ARGS.split(','))
    }
}

我将此任务称为gradle任务,具有以下任何选项

./gradlew taskAll
./gradlew taskAll -PARGS="arg1"
./gradlew taskAll -PARGS="arg2"

不过,我想看看我是否将taskAll拆分为多个任务,比如

./gradlew taskA    #Calls task taskAll with arg1
./gradlew taskB    #Calls task taskAll with arg2

我明白我将不得不复制taskAll来创建taskAtaskB,并删除其中的if条件和硬代码参数。

然而,我想知道是否有可能通过让只调用可执行文件的MainTask,然后让TaskATaskBTaskC调用MainTask,并传递参数arg1arg2arg3,来实现一个更简洁的实现。

共有3个答案

闾丘晨
2023-03-14

您可以使用ext:

task outraTask << {
    printf(arg0)
    printf(arg1)
}

project(':projetc2').tasks.outraTask {
    ext.arg0 = "0"
    ext.arg1 = "1"
}.execute()

输出:

> Task :projetc2:outraTask
0
1
谭建章
2023-03-14

使用GradleBuild API做这件事的一个更漂亮的方法是:

    task ('taskA', type: GradleBuild) {
        startParameter.projectProperties = ['ARGS':'arg1']
        tasks = ['taskAll']
    }
    
    task ('taskB', type: GradleBuild) {
        startParameter.projectProperties = ['ARGS':'arg2']
        tasks = ['taskAll']
    }

您可以具有复杂的项目属性,例如命令行参数-Pmyextension。config=true将变为:

startParameter.projectProperties = ['myextension.config':true]

请注意,这将删除CLI参数。如果需要附加它:

startParameter.projectProperties << project.getGradle().getStartParameter().getProjectProperties() << ['myextension.config':true]
阳德润
2023-03-14

在大多数情况下,从另一个任务执行一个任务是通过配置任务依赖关系完成的,通过提供依赖关系和可选的必须运行后属性。在你的情况下,不可能使用它,因为你的主任务必须在一些配置任务之后执行。在这种情况下,可以使用任务的finazedBy属性。

对于您的需求,您可以创建许多任务,这些任务将使用预定义的参数设置一些脚本变量,就像您需要的那样。你可以把你的主要任务,也就是所谓的东西,放在这个论点上。你需要做的唯一一件事,就是让每个定制任务由你的主要任务来完成。因此,自定义任务的每次调用都会在执行后执行主任务。

下面是一个简短的例子,如何做到这一点:

//define a variable to store arguments
def ARGS = null

//2 custom tasks, which set arguments during the execution phase
task taskA << {
    ARGS = "poperty1,property2"
}

task taskB << {
    ARGS = "property3,property4"
}

//your main task
task mainTask (type: Exec) {
    environment['PROJECT_ROOT'] = "${projectDir}"
    workingDir rootProject.projectDir.path
    description = 'Main task'

    executable rootProject.projectDir.path + "/execute.me"

    //here is the main difference, we moved arguments setting into 
    //execution phase, before execution of this task
    doFirst{
        //if you call custom task it will be executed with predefined params
        if (ARGS != null) {
            args(ARGS)
        //if you call mainTask, you are able to pass arguments via command line with -PCOMMAND_LINE_ARGS=123
        } else if (project.hasProperty('COMMAND_LINE_ARGS')) {
            args(COMMAND_LINE_ARGS)
        } else {
            throw new GradleException("No arguments found")
        }
    }
}

//finilization settings for custom tasks
taskA.finalizedBy mainTask
taskB.finalizedBy mainTask
 类似资料:
  • 我在用Gradle。我有两个任务:“A”和“B”。我想让任务“A”调用任务“B”。我怎么能这么做? 是否可以简单地从现有任务中调用另一个任务?

  • 问题内容: 我有以下使用类的课程。所以我想做的是,在运行cp1实例处理方法的同时,我要并行运行。 但是,我要按顺序cp1,所以我要它运行并完成,如果cp2没有完成或失败,那就很好。如果确实失败,我想加入结果。该示例中未返回任何内容,但我想返回结果。 为此,应该使用TaskExecutor吗?还是线程? 我只希望cp2与cp1并行运行。或者,如果我添加更多内容,例如说cp3,我希望它也可以与cp1并

  • 在TypeScript中,可以用“Rest参数”声明函数: 假设我声明了另一个调用的函数: 编译器产生以下消息: 提供的参数与调用目标的任何签名都不匹配:无法将类型“string”应用于类型为“string[]”的参数2。 如何才能调用将提供的参数?

  • 问题内容: 这有道理吗? 假设我需要从数据库中获取一个与另一个对象有关系的对象(由数据库中的外键以及域对象中的组合表示)。如果在我的第一个DAO中,我获取对象1的数据,则调用对象2的dao,最后(从第一个DAO中,调用对象1中的setter,并为其提供先前获取的对象2)。 我知道我可以代替加入连接,但是对我来说,断开功能耦合似乎更合乎逻辑(这就是为什么我对从另一个调用一个dao持怀疑态度)。还是应

  • 我正在使用ZXING1.7库开发J2ME条形码扫描器,因为1.7是支持J2ME的最新版本。 由于条形码功能已经作为这个Zxing的一部分出现了,所以我需要从我的组件MIDlet调用ZxingMidlet.java。 由于我对J2ME非常陌生,所以我不知道如何从另一个MIDlet调用ZxingMidlet。如果有人已经在J2ME上工作过/有这方面的经验,请提供您的投入/支持。 这对我会有很大的帮助。

  • 我正在从事一个spring boot项目,以自动化与gradle的集成测试。我最近开始在一家新企业工作,我的同事们按如下方式运行集成测试:在构建中。gradle文件有一个集成测试任务 启动任务后,应用程序开始在指定端口运行,然后打开postman,导入集合并运行测试。 我的工作是找到一种方法来跳过额外的点击,即自动运行邮递员集合。第一个想法是使用postman-run gradle插件,但由于企业