【问题标题】:ML Gradle task.Server.Eval.Task setting variables using xqueryML Gradle task.Server.Eval.Task 使用 xquery 设置变量
【发布时间】:2020-03-27 16:13:35
【问题描述】:

我正在使用 ml-gradle 运行 XQuery 块来更新 MarkLogic 数据库。我遇到的问题是我需要将所有代码用引号括起来,但由于代码本身包含引号,所以当我尝试声明变量时遇到一些错误,即let $config。有谁知道解决这个问题的方法?我在想我可以将所有代码连接成一个大字符串,这样它就会忽略第一个和最后一个引号。

task addCron(type: com.marklogic.gradle.task.ServerEvalTask) {
  xquery = "xquery version \"1.0-ml\";\n" +
          "import module namespace admin = \"http://marklogic.com/xdmp/admin\" at \"/MarkLogic/admin.xqy\";\n" +
          "declare namespace group = \"http://marklogic.com/xdmp/group\";\n" +
          " let $config := admin:get-configuration()\n" +

当它试图将 $config 声明为变量时,它会崩溃。出现错误:

> Could not get unknown property 'config' for task ':

这是一个有效的例子

task setSchemasPermissions(type: com.marklogic.gradle.task.ServerEvalTask) {
  doFirst {
    println "Changing permissions in " + mlAppConfig.schemasDatabaseName + " for:"
  }
  xquery = "xdmp:invoke('/admin/fix-permissions.xqy', (), map:entry('database', xdmp:database('" + mlAppConfig.schemasDatabaseName + "')))"
}

这里是 ServerEvalTask​​ 的一些文档:https://github.com/marklogic-community/ml-gradle/wiki/Writing-your-own-task

【问题讨论】:

  • 一般来说,将其他语言代码作为转义字符串嵌入到另一个语言代码中会有点混乱且难以阅读。对于快速的小事情,也许没什么大不了的,但您可以考虑将 XQuery 代码外部化到从任务中读取而不是嵌入的单独文件中。如果您正在嵌入代码,请不要忘记三引号 """''' 并确保了解 GString 是什么 groovy-lang.org/syntax.html#_gstring_and_string_hashcodes 如果您希望它是字符串文字,请改用单引号来包装代码双引号。
  • 感谢您的意见!我正在尝试在 gradle 中创建一个 cron,甚至运行一个简单的命令,我得到一个失败的状态。即使做xquery = "fn:current-datetime();" 我构建失败了。
  • 我能够通过切换到 json 样式任务并在我的 ml-config 中创建任务包来解决此问题

标签: gradle xquery marklogic


【解决方案1】:

我怀疑您在 Groovy/Gradle 中遇到了一些字符串模板机制。尝试转义 $ 符号。

请注意,您可以在 XQuery 代码中使用单引号和双引号。

HTH!

【讨论】:

  • 太棒了,我会试一试!谢谢@grtjn
  • 我能够通过切换到 json 样式任务并在我的 ml-config 中创建任务包来解决此问题
猜你喜欢
  • 2021-09-12
  • 2019-03-07
  • 2019-03-08
  • 2012-02-06
  • 2013-11-16
  • 1970-01-01
  • 1970-01-01
  • 2021-06-05
  • 1970-01-01
相关资源
最近更新 更多