ML Gradle task.Server.Eval.Task установка переменных с помощью xquery

Я использую 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.


person Beez    schedule 27.03.2020    source источник
comment
В общем, встраивание кода другого языка в код другого языка в виде экранированной строки немного запутано и трудно читаемо. Для быстрых мелочей, может быть, не так уж и важно, но вы можете рассмотреть возможность экстернализации кода XQuery в отдельные файлы, которые считываются из задачи, а не встраиваются. Если вы встраиваете код, не забывайте о тройных кавычках """ и ''' и убедитесь, что понимаете, что такое GString groovy-lang.org/syntax.html#_gstring_and_string_hashcodes Если вы хотите, чтобы это был строковый литерал, используйте одинарные кавычки для заключения кода вместо двойных кавычек.   -  person Mads Hansen    schedule 30.03.2020
comment
Спасибо за вклад! Я пытаюсь создать cron в gradle, и даже запустив простую команду, я получаю сбойное состояние. Даже делая xquery = "fn:current-datetime();", я получаю сбой сборки.   -  person Beez    schedule 31.03.2020
comment
Мне удалось исправить эту проблему, переключившись на задачу в стиле json и создав пакет задач в моем ml-config.   -  person Beez    schedule 03.04.2020


Ответы (1)


Я подозреваю, что вы используете какой-то механизм строковых шаблонов в Groovy / Gradle. Попробуйте также избежать знака $.

Обратите внимание, что в коде XQuery можно использовать как одинарные, так и двойные кавычки.

HTH!

person grtjn    schedule 27.03.2020
comment
Отлично, я попробую! Спасибо @grtjn - person Beez; 27.03.2020
comment
Мне удалось исправить эту проблему, переключившись на задачу в стиле json и создав пакет задач в моем ml-config. - person Beez; 03.04.2020