一般來說。ant的任務(wù)都是要寫一個(gè)build.xml文件,然后刪刪改改,最后運(yùn)行ant target。這自是正途。但是有時(shí)候,如果你需要的就是簡單試驗(yàn)一下某個(gè)task,或者就想拿某個(gè)ant task當(dāng)成shell命令的話,就不方便了。
在Neptune這個(gè)工具里面,附帶了一個(gè)shell。這個(gè)shell允許交互執(zhí)行Neptune的Command和Ant的Task。可以在這里下載:
http://docs.codehaus.org/display/JASKELL/Downloads
下面簡要介紹一下怎么用:
啟動(dòng)Neptune shell很簡單。按照要求安裝完了之后(就是設(shè)置一個(gè)NEPTUNE_HOME和PATH環(huán)境變量),運(yùn)行:
先看看最簡單的ant echo任務(wù)。xml語法是這樣的:
稍微解釋一下:
1。所有ant命令都在ant這個(gè)namespace里面。
2。xml的尖括號(hào)換成大括號(hào)。大括號(hào)在jaskell語言里面表示一個(gè)tuple。
3。exec函數(shù)用來執(zhí)行一個(gè)命令。如果沒有exec,ant.echo只是生成一個(gè)命令對(duì)象,但不執(zhí)行。這樣做得好處是,你可以用變量臨時(shí)存儲(chǔ)這些命令對(duì)象,可以把他們存在任意的對(duì)象或者數(shù)組中,等到真正需要執(zhí)行的時(shí)候再運(yùn)行。
4。"->"這個(gè)函數(shù)用來以先參數(shù)后函數(shù)的循序調(diào)用函數(shù),相當(dāng)于exec(ant.echo{...}),語法上有的時(shí)候顯得更漂亮些。
再來看個(gè)復(fù)雜點(diǎn)的。前兩天我發(fā)現(xiàn)需要把某個(gè)目錄下所有反編譯出來的jad文件改名成java文件。dos的rename命令居然不支持。于是我就祭起法寶:
這個(gè)東西定義了一個(gè)函數(shù),接下來,我就可以拿rename當(dāng)作一個(gè)簡潔的命令了:
后來,我把這個(gè)rename函數(shù)稍微完善了一下,增加了一個(gè)recursive參數(shù)來控制是否處理子目錄,缺省值是false,給dir設(shè)置當(dāng)前目錄為缺省值。代碼放在一個(gè)可以重用的腳本文件里面?,F(xiàn)在可以這樣做了。先把函數(shù)加載進(jìn)來:
然后調(diào)用:
呵呵。
這個(gè)工具可以調(diào)用任意的ant任務(wù)。還有很多好用的函數(shù)。具體請(qǐng)見:
http://docs.codehaus.org/display/JASKELL/Neptune
在Neptune這個(gè)工具里面,附帶了一個(gè)shell。這個(gè)shell允許交互執(zhí)行Neptune的Command和Ant的Task。可以在這里下載:
http://docs.codehaus.org/display/JASKELL/Downloads
下面簡要介紹一下怎么用:
啟動(dòng)Neptune shell很簡單。按照要求安裝完了之后(就是設(shè)置一個(gè)NEPTUNE_HOME和PATH環(huán)境變量),運(yùn)行:
np -i
shell啟動(dòng)后,你可以看見:Neptune Interactive
>
這個(gè)">"是命令提示符?,F(xiàn)在你可以輸入命令了。>
先看看最簡單的ant echo任務(wù)。xml語法是這樣的:
<echo message="hello world"/>
對(duì)應(yīng)的neptune語法是> ant.echo{message="hello world"}->exec
>
>
starting command Echo ...
task Echo: hello world
command Echo executed.
稍微解釋一下:
1。所有ant命令都在ant這個(gè)namespace里面。
2。xml的尖括號(hào)換成大括號(hào)。大括號(hào)在jaskell語言里面表示一個(gè)tuple。
3。exec函數(shù)用來執(zhí)行一個(gè)命令。如果沒有exec,ant.echo只是生成一個(gè)命令對(duì)象,但不執(zhí)行。這樣做得好處是,你可以用變量臨時(shí)存儲(chǔ)這些命令對(duì)象,可以把他們存在任意的對(duì)象或者數(shù)組中,等到真正需要執(zhí)行的時(shí)候再運(yùn)行。
4。"->"這個(gè)函數(shù)用來以先參數(shù)后函數(shù)的循序調(diào)用函數(shù),相當(dāng)于exec(ant.echo{...}),語法上有的時(shí)候顯得更漂亮些。
再來看個(gè)復(fù)雜點(diǎn)的。前兩天我發(fā)現(xiàn)需要把某個(gè)目錄下所有反編譯出來的jad文件改名成java文件。dos的rename命令居然不支持。于是我就祭起法寶:
> rename {dir,from,to} = ant.move{todir=dir}.with [
> ant.types.fileset{dir}.with [
> ant.types.include{name="**/$from"}
> ],
> ant.types.mapper{type="glob",from,to}
> ] ->exec
>
=> rename()
> ant.types.fileset{dir}.with [
> ant.types.include{name="**/$from"}
> ],
> ant.types.mapper{type="glob",from,to}
> ] ->exec
>
=> rename()
這個(gè)東西定義了一個(gè)函數(shù),接下來,我就可以拿rename當(dāng)作一個(gè)簡潔的命令了:
> rename{dir="decompiled",from="*.jad",to="*.java"}
>
starting command Move
command Move executed.
>
>
starting command Move

command Move executed.
>
后來,我把這個(gè)rename函數(shù)稍微完善了一下,增加了一個(gè)recursive參數(shù)來控制是否處理子目錄,缺省值是false,給dir設(shè)置當(dāng)前目錄為缺省值。代碼放在一個(gè)可以重用的腳本文件里面?,F(xiàn)在可以這樣做了。先把函數(shù)加載進(jìn)來:
> helper = import {resource="jfun/neptune/ant/anthelper.jsl"}
>
>
然后調(diào)用:
> helper.rename{from="*.jad",to="*.java",recursive=true}->exec
>
>
呵呵。
這個(gè)工具可以調(diào)用任意的ant任務(wù)。還有很多好用的函數(shù)。具體請(qǐng)見:
http://docs.codehaus.org/display/JASKELL/Neptune