如何在Gradle中生成资源文件

X. *_*tuk 3 java build gradle

我的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)

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

Pet*_*ook 5

我强烈建议不要在正常的源目录中生成文件,即,已检入源代码控制(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

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


Sta*_*lav 4

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

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应该做到这一点并在该任务运行之前创建一个文件