Groovy 在nebula测试下运行的自定义Gradle任务无法查看创建的目录
我有一个自定义Gradle插件的工作版本。我有几个单元测试,现在我正在尝试使用nebula测试来进行集成测试 我在集成测试中遇到了一个令人困惑的测试错误。我在使用星云测试时一定是做错了什么 我将展示完整的代码,但我将首先描述基本内容 该插件定义了一个扩展块,其中包含一些属性,其中一个是可以找到特定文件的文件路径。对于上下文,该属性名称为“yangFilesRootDir” 该插件创建一个名为“生成”的自定义任务实例。该任务有一个名为“yangFilesRootDir”的实例变量,类型为File,该实例变量上有一个@InputDirectory注释。该任务还有其他实例变量,其中一些带有“@Input…”注释 任务有一个“init”方法,该方法在项目评估后从插件调用。这将根据扩展块中的值初始化任务实例变量。在“init”方法中,如果扩展块中没有设置“yangFilesRootDir”属性,我将使用默认值“src/main/yang” 在进行这个集成测试之前,我设置了一个引用插件的独立项目。这个项目的“build.gradle”指定了扩展块,我已经用属性设置和不使用属性设置对它进行了测试(我将文件存储在默认位置),它工作正常 这就是我的规范现在的样子:Groovy 在nebula测试下运行的自定义Gradle任务无法查看创建的目录,groovy,gradle,nebula-test,Groovy,Gradle,Nebula Test,我有一个自定义Gradle插件的工作版本。我有几个单元测试,现在我正在尝试使用nebula测试来进行集成测试 我在集成测试中遇到了一个令人困惑的测试错误。我在使用星云测试时一定是做错了什么 我将展示完整的代码,但我将首先描述基本内容 该插件定义了一个扩展块,其中包含一些属性,其中一个是可以找到特定文件的文件路径。对于上下文,该属性名称为“yangFilesRootDir” 该插件创建一个名为“生成”的自定义任务实例。该任务有一个名为“yangFilesRootDir”的实例变量,类型为File,
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)
...
}
}