我的Gradle项目之一有10个子项目。对于Gradle任务中的每个项目,我想生成一个Java属性文件来指定项目名称,因为我需要在运行时知道项目名称。属性文件应转到每个项目的资源目录。因为项目的数量可能会随着时间的推移而增长,所以我认为不为每个项目添加资源文件,而是通过Gradle生成它。
例如,对于project :custom:a,我需要在resources目录中具有一个project-info.properties文件,其内容为:
project=a
Run Code Online (Sandbox Code Playgroud)
对于项目:custom:b,我想要一个类似的project-info.properties文件:
project=b
Run Code Online (Sandbox Code Playgroud)
如何生成文件并将其放入Java资源目录?
我试图在所有项目中添加以下规则,但似乎不再生成这些文件(也许我引入了一些重大更改):
processResources {
def resourcesDir = sourceSets.main.output.resourcesDir
resourcesDir.mkdirs()
def contents = "projectInfo.project=$project.name"
new File(resourcesDir, "project-info.properties").text = contents
}
Run Code Online (Sandbox Code Playgroud)
编辑:文件应在生成目录中生成,而不是在源代码中生成。
我强烈建议不要在正常的源目录中生成文件,即,已检入源代码控制(SCM)的文件。最好在某个目录的build目录下生成文件,并将该位置添加到相关的源集中。
第一步是创建一个生成属性文件的任务:
ext.genOutputDir = file("$buildDir/generated-resources")
task generatePropInfo {
ext.outputFile = file("$genOutputDir/project-info.properties")
outputs.file(outputFile)
doLast {
outputFile.text = "projectInfo.project=${project.name}"
}
}
Run Code Online (Sandbox Code Playgroud)
您甚至可能考虑将其设置为自定义任务类型,这样就不必使用额外的属性和运行时API进行增量构建。
完成此操作后,您只需要配置源集,以便将generate-resources目录中的文件作为源集的输出包括在内。把这一行之后的任务定义:
sourceSets.main.output.dir genOutputDir, builtBy: generatePropInfo
Run Code Online (Sandbox Code Playgroud)
如果要让多个任务为一个源集生成“输出”文件,则创建一个依赖于所有任务的聚合任务,例如generateResources,并更新该builtBy任务的参数buildBy: generateResources。
随时问有关解决方案的任何问题。
尝试在执行阶段运行它,而不是配置:
processResources {
doFirst {
def resourcesDir = sourceSets.main.output.resourcesDir
resourcesDir.mkdirs()
def contents = "projectInfo.project=$project.name"
new File(resourcesDir, "project-info.properties").text = contents
}
}
Run Code Online (Sandbox Code Playgroud)
doFirst应该做到这一点并在该任务运行之前创建一个文件
| 归档时间: |
|
| 查看次数: |
1945 次 |
| 最近记录: |