如何在gradle中记录项目属性?

如何在gradle中记录项目属性?,gradle,Gradle,例如:如果我有一个gradle文件,它可以接受并使用名为DB 用于对指定的进行测试 gradle测试将针对某些默认值运行 gradle测试-PDB=asd1将针对特定实例运行 但是,没有简单的方法向用户显示特定属性已被处理 作为一个用户,我希望它出现在gradletasks输出中 我是否应该定义一些任务,例如advancedpoptions,并在该任务的输出中列出这些内容?我想您可以利用该任务(但我不确定它如何与gradle任务一起工作)或者准备一个列表,如果可能的话,测试环境并为每个职位创建一

例如:如果我有一个gradle文件,它可以接受并使用名为
DB
用于对指定的进行测试

gradle测试
将针对某些默认值运行

gradle测试-PDB=asd1
将针对特定实例运行

但是,没有简单的方法向用户显示特定属性已被处理

作为一个用户,我希望它出现在
gradletasks
输出中


我是否应该定义一些任务,例如
advancedpoptions
,并在该任务的输出中列出这些内容?

我想您可以利用该任务(但我不确定它如何与
gradle任务一起工作)
或者准备一个列表,如果可能的话,测试环境并为每个职位创建一个任务

伪代码:

def envs = ['e1', 'e2', 'e3']

envs.each { e ->
   projects.task(e) << {
       //TODO
   }
}
def envs=['e1','e2','e3']
每个环境{e->
projects.task(e)您可以在任务描述中“记录”它

task test {
    description = "Does stuff against thing declared by property 'db'. Ex: gradle test -Ddb=foo'
}
当运行
gradle tasks
时,这将显示在任务名称旁边


通过CLI将参数传递给任务的另一种方法是使用Gradle的
@选项
注释,但这是一个可能会更改的内部API。

目前没有使属性自文档化的好方法。不过这是一个好问题。您介意将此问题作为一个想法发布到g这将有助于Gradle core。目前,用户将不得不依赖项目的文档。

首先,我应该说我是从ANT来到Gradle的,我的项目不是基于Java的,所以我可能并不总是以最佳的Gradle或groovy方式做事

也就是说,我还想记录命令行属性,并验证输入的属性和值(如果它们只接受特定的值列表)。 我的方法是将可能的命令行属性映射到包含可能值列表的对象,第一个值是默认值,其余值是其他可接受的值,以便可以验证在命令行上设置的属性。 这个对象还有一个描述字段,我用它来记录属性,很像任务描述字段。 除了自动设置命令行属性默认值外,这还允许我验证命令行属性,并在自定义“描述”任务中显示此信息以及关键任务描述(因为保留了帮助)

下面是一些示例代码,它设置了命令行属性信息,并在构建开始验证命令行属性时运行(为简洁起见,我这里没有显示值检查):

所以像这样的命令行

gradle compile -P_platfrm=ios
将返回如下错误:

Command line property '_platfrm' not known, did you mean one of these? [_platform]
然后我还有使用上述属性信息集的描述任务以及任务描述:

task describe() {}
describe << {
    // tasks to leave out of description list (as I mentioned, my project is not Java, so a lot of built in stuff is not relevant)
    def excludeTasks = ["buildDependents","buildNeeded","check","checkForFatalErrors","classes","compileJava","compileTestJava","jar","javadoc","processResources","processTestResources","test","testClasses"]
    project.tasks.each {
        if (it.description && !excludeTasks.contains(it.name)) {
            println "task ${it.name}: ${it.description}"
        }
    }
    println "\n${cmdLineInfo}"
}
task descripe(){}

描述任务描述是很好的;但是对于横切属性,例如一个可以改变所有测试任务的行为的属性,我将看一个全局行为更复杂的@ optOntudioTrimes属性。这些属性都有可行的默认值;gradle.properties在VCS上;属性由插件处理,我不想更新所有模块属性文件,因为我添加了一个新的属性,可以处理。我也尝试过这种方法,但每个任务都有3-4个参数,有时没有紧密连接的参数;dependen在这种情况下,cy是可以完成的,但这是另一件痛苦的事情。请准备一个好的示例,并提供预期的输入和输出?为每个可能的变化添加单独的任务将生成一个庞大的任务列表,这将是毫无意义的(并且会在维护期间造成巨大的开销);我真的不能给出一个例子,因为这是一个开放的问题……我感谢任何链接到gradle论坛问题的想法:
task describe() {}
describe << {
    // tasks to leave out of description list (as I mentioned, my project is not Java, so a lot of built in stuff is not relevant)
    def excludeTasks = ["buildDependents","buildNeeded","check","checkForFatalErrors","classes","compileJava","compileTestJava","jar","javadoc","processResources","processTestResources","test","testClasses"]
    project.tasks.each {
        if (it.description && !excludeTasks.contains(it.name)) {
            println "task ${it.name}: ${it.description}"
        }
    }
    println "\n${cmdLineInfo}"
}