Groovy 在nebula测试下运行的自定义Gradle任务无法查看创建的目录

Groovy 在nebula测试下运行的自定义Gradle任务无法查看创建的目录,groovy,gradle,nebula-test,Groovy,Gradle,Nebula Test,我有一个自定义Gradle插件的工作版本。我有几个单元测试,现在我正在尝试使用nebula测试来进行集成测试 我在集成测试中遇到了一个令人困惑的测试错误。我在使用星云测试时一定是做错了什么 我将展示完整的代码,但我将首先描述基本内容 该插件定义了一个扩展块,其中包含一些属性,其中一个是可以找到特定文件的文件路径。对于上下文,该属性名称为“yangFilesRootDir” 该插件创建一个名为“生成”的自定义任务实例。该任务有一个名为“yangFilesRootDir”的实例变量,类型为File,

我有一个自定义Gradle插件的工作版本。我有几个单元测试,现在我正在尝试使用nebula测试来进行集成测试

我在集成测试中遇到了一个令人困惑的测试错误。我在使用星云测试时一定是做错了什么

我将展示完整的代码,但我将首先描述基本内容

该插件定义了一个扩展块,其中包含一些属性,其中一个是可以找到特定文件的文件路径。对于上下文,该属性名称为“yangFilesRootDir”

该插件创建一个名为“生成”的自定义任务实例。该任务有一个名为“yangFilesRootDir”的实例变量,类型为File,该实例变量上有一个@InputDirectory注释。该任务还有其他实例变量,其中一些带有“@Input…”注释

任务有一个“init”方法,该方法在项目评估后从插件调用。这将根据扩展块中的值初始化任务实例变量。在“init”方法中,如果扩展块中没有设置“yangFilesRootDir”属性,我将使用默认值“src/main/yang”

在进行这个集成测试之前,我设置了一个引用插件的独立项目。这个项目的“build.gradle”指定了扩展块,我已经用属性设置和不使用属性设置对它进行了测试(我将文件存储在默认位置),它工作正常

这就是我的规范现在的样子:

class YangPluginIntegSpec extends IntegrationSpec {
def 'simple'() {
    createFile("src/main/yang/dummy")
    writeHelloWorld("com.example")
    buildFile << applyPlugin(YangPlugin)
    buildFile << '''
        yang {
            yangFilesRootDir 'src/main/yang'
        }
    '''.stripIndent()

    when:
    ExecutionResult result = runTasksSuccessfully('build')

    then:
    println result
}
我还使用“-I”运行了它,以便获得更多信息,它向我显示了测试的临时构建目录的路径,测试失败后,我验证了测试项目目录中是否存在“src/main/yang/dummy”

以下是插件类的相关代码:

    class YangPlugin implements Plugin<Project> {
        public void apply(Project project) {
            YangExtension   yang  = project.extensions.create(YANG_EXT, YangExtension, project)
            YangGenerateTask  task  = project.task(YANG_GENERATE_TASK, type: YangGenerateTask)
            project.afterEvaluate {
                task.init(project, yang)
                project.compileJava.dependsOn task
                if (task.yangFilesRootDir && task.yangFilesRootDir.exists()) {
                    Jar jarTask = project.jar
                    if (task.yangFilesRootDir.getPath().startsWith(FilenameUtils.normalize(SRC_MAIN_RESOURCES))) {
                        jarTask.exclude(task.yangFilesRootDir.getPath() - FilenameUtils.normalize(SRC_MAIN_RESOURCES))
                    }
                    jarTask.from(task.yangFilesRootDir) { into(META_INF_YANG) }
                }
            }
        }
    }
类插件实现插件{
公开作废申请(项目){
YangExtension yang=project.extensions.create(yang_EXT,YangExtension,project)
YangGenerateTask=project.task(YangGenerateTask,类型:YangGenerateTask)
项目后评估{
task.init(项目,yang)
project.compileJava.dependsOn任务
if(task.yangFilesRootDir&&task.yangFilesRootDir.exists()){
Jar jarTask=project.Jar
if(task.yangFilesRootDir.getPath().startsWith(FilenameUtils.normalize(SRC_MAIN_RESOURCES))){
exclude(task.yangFilesRootDir.getPath()-FilenameUtils.normalize(SRC_MAIN_资源))
}
jarTask.from(task.yangFilesRootDir){into(META_INF_YANG)}
}
}
}
}
以及生成任务的相关部分:

    class YangGenerateTask extends DefaultTask {
        private static final String DEFAULT_YANG_FILES_ROOT_DIR = "src/main/yang"   

        Project         project

        Collection<CodeGeneratorConfig> generators
        boolean                         inspectDependencies
        Collection<String>              excludeFiles
        String                          yangFilesConfiguration
        String                          generatorsConfiguration

        Pattern         yangFilePattern = Pattern.compile("META-INF/yang/.*\\.yang\$")

        @InputDirectory
        File    yangFilesRootDir

        @Input
        def getGeneratorClasses() {
            ...
        }

        @InputFiles
        def getOptionalYangClasspath() {
         ...
        }

        @OutputDirectories
        def getOutputDirectories() {
         ...
        }

        @TaskAction
        void generate() {
         ...
        }

        public void init(Project project, YangExtension yang) {
            this.yangFilesRootDir           = new File(yang.yangFilesRootDir ?: DEFAULT_YANG_FILES_ROOT_DIR)
            ...
        }
    }
generateTask类扩展了DefaultTask{
私有静态最终字符串默认值\u YANG\u FILES\u ROOT\u DIR=“src/main/YANG”
工程项目
收集生成器
布尔检查依赖项
集合排除文件
字符串配置
字符串生成器配置
Pattern-yangFilePattern=Pattern.compile(“META-INF/yang/*\\\.yang\$”)
@输入目录
文件根目录
@输入
def getGeneratorClasses(){
...
}
@输入文件
def getOptionalYangClasspath(){
...
}
@输出目录
def getOutputDirectory(){
...
}
@任务行动
void生成(){
...
}
公共void init(阳阳扩建项目){
this.yangFilesRootDir=新文件(yang.yangFilesRootDir?:默认值\u yang\u FILES\u ROOT\u DIR)
...
}
}
更新

最后我想在调试器中运行这个测试,我发现找不到路径的原因是“当前目录”不是测试项目的基本目录,而是主插件项目的基本目录,它肯定没有“src/main/yang”目录。

gradle上的某个人告诉我如何打开插件代码中与project basedir(project.file(…)相关的文件,在我更改插件代码后,这个错误消失了

    class YangGenerateTask extends DefaultTask {
        private static final String DEFAULT_YANG_FILES_ROOT_DIR = "src/main/yang"   

        Project         project

        Collection<CodeGeneratorConfig> generators
        boolean                         inspectDependencies
        Collection<String>              excludeFiles
        String                          yangFilesConfiguration
        String                          generatorsConfiguration

        Pattern         yangFilePattern = Pattern.compile("META-INF/yang/.*\\.yang\$")

        @InputDirectory
        File    yangFilesRootDir

        @Input
        def getGeneratorClasses() {
            ...
        }

        @InputFiles
        def getOptionalYangClasspath() {
         ...
        }

        @OutputDirectories
        def getOutputDirectories() {
         ...
        }

        @TaskAction
        void generate() {
         ...
        }

        public void init(Project project, YangExtension yang) {
            this.yangFilesRootDir           = new File(yang.yangFilesRootDir ?: DEFAULT_YANG_FILES_ROOT_DIR)
            ...
        }
    }