如何在Gradle中生成资源文件

时间:2018-08-01 16:37:28

标签: java gradle build

我的Gradle项目之一有10个子项目。对于Gradle任务中的每个项目,我想生成一个Java属性文件来指定项目名称,因为我需要在运行时知道项目名称。属性文件应转到每个项目的资源目录。因为项目的数量可能会随着时间的推移而增长,所以我认为不要为每个项目添加资源文件,而是通过Gradle生成它。

例如,对于项目:custom:a ,我需要在资源目录中有一个 project-info.properties 文件,内容为:

project=a

对于项目:custom:b ,我想要一个类似的 project-info.properties 文件:

project=b

如何生成文件并将其放入Java资源目录?

我试图在所有项目中添加以下规则,但似乎不再生成这些文件(也许我已经引入了一些重大更改):

processResources {
    def resourcesDir = sourceSets.main.output.resourcesDir
    resourcesDir.mkdirs()
    def contents = "projectInfo.project=$project.name"
    new File(resourcesDir, "project-info.properties").text = contents
}

编辑:文件应在构建目录中生成,而不是在源文件中生成。

2 个答案:

答案 0 :(得分:3)

我强烈建议您不要在正常的源目录中生成文件,即在源代码管理(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}"
    }
}

您甚至可能考虑将其设置为自定义任务类型,这样就不必使用额外的属性和运行时API进行增量构建。

完成后,您只需要配置源集,以便将 generate-resources 目录中的文件作为源集的输出包括在内。在任务定义的之后

sourceSets.main.output.dir genOutputDir, builtBy: generatePropInfo

如果您要让多个任务为一个源集生成“输出”文件,则创建一个依赖于所有任务的聚合任务(例如generateResources)并将builtBy参数更新为该任务-buildBy: generateResources

随时问有关解决方案的任何问题。

答案 1 :(得分:0)

尝试在执行阶段而不是配置中运行它:

swal({
    title: 'User Contacts',
    html: $('.sweetalert_template #all_contacts').html(),
    customClass: 'swal-logout',
    showCloseButton: true,
});

processResources { doFirst { def resourcesDir = sourceSets.main.output.resourcesDir resourcesDir.mkdirs() def contents = "projectInfo.project=$project.name" new File(resourcesDir, "project-info.properties").text = contents } } 应该可以解决问题,并在此任务运行之前创建文件