一般來說。ant的任務都是要寫一個build.xml文件,然后刪刪改改,最后運行ant target。這自是正途。但是有時候,如果你需要的就是簡單試驗一下某個task,或者就想拿某個ant task當成shell命令的話,就不方便了。

在Neptune這個工具里面,附帶了一個shell。這個shell允許交互執行Neptune的Command和Ant的Task。可以在這里下載:
http://docs.codehaus.org/display/JASKELL/Downloads

下面簡要介紹一下怎么用:

啟動Neptune shell很簡單。按照要求安裝完了之后(就是設置一個NEPTUNE_HOME和PATH環境變量),運行:
np -i

shell啟動后,你可以看見:
Neptune Interactive
>
這個">"是命令提示符。現在你可以輸入命令了。

先看看最簡單的ant echo任務。xml語法是這樣的:
<echo message="hello world"/>
對應的neptune語法是
> ant.echo{message="hello world"}->exec
>
starting command Echo ...
task Echo: hello world
command Echo executed.

稍微解釋一下:
1。所有ant命令都在ant這個namespace里面。
2。xml的尖括號換成大括號。大括號在jaskell語言里面表示一個tuple。
3。exec函數用來執行一個命令。如果沒有exec,ant.echo只是生成一個命令對象,但不執行。這樣做得好處是,你可以用變量臨時存儲這些命令對象,可以把他們存在任意的對象或者數組中,等到真正需要執行的時候再運行。
4。"->"這個函數用來以先參數后函數的循序調用函數,相當于exec(ant.echo{...}),語法上有的時候顯得更漂亮些。



再來看個復雜點的。前兩天我發現需要把某個目錄下所有反編譯出來的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()

這個東西定義了一個函數,接下來,我就可以拿rename當作一個簡潔的命令了:
> rename{dir="decompiled",from="*.jad",to="*.java"}
> 
starting command Move
command Move executed.
>


后來,我把這個rename函數稍微完善了一下,增加了一個recursive參數來控制是否處理子目錄,缺省值是false,給dir設置當前目錄為缺省值。代碼放在一個可以重用的腳本文件里面。現在可以這樣做了。先把函數加載進來:

> helper = import {resource="jfun/neptune/ant/anthelper.jsl"}
>


然后調用:
> helper.rename{from="*.jad",to="*.java",recursive=true}->exec
>

呵呵。

這個工具可以調用任意的ant任務。還有很多好用的函數。具體請見:
http://docs.codehaus.org/display/JASKELL/Neptune