调用gradle script build.gradle,并设置它是否应该生成调试/发布样式和编写一般任务?

调用gradle script build.gradle,并设置它是否应该生成调试/发布样式和编写一般任务?,gradle,ant,msbuild,build.gradle,Gradle,Ant,Msbuild,Build.gradle,再见,拉加齐 我来自ant,我试图在gradle解决一个非常简单的任务: 我希望调用build.gradle的方式能够设置所需的构建风格(调试/发布)以及我希望以非常通用的方式开发的所有其他任务,而不会重复调试/发布 在旧世界的ant中,我只编写了一个目标,它依赖于一个目标设置相关(通用)属性,另一个目标使用这些属性并触发构建 在gradle,我似乎没有完全理解配置阶段。这就是目前的发展状况: plugins { id "com.ullink.msbuild" version "2.15"

再见,拉加齐

我来自ant,我试图在gradle解决一个非常简单的任务:

我希望调用build.gradle的方式能够设置所需的构建风格(调试/发布)以及我希望以非常通用的方式开发的所有其他任务,而不会重复调试/发布

在旧世界的ant中,我只编写了一个目标,它依赖于一个目标设置相关(通用)属性,另一个目标使用这些属性并触发构建

在gradle,我似乎没有完全理解配置阶段。这就是目前的发展状况:

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本身正在正确设置和打印所有内容,但是构建任务仍然只构建调试风格

有没有人能告诉我我做错了什么,或者更好的方法是如何做对

提前多谢

坦蒂·萨尔维


Florian

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

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

也可以看看Gradle自己的,目前处理C++和SWIFT。< /P> < P > Ciao ragazzi,< /P> 我想出了一个适合我的解决方案,我想与大家分享:

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

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")

def buildTimestamp = getTimestamp()
def buildNamePrefix = "ABC"
def buildTypes = ['Debug', 'Release']

buildTypes.each { variant -> 
    task "Build${variant}"(type: msbuild.class) {
        description = "Builds the solution in '${variant}' flavour."

        solutionFile = 'ABC.sln'
        configuration = "${variant}"
        parameters.OutDir = "${buildDir}\\${buildNamePrefix}_${buildTimestamp}_${variant}"

        // 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

        doFirst {
            println("Building '${configuration}' flavour ...")
            println("${parameters}")
            println()
        }
        doLast {
            println()
            println("Finished '${configuration}' build.")
        }
    } 
}

buildTypes.each { variant -> 
    task "ZipBuild${variant}"(type: Zip) {
        description = "Builds the solution in '${variant}' flavour and creates a zip file."
        dependsOn "Build${variant}"

        archiveName = "${buildNamePrefix}_${buildTimestamp}_${variant}.zip"
        destinationDir = file("${buildDir}")
        from("${buildDir}/${buildNamePrefix}_${buildTimestamp}_${variant}") {
            include "ABC*/"
            exclude "ABCAdminClasses/"
        }

        doFirst {
            println("Creating '${destinationDir}\\${archiveName}' ...")
        }
        doLast {
            println("Finished writing '${destinationDir}\\${archiveName}'.")
        }
    } 
}

def getTimestamp() {
    def date = new Date()
    return date.format('yyyyMMdd_HHmm')
}
运行
gradle任务--all
显示新任务

致以最良好的祝愿


Florian

非常感谢Stefan!我会找到答案并发布我的最终解决方案。嗨,Stefan,你能告诉我如何使用android插件而不必安装整个android工具链吗?因为我的项目是一个普通的C#项目?有没有其他的插件我可以使用?先谢谢你。顺致敬意,FlorianI很抱歉,我错误地认为你有一个Android项目,你只是想在上面添加一些本机代码,因为Android插件有确切的“buildType”命名。我会调整我的答案。