gradle - 调用gradle脚本build.gradle并设置是否应该构建调试/发布风格并编写通用任务?

标签 gradle ant msbuild build.gradle

Ciao ragazzi,

我来自 Ant ,我正在尝试解决gradle中的一个非常简单的任务:

我想以一种设置所需的构建风格(调试/发布)以及我想以非常通用的方式开发的所有其他任务的方式调用build.gradle,而无需重复调试/发布。

在使用ant的旧世界中,我只是写了一个目标,该目标取决于一个目标设置了相关的(通用)属性,而另一个目标则使用了这些属性并触发了构建。

渐渐地,我似乎并不完全理解配置阶段。所以这是当前的发展状态:

plugins {
  id "com.ullink.msbuild" version "2.15"
  id "com.ullink.nuget" version "2.12"
  // id "java"
}

task config(type: configurationTask)

class configurationTask extends DefaultTask {
    private BuildType buildType = BuildType.Debug;
    private Date date = new Date();

    @Option(option = "buildType", description = "Configures the build flavour.")
    public void setBuildType(BuildType buildType) {
        this.buildType = buildType;
    }

    public String getBuildType() {
        return buildType;
    }

    public String getMsBuildName() {
        return 'CMS_' + date.format('yyyyMMdd_HHmmss') + '_' + buildType;
    }

    @TaskAction
    def showConfiguration() {
        println('The build configuration is:')
        println('BuildType: ' + buildType)
        println('BuildName: ' + getMsBuildName())
    }

    private static enum BuildType {
        Debug, Release
    }
}

version = "4.41.0.0"
def buildTimestamp = getTimestamp()

def _buildType = config.getBuildType()
def _msBuildName = config.getMsBuildName()

println("Project    : $project")
println("Name       : $name")
println("Path       : $path")
println("Description: $description")
println("ProjectDir : $projectDir")
println("BuildDir   : $buildDir")
println("Group      : $group")
println("Version    : $version")
println("Ant        : $ant")

msbuild {
      //verbosity = 'detailed'
      //verbosity = 'diag'

      // targets to execute (/t:Clean;Rebuild, no default)
      // targets = ['Clean', 'Rebuild']
      //parameters.platform = 'Any CPU'
}

task buildSolution(type: msbuild.class) {
    description = 'Builds the solution in the chosen flavour.'

    dependsOn 'config'

    println("123: ${_buildType}")
    println("321: ${_msBuildName}")

    solutionFile = 'CMS.sln'
    configuration = "${_buildType}"
    parameters.OutDir = "${buildDir}/${_msBuildName}"

    // you can also provide properties by name (/p:SomeProperty=Value)
    parameters.GenerateProjectSpecificOutputFolder=true
    parameters.OutDirWasSpecified=true 

    // Generates XML documentation file (from javadoc through custom DocLet)
    generateDoc = false

    println("Configuration for '${configuration}': ${parameters}")
    println("parameters.OutDir: ${parameters.OutDir}")
}

def getTimestamp() {
    def date = new Date()
    return date.format('yyyyMMdd_HHmm')
}

我的想法是,可以使用某种类似于gradle config --buildType Release buildSolution的名称来建立发行版本。

不幸的是,configurationTask本身正确地设置和打印了所有内容,但是构建任务仍然仅构建了Debug flavor 。

有人可以告诉我我做错了什么,或者更好地做对了吗?

在此先多谢!

坦蒂·萨鲁蒂(Tanti saluti)

弗洛里安

最佳答案

上面的代码无法正常工作。您在配置时读取值,但仅在执行时设置它们。通常,您不会从其他任务中配置任务。您只需为所需的所有内容创建任务。

在最简单的情况下,这仅是buildType枚举值的for循环,为每个枚举创建一个任务。如果您想减少硬编码,还可以使用Project.container方法创建一个可扩展的buildTypes容器,以便您的用户可以定义自己的容器。

还可以看一下Gradle自己的native plugins,它目前可以处理C++和Swift。

关于gradle - 调用gradle脚本build.gradle并设置是否应该构建调试/发布风格并编写通用任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51324444/

相关文章:

gradle - 如何在 Gradle 中指定唯一的 SNAPSHOT 版本?

gradle - 从命令行设置Gradle设置插件属性

java - 如何通过 Ant - Swing 传递 jvm 参数

php - 在 ANT 构建脚本中使用 Jenkins 和 PHP 代码嗅探器

visual-studio - VsDevCmd和VsMSBuildCmd

c# - 当我尝试构建它时,Visual Studio 执行了一些操作。我如何找出留在这背后的代码?

android - 尽管设置相对相同,但Proguard的行为因构建类型而异

eclipse - Eclipse .settings/org.eclipse.wst.common.component 文件规范

java - ClassNotFoundException - 运行 ant-junit 时

msbuild - 确定您的构建是否作为私有(private)构建运行