0

我有一个使用 ProtoBuffer 插件并运行一些任务的 Gradle 构建文件。在某些时候,某些任务会针对某些文件运行,这些文件是任务的输入。

我想修改作为这些任务输入的文件集。说,我希望使用列出的文件运行任务,每行一个,在特定文件中。我怎样才能做到这一点?

编辑:这是相当大的 build.gradle 的一部分,它提供了一些上下文。

configure(protobufProjects) {
    apply plugin: 'java'

    ext {
        protobufVersion = '3.9.1'
    }

    dependencies {
        ...
    }

    protobuf {
        generatedFilesBaseDir = "$projectDir/gen"

        protoc {
            if (project.hasProperty('protocPath')) {
                path = "$protocPath"
            }
            else {
                artifact = "com.google.protobuf:protoc:$protobufVersion"
            }
        }

        plugins {
            ...
        }

        generateProtoTasks {
            all().each { task ->
                ...
            }
        }

        sourceSets {
            main {
                java {
                    srcDirs 'gen/main/java'
                }
            }
        }
    }

    clean {
        delete protobuf.generatedFilesBaseDir
    }

    compileJava {
        File generatedSourceDir = project.file("gen")
        project.mkdir(generatedSourceDir)
        options.annotationProcessorGeneratedSourcesDirectory = generatedSourceDir
    }
}

问题是,如何修改现有任务的输入文件集(已经对它们做了一些事情),而不是如何创建新任务。

编辑 2:根据如何修改 Gradle 复制任务中的文件列表?,一般来说这是一个坏主意,因为 Gradle 对输入和输出依赖项做出假设,这种方法可以打破这种假设。

4

1 回答 1

0

如果您添加了 gradle 文件并且更具体,那将非常有帮助。我将尝试根据我的理解举一个例子:

fun listFiles(fileName: String): List<String> {
    val file = file(fileName).absoluteFile
    val listOfFiles = mutableListOf<String>()
    file.readLines().forEach {
        listOfFiles.add(it)
    }
    return listOfFiles
}

tasks.register("readFiles") {
    val inputFile: String by project
    val listOfFiles = listFiles(inputFile)
    listOfFiles.forEach {
        val file = file(it).absoluteFile
        file.readLines().forEach { println(it) }
    }
}

然后像这样运行gradle:gradle -PinputFile=<path_to_the_file_that_contains_list_of_files> readFiles

于 2020-01-31T03:22:26.783 回答