我在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()
这两种解决方案对我来说都不是最好的。
答案 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部署的屏幕快照,显示了它是生产服务器,可以通过电子邮件发送错误,要提供的静态文件版本以及要作为基础输出的域。
通过这种方法,您可以(通过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>