【问题标题】:Dynamically setting ml-gradle properties动态设置 ml-gradle 属性
【发布时间】:2019-03-07 05:05:13
【问题描述】:

我需要在构建脚本本身中设置一个 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 如何确定其属性的范围,但您会认为这会起作用。关于如何解决这个问题的任何建议?

【问题讨论】:

    标签: marklogic ml-gradle


    【解决方案1】:

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

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

    没有效果。您是否尝试在应用 ml-gradle 插件之前设置您的 ext 属性?

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

    ext {
        mlAppConfig {
            modulesDatabaseName = 'Modules'
        }
    }
    

    这也适用于apply plugin 行之后。

    【讨论】:

    • 是的。这就是我一直在寻找的。这两个建议都对我有用。谢谢。
    • 澄清一下 - 当应用 ml-gradle 插件时,所有属性都被读入并用于设置 mlAppConfig 引用的 AppConfig 对象的值。因此,在 ext 块中,您可以操作 mlAppConfig 对象。
    【解决方案2】:

    我建议使用 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.properties 和gradle-local.properties。它将始终读取gradle.properties 以及特定于环境的属性文件(如果存在)。后者将覆盖第一个的属性。

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

    HTH!

    【讨论】:

    • 对于后代,我应该注意,如果您正确设计您的 gradle 脚本,这是更好的答案。所以任何正在寻找类似答案的人,我都会走这条路。可悲的是,我正在将 ml-gradle 改造成一个旧脚本,这会使这变得困难(呃),所以我不能在这里使用它。
    【解决方案3】:

    我想分享另一种方法,用于在 MarkLogic 数据中心框架 (DHF) 项目中运行 ml-gradle 任务。在DFH 开发中,我有时需要在暂存数据库或最终数据库上运行相同的任务。所以我使用GradleBuild 任务包裹ml-gradle 任务并在GradleBuild 任务中设置项目属性。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多