gradle - Gradle:如何为指定的输入文件运行任务?
问题描述
我有一个使用 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 对输入和输出依赖项做出假设,这种方法可以打破这种假设。
解决方案
如果您添加了 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
推荐阅读
- command - Gitlab有没有办法通过突击队创建一个叉子并识别它?
- npm - NPM 是否默认安装最新的 SEMVER 或最后发布的?
- java - 第一次尝试 Struts 2 并得到 404 Not Found 错误。我将如何解决这个问题?
- python - Python 多处理和组合 DF
- powershell - 从 Powershell 脚本更改 MSBuild 属性
- python - 为什么这个正则表达式不删除'\'和'-'?
- unity3d - 在开发自己的游戏时如何阅读和使用 Unity Doc Scripting API?
- python - Pepper 和 NAO 机器人的远程视频流
- javascript - 未捕获的类型错误:无法读取 null 的属性“addEventListener”无法弄清楚原因
- c# - Cefsharp 75 中的已下载项目不再显示图标