gradle - 使用设置调用 gradle 脚本 build.gradle 是否应该构建调试/发布风格并编写通用任务?
问题描述
乔拉齐,
我来自 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 本身正在正确设置和打印所有内容,但构建任务仍然只构建 Debug 风格。
有人可以告诉我我做错了什么或更好地如何做对吗?
提前非常感谢!
坦蒂萨鲁蒂
弗洛里安
解决方案
上面的代码不能工作。您在配置时读取值,但仅在执行时设置它们。通常,您不会从其他任务配置任务。您只需为所需的一切创建任务。
在最简单的情况下,这只是对 buildType 枚举值的 for 循环,为每个枚举创建一个任务。如果您想减少硬编码,您还可以使用该Project.container
方法创建一个可扩展的 buildTypes 容器,以便您的用户可以定义自己的。
还可以查看 Gradle 自己的原生插件,它们目前处理 C++ 和 Swift。
推荐阅读
- reactjs - 使用 React Hook,尝试使用 forEach 获取多个数据
- node.js - React.js 是否需要运行 node_modules 文件夹?
- asp.net - 单一解决方案中的核心 Web API 和网站
- angularjs - 如何使用 ng-map 位置为每个位置设置不同的图标
- php - 由于无效的广告 ID,在 Facebook 上创建自定义受众失败
- python-3.x - python中的XlsxWriter在单元格中输入了额外的空格
- firebase - 如何修复 Flutter 中的 firebase_admob 包问题
- javascript - 如何从一组对象过滤一个值创建一个新数组?
- java - 在 JAR 中找不到资源文件
- javascript - “LegendOptions”类型上不存在 Highchart 属性“名称”