我的应用程序有许多属性/文本配置文件。是否有一种通用的方法来验证这类文件?可能是一些工具或xsd之类的东西?文件很大(超过1000行),所以我经常出错。在大多数情况下,文件中的信息是到不同目录的路径。所以如果它们存在并且是一致的就好了。如。如果我有
mydata.root="c:data"
和后面的
myreports=${mydata.root}/reports
检查c:data和c:datareport是否存在
且未写入(数百行以下),例如
myreports=${mdata.root}/reports
您可以在构建文件中执行此验证。
例如,下面的构建文件定义了一个macrodef validate-file-property
,它验证指定的属性是否被定义,以及它是否作为文件系统中的文件或目录存在。
<project default="init">
<property file="test.properties"/>
<target name="init">
<validate-file-property property="program.files" type="dir"/>
<validate-file-property property="mydata.root" type="dir"/>
<validate-file-property property="foo"/>
</target>
<macrodef name="validate-file-property">
<attribute name="property"/>
<attribute name="type" default="file"/>
<sequential>
<fail unless="@{property}" message="The property '@{property}' is undefinded."/>
<available file="${@{property}}" property="@{property}.exists" type="@{type}"/>
<fail unless="@{property}.exists" message="The @{type} '@{property}' with value '${@{property}}' does not exist."/>
</sequential>
</macrodef>
</project>
您需要决定何时验证属性,并且需要显式地验证它们—如本例中的init
目标所示。
顺便说一句,如果你使用标准化的模式来命名引用文件或目录的属性-例如my.special.file
, my.build.dir
-那么你可以使用shell脚本来发现所有相关属性并编写所有validate-file-property
元素。像这样:
awk -F= '/.(file|dir)/{ printf "<validate-file-property property="%s" type="%s"/>n", $1, gensub(/.*.(file|dir)/, "\1", "g", $1) }' *.properties
您可以将输出粘贴到构建文件中
我曾经悬赏获取有关提供模式验证的XML以外的配置语言的信息。不幸的是,这样的配置语言少之又少。
如果你想看到回答的稀疏性,这里有一个有约束问题的链接。