尝试将依赖任务添加到C插件创建的任务时,为什么会出现错误?

时间:2019-04-17 17:11:17

标签: gradle

我有一个使用C插件生成本地可执行文件的构建脚本。当我尝试添加一个从属任务(一个从Flex输入文件生成一个Flex输出文件的任务)时,出现错误或我的从属任务未执行。我认为正在发生的事情是在模型创建其任务之前先评估添加依赖任务的声明。如果真是这样,那么我需要知道如何使从属任务声明更加懒惰(或者向我尚不了解的模型中添加一些内容)。我应该通过一个单独的项目来做到这一点吗?

我认为这是构建脚本的必要部分。我已注释掉我声明依赖项的尝试。

$ cat build.gradle
apply plugin: 'c'

model {
    components {
        test(NativeExecutableSpec) {
            sources {
                c {
                    source {
                        srcDir "."
                        include "*.c"
                    }
                }
            }
        }
    }
}

task compileLang (type: Exec) {
    inputs.file(project.file('test.l'))
    outputs.file(project.file('lex.test.c'))
    commandLine 'flex', '-f', '-L', '-8', '-i', '-P', 'test', 'test.l'
}

//buildDependentsTestExecutable.dependsOn compileLang
//project.task('buildDependentsTestExecutable').dependsOn compileLang
//project.tasks.getByName('buildDependentsTestExecutable').dependsOn compileLang
//tasks['buildDependentsTestExecutable'].dependsOn compileLang

我认为这些是我执行“渐变任务”时配置的相关任务:

Build tasks
-----------
assemble - Assembles the outputs of this project.
build - Assembles and tests this project.
clean - Deletes the build directory.
installTestExecutable - Installs a development image of executable 'test:executable'
testExecutable - Assembles executable 'test:executable'.

Build Dependents tasks
----------------------
assembleDependentsTest - Assemble dependents of native executable 'test'.
assembleDependentsTestExecutable - Assemble dependents of executable 'test:executable'.
buildDependentsTest - Build dependents of native executable 'test'.
buildDependentsTestExecutable - Build dependents of executable 'test:executable'.

如果需要test.c和test.l来使某人更轻松地回答问题...

$ cat test.c
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char *argv[]) {
    puts("hello, world");
    testwrap();
}
$ cat test.l
%s OLC
%%
<INITIAL>-- {
    BEGIN(OLC);
}
<OLC>\n\r? {
    BEGIN(INITIAL);
}
<OLC>. {
}
%%
int yywrap () {
    return 1;
}

我正在使用gradle 5.1.1。

2 个答案:

答案 0 :(得分:1)

任务似乎是在Gradle配置阶段的稍后阶段创建的。

我建议在任务容器上添加一个侦听器,它对您的示例有用:

project.tasks.whenObjectAdded { Task t -> 
    println 'Task added: ' + t.name
    if ('buildDependentsTestExecutable'.equals(t.name)) {
        t.dependsOn compileLang
    }
}

我对'c'插件或模型{}配置不熟悉,所以我的建议是基于对Gradle的一般了解。

答案 1 :(得分:0)

我不必定义多个项目,但是我必须定义两个构建脚本。当然,有脆性,但至少可以起作用。

这是build.gradle

task LC (type: Exec) {
    inputs.file(project.file('test.l'))
    outputs.dir(buildDir)
    outputs.file("$buildDir/lex.test.c")
    commandLine 'flex', '-f', '-L', '-8', '-i', '-P', 'test', '-o', "$buildDir/lex.test.c", 'test.l'
}

task copyC (type: Copy) {
    from "."
    into buildDir
    include "*.c"
}

task build (type: GradleBuild) {
    dependsOn 'LC', 'copyC'
    buildFile = 'compileC.gradle'
    tasks = ['build']
}

这是compileC.gradle

apply plugin: 'c'

model {
    components {
        test(NativeExecutableSpec) {
            sources {
                c {
                    source {
                        srcDir buildDir
                        include "*.c"
                    }
                }
            }
        }
    }
}