【问题标题】:The right way to provide derived defaults for Gradle task properties为 Gradle 任务属性提供派生默认值的正确方法
【发布时间】:2012-06-05 13:02:15
【问题描述】:

我正在编写一个 Gradle 任务来生成应用程序部署所需的某个配置文件。我想让用户自定义生成文件的名称和位置。

任务类的粗略草图是:

class ConfigurationFileTask extends DefaultTask {

    String configFileName = 'config.xml'

    File configFilePath = new File(project.buildDir, configFileName) 

}

这个想法是让用户随心所欲地覆盖文件名或整个文件位置。

我意识到上面的代码实际上并不能工作,因为projectconfigFile 的初始化程序运行时没有定义;我的问题是找到正确的方法来做到这一点。

现在,我希望任务在更广泛的构建中成为一个好公民,这意味着其他任务应该能够引用它的属性。例如,我希望用户能够写:

task createConfigFile(type: ConfigurationFileTask) {
    configFileName = 'app-config.xml'
}

jar {
    from(createConfigFile.configFilePath)
}
jar.dependsOn createConfigFile

然后将生成的配置文件添加到 jar 中。请注意,在这种情况下,用户设置的是configFileName,但引用的是configFilePath。这意味着必须在设置名称后的某个时间计算路径。

那么,我如何提供一个可由用户设置但具有基于另一个属性的默认值的属性,以及该属性在何处可供其他任务使用?

【问题讨论】:

    标签: gradle


    【解决方案1】:

    然后把它变成一个方法,这绝对有效

    task overrideBoth(type: ConfigurationFileTask) {
        _configFileName = 'app-configb.xml'
        _dir = '../'
    }   
    
    task overrideFileName(type: ConfigurationFileTask) {
        _configFileName = 'app-confign.xml'
    }
    
    task overridePath(type: ConfigurationFileTask) {
        _dir = '../../'
    }
    
    task defaultBehavior(type: ConfigurationFileTask) {
    }
    
    class ConfigurationFileTask extends DefaultTask {
        def _configFileName = 'config.xml'
        def _dir = project.buildDir
        def getFile() {
            return new File(_dir,_configFileName)
        }   
    }   
    
    task otherTask(type: DefaultTask) {
        println("defaultValues ${defaultBehavior.getFile().canonicalPath}")
        println("overrideFileName ${overrideFileName.getFile().canonicalPath}")
        println("overridePath ${overridePath.getFile().canonicalPath}")
        println("overrideBoth ${overrideBoth.getFile().canonicalPath}")
    
    
    }   
    

    configFileName 被覆盖

    【讨论】:

    • 它确实有效。但这与我的问题无关。您的代码显示了一个属性的创建,该属性简单地使用默认值进行初始化,然后可以对其进行更改。它没有做我想做的那种派生默认值。
    • 问题是:为 Gradle 任务属性提供默认值的正确方法是什么?我不认为我遵循您的要求,然后在我的代码中, configFileName 有一个默认值,您可以根据需要覆盖它。
    • 如果您阅读我的问题,而不仅仅是标题,它解释了我需要什么。
    • 越来越近了。这让用户可以设置_configFileName,然后读取它或fileName(我认为应该真正称为filePath)。但它不允许用户直接设置fileName。正如我在问题中所说,我希望用户能够设置其中任何一个属性。
    • Tom,这个例子缺少的是编码,基础知识从一开始就在那里。 gradle 的好处是您可以编写构建管理器。无论如何,它可以满足您的所有需求
    猜你喜欢
    • 2019-01-02
    • 2021-06-10
    • 1970-01-01
    • 2012-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-05
    相关资源
    最近更新 更多