我有一个项目,在开始构建任务之前我必须设置某个 SystemProperty。然而,它的价值每天都在变化。
就目前情况而言,一旦构建任务开始,我就无法再以有意义的方式编辑此属性(因为覆盖被忽略)。所以我想提前做。
为了获取此属性的最新值,我有 API 调用的代码,并将从响应中提取该值。
此 API 调用位于“com.test”包下的“src/test/java”目录中名为“CallApi.java”的 Java 类中
我已将其设置为 CallApi.java 中的函数返回一个字符串,我计划在开始执行之前将其设置为 SystemProperty 的值。
我的思考过程是,如果我可以定义一个自定义任务来获取此属性的最新值,那么我可以直接使用“systemProperty”命令在 build.gradle 中设置它:
系统属性“占位符”,自定义任务
然后让 Gradle 执行清理和构建任务。
这可能吗?如果没有,是否有其他方法可以实现这一目标?
附注 我试过这个方法
import com.test.CallApi
task callApi {
doLast {
CallApi.getPropValue()
}
}
getPropValue() 函数返回模拟字符串数据,但 import 语句无法解析
是的,这是可能的。
总的来说,我们希望 (i) 使用 API 调用构建代码,(ii) 进行 API 调用,然后 (iii) 使用 API 调用中的数据构建其他代码。请注意,要做到这一点,您必须能够在没有 API 数据的情况下构建第 (i) 部分,否则您将面临不可调和的循环。
以下是帮助您入门的推荐方法的概述1。
首先,如有必要,请分离您的代码,以便一部分进行 API 调用,另一部分使用接收到的数据。最简单的方法是将 API 调用代码放在多项目构建的一个子项目(“API 项目”)中,并将需要来自 API 的数据的代码放在单独的子项目(“主项目”)中。项目”)。
将 main 方法添加到您的 API 项目代码中,该方法将运行程序并获取所需的数据。让它将数据保存到已知位置的文件中。
将应用程序插件添加到API项目。将其配置为指向获取 API 数据的 main 方法。这会在该项目中创建一个“运行”任务,它将调用 main 方法并保存 API 日期。
application {
mainClassName = 'fully.qualfied.name.of.api.main'
}
在主项目中添加一个新任务,调用API项目运行任务并设置系统属性:
task setSystemProperty {
dependsOn ':apiProject:run' // run the run task first
doLast {
// Write code to read the created API data file and set system property
}
}
最后确保它在编译任务之前运行:
compileJava.dependsOn setSystemProperty
1 此方法并未在所有方面遵循最佳实践,但涉及的配置较少。最佳实践建议不要在项目之间建立任务依赖关系,因为这种依赖关系在较大的构建中可能很脆弱。更好的方法是从 API 项目中导出额外的工件。此外,任务应该知道它们的输入和输出,以获得更健壮的代码,并允许增量构建工作。