如何在xquery中访问环境变量?

时间:2019-11-13 16:26:48

标签: maven xquery marklogic

我在xquery中的程序具有一些基于函数运行环境的变量。例如,dev指向“ devserver”,测试指向“ testserver”,产品指向“ server”,等等。

如何在我的application.xml文件中进行设置,如何在.xqy函数中引用它们?

  

“替代方法”解决方案1 ​​

     

使用“开关”确定主机:

switch (xdmp:host-name(xdmp:host()))
    case <dev environment as string> return "devserver"
    case <test environment as string> return "testserver"
    .
    .
    .
    default return fn:error(xs:QName("ERROR"), "Unknown host: " || xdmp:host-name(xdmp:host()))
  

“解决方法”解决方案2

     

在项目中为每个主机创建一个xml文件,更新您的application.xml以根据环境名称将xml文件放置在目录中,然后参考现在在安装时构建的文档。

     

application.xml:

     
<db dbName="!mydata-database">
   <dir name="/config/" permissionsMode="set">
       <uriPrivilege roles="*_uberuser"/>
       <permissions roles="*_uberuser" access="riu"/>
       <load env="DEV" root="/config/DEV/" merge="true" include="*.xml"/>
       <load env="TEST" root="/config/TEST/" merge="true" include="*.xml"/>
     

位于项目目录/config//environment.xml中的文档

     
<environment>
   <services>
       <damApi>https://stage.mydam.org</damApi>
       <dimeApi>https://stage.mydime.org/api/Services</dimeApi>
   </services>
</environment>
     

在我需要获取值时使用

     
fn:doc("/config/environment.xml")/environment/services/damApi/fn:string()
     

这两种解决方案对我来说都不是最好的。

4 个答案:

答案 0 :(得分:2)

不知道MarkLogic是否支持它,但是XQuery 3.1具有功能available-environment-variables()environment-variable()

答案 1 :(得分:2)

如果使用ml-gradle部署项目,请it can do substitutions in your code。这意味着您可以使用以下代码设置XQuery库:

declare variable $ENV = "%%environmentName%%";

然后可以在需要的地方导入该库。

答案 2 :(得分:1)

您可以考虑使用位于https://github.com/marklogic-community/commons/tree/master/properties的微型“属性”库

很久以前,我们为MarkMail.org编写了该文件,因为我们不希望将配置放入数据库文档中,因为配置应该与数据分开。数据已备份,在其他地方恢复,并且新位置可能与旧环境不同。

因此,我们做了一些修改,将config放入静态名称空间上下文(每个组和应用程序服务器都有)。配置的前缀是属性名称。配置值是属性值(包括类型信息)。这是MarkMail部署的屏幕快照,显示了它是生产服务器,可以通过电子邮件发送错误,要提供的静态文件版本以及要作为基础输出的域。

Example MarkMail configuration

通过这种方法,您可以(通过Red GUI或REST)以管理方式配置属性,并将其与数据分开。它们可以静态地用于执行上下文,而无需额外费用。您可以在组级别或App Server级别或两者上配置它们。该库是提取类型值的便利包装。

也许到目前为止,还有一种更好的方法,例如XQuery 3.1函数,但是这种方法已经运行了10多年了。

答案 3 :(得分:0)

我还没有在我们的项目中使用gradle,我设法弄清了如何使用maven配置文件根据部署到的环境查找/替换所需的值。我只需要将插件包括在内,要更新的文件以及要替换的内容添加到适当的配置文件中即可。

pom.xml:

<plugin>
  <groupId>com.google.code.maven-replacer-plugin</groupId>
  <artifactId>replacer</artifactId>
  <version>1.5.2</version>
  <executions>
    <execution>
      <phase>prepare-package</phase>
      <goals>
        <goal>replace</goal>
      </goals>
    </execution>
  </executions>
  <configuration>
    <includes>
      <include>**/modules/runTasks.xqy</include>
      <include>**/imports/resetKey.xqy</include>
    </includes>
    <replacements>
      <replacement>
        <token>https://stage.mydime.org/api/Services</token>
        <value>https://www.mydime.org/api/Services</value>
      </replacement>
    </replacements>
  </configuration>
</plugin>