任務的第一部分 - 獲取文件名成「結構」是最好的使用做了FileSet - 在一個名爲腳本目錄執行的話SQL腳本:
<fileset dir="scripts" includes="*.sql" id="versions" />
這就產生了一個Ant resource collection可以使用編號versions
來引用。 集合知道你的SQL腳本文件。
使用(你的建議)一個正則表達式映射器,我們可以將一組文件轉換成字符串的集合,從文件名只持有版本部分:
<mappedresources id="versions">
<fileset dir="scripts" includes="*.sql" />
<regexpmapper from="update.*to(.*).sql" to="\1" />
</mappedresources>
在這個例子中versions
現在持有'list',這將是您的示例文件的"5,5,6"
。
它現在變得更加棘手,因爲您可能需要對什麼是字符串列表進行數字排序 - 以避免10比「9」排序更少。Ant帶有嵌入的Javascript解釋器,因此您可以使用那要找到最大值。另一種選擇是利用ant-contrib必須提供的數字排序功能。
這裏是一個Javascript「最大的取景器:
<scriptdef name="numeric_max" language="javascript">
<attribute name="property" />
<attribute name="resources_id" />
<![CDATA[
var iter = project.getReference(
attributes.get("resources_id")
).iterator();
var max_n = 0.0;
while (iter.hasNext())
{
var n = parseFloat(iter.next());
if (n > max_n) max_n = n;
}
project.setProperty(attributes.get("property"), max_n);
]]>
</scriptdef>
定義一個新的Ant XML實體 - numeric_max
- 看起來像一個任務,可用於查找字符串集合的最大數字。 這並不完美 - 沒有驗證字符串,我使用了浮點數而不是整數。
相結合,與mappedresources
以上:
<mappedresources id="versions">
<fileset dir="scripts" includes="*.sql" />
<regexpmapper from="update.*to(.*).sql" to="\1" />
</mappedresources>
<numeric_max property="latest.version" resources_id="versions" />
<echo message="Latest SQL script version: ${latest.version}." />
當我運行與您的三個文件,我得到:
[echo] Latest SQL script version: 6.
您可以重命名文件,使相應的電話號碼在前面F.E. updateTo6from1.sql你可以簡單地按文件名進行排序並完成這個問題? – Yashima
好吧,所有這些都必須從ANT自動完成,所以我不確定一旦文件名被加載到結構中,如果我可以保證最新的將是第一個元素。 – Endo
自從我使用Ant以來已經有一段時間了。您始終可以在java中將其作爲AntTask實現並使用您自己的任務。通常您可能會使用FileSet來加載文件,但排序文件集似乎並不重要。 – Yashima