动态设置 ml-gradle 属性

Dynamically setting ml-gradle properties

我需要在构建脚本本身中设置一个 ml-gradle 属性 (mlModulesDatabaseName)。我的印象是 gradle-y 方法是使用额外的模块扩展:

ext {
    mlModulesDatabaseName = 'Modules'
}

这似乎将值放在 project.properties 映射中,就像从 gradle.properties 中读取时一样,但是当我尝试 运行 mlReloadModules 任务:

$ ./gradlew mlReloadModules -Pdev
:mlDeleteModuleTimestampsFile
:mlClearModulesDatabase
Clearing modules database
Logging HTTP response body to assist with debugging: {"errorResponse":{"statusCode":"404", "status":"Not Found", "messageCode":"XDMP-NOSUCHDB", "message":"XDMP-NOSUCHDB: xdmp:database(\"my-app-modules\") -- No such database my-app-modules"}}
Unable to clear database; cause: 404 Not Found
Finished clearing modules database
:mlPrepareRestApiDependencies
:mlLoadModules
:mlReloadModules

BUILD SUCCESSFUL

这可能是我不了解 gradle 如何限定其属性的范围,但您会认为这可行。关于如何实现这一点有什么建议吗?

据我所知 ml-gradle 在作为插件应用后立即读取属性。这意味着此行之后对属性的所有更改

apply plugin: "com.marklogic.ml-gradle"

没有影响。在应用 ml-gradle 插件之前,您是否尝试过设置 ext 属性?

编辑: 另一种设置自定义属性的方法是像这样设置它们:

ext {
    mlAppConfig {
        modulesDatabaseName = 'Modules'
    }
}

这在 apply plugin 行之后也有效。

我建议使用 gradle 属性插件。如果您还没有这样的东西,请将它放在 build.gradle 文件的顶部:

plugins {
  id "net.saliman.properties" version "1.4.6"
  id "com.marklogic.ml-gradle" version "3.7.1"
}

安装好 saliman 属性插件后,您可以将特定于开发的属性放入名为 gradle-dev.properties 的文件中,然后 运行 和 -PenvironmentName=dev 来启用它们。

默认情况下,它会查找 gradle.propertiesgradle-local.properties。它将始终读取 gradle.properties 以及特定于环境的属性文件(如果存在)。后者将覆盖第一个的属性。

根据具体的任务,您还可以覆盖 build.gradle 中的属性,但我会避免在 ml-gradle 开箱即用的任务中这样做。

HTH!

我想分享我在 MarkLogic Data Hub Framework (DHF) 项目中用于 运行 ml-gradle 任务的另一种方法。在 DFH 开发中,我有时需要 运行 在暂存数据库或最终数据库上执行相同的任务。因此,我使用 GradleBuild 任务环绕 ml-gradle 任务,并在 GradleBuild 任务中设置项目属性。

task myFinalDbTask(type: GradleBuild) {    
  tasks = ['myMlGradleTask']
  startParameter.projectProperties = [
    database: mlFinalDbName,
    port: mlFinalPort
  ]
}