【ANT】Ant經常使用的內置task

 

  • ant

例如: javascript

<target name="callProjectB">
  <echo message="In projectA calling projectB"/>         
    <ant antfile="subfile/projectB.xml" /> 
</target>

說明:項目A經過ant命令執行項目Bcss

屬性:html

(1) antfile : 指定要執行的構建文件名稱,能夠包含路徑信息。java

(2) dir : 指定構建文件所在的目錄,至關於指定了要執行的構建文件的basedir屬性,若是dir屬性沒有設置,會以當前構建文件的根目錄做爲ant任務的根目錄。node

(3) Target:指定要執行的構建文件要執行的target。例如git

<project name="porjectA" default="callProjectB">   

     <target name="callProjectB">        

          <echo message="In projectA calling projectB"/>                

           <ant antfile="subfile/projectB.xml" target=" target2"/>    

     </target>

</project>
View Code

(4) output :指定ant工具執行時的信息輸出,可定位到控制檯或者文件中,當定位到文件中至關於在命令行指定了-logfile filename。web

<ant antfile="subfile/projectB.xml"  output="out.log"/>

(5) inheritAll:若是設定爲true,那麼被調用的構建文件的project元素中可以使用當前project中的reference任務。Reference任務的做用是吧當前屬性複製到被調用的ant project中使用,reference任務包含兩個屬性:shell

    refid :表明當前project中的屬性id。npm

    Torefid :用於指定在被調用的project中的引用id。json

例如:

<reference refid="path1" torefid="path2"/>   <!-- // 把當前project中的path1屬性傳遞給被調用的project中使用,  在被調用project中經過path2引用這個屬性。  -- >
  • antcall : 執行過程當中調用並執行其餘target

    例如:

    <target name="targetA"> 
    
             <echo message="In targetA calling targetB"/>    
    
             <antcall target="targetB" >    
    
             </antcall>        
    
             <echo message="After call targetB" />  
    
    </target>

    屬性:

    (1) target:在AntCall任務中target屬性的做用是指定要被調用執行的target,經過名稱指定這個target屬性是必需的。值得注意的是,當經過AntCall任務調用的target存在依賴的target(depends中指定了target),則depends屬性中被指定的target也會被執行。

        (2) inheritAll :用於指定是否繼承當前的屬性。默認時爲true,表明被調用的target可以使用這些屬性。

        (3) inheritRefs :用於指定是否覆蓋reference屬性或者是否創建一個對當前reference屬性的引用。在默認的狀況下,AntCall任務不會覆蓋reference屬性,除非把inheritRefs屬性設爲true。默認時inheritRefs屬性爲false。

       例如:利用AntCall Task實現target間調用時傳遞參數的實例  當須要從一個target傳遞參數到被調用的target時,可使用<param> 類型進行傳遞。固然也能夠在target中定義property來實現,與Java中的方法調用時傳遞參數類似

<target name="targetA">       

   <echo message="In targetA calling targetB"/>     

   <!-- //經過property傳遞  -->        

   <property name="prop" value="prop property" />      

   <antcall target="targetB" >         

   <!-- // 經過antcall設定param實現  -->     

       <param name="path1" value="path1 param" />     

   </antcall>      

   <echo message="After call targetB" />  

</target>   

<target name="targetB" depends="init">   

   <echo message="In targetB" />     

   <echo message="path1=${path1}" />   

   <echo message="prop=${prop}" />  

</target>
View Code

      經過property指定和經過AntCall中的param指定的屬性都傳遞到targetB中,對於param類型只有兩個屬性:name和value。因爲AntCall任務中的inheritAll屬性默認時爲true,因此property能被targetB引用。若是targetB中也定義了相同的property,那麼         能夠經過設置inheritRefs屬性和reference類型進行覆蓋。

  • Apply/ExecOn : ant工具直接執行系統命令

    Apply/ExecOn 任務的做用是,經過Ant工具直接執行系統使命。經過這個task執行的命令依賴於操做系統,並且只能在Ant支持的操做系統下執行。Ant支持Windows、Linux、UNIX、OS/2 Warp、Novell Netware 6和MacOS X。

    屬性:

    (1) executable :用於指定要執行的命令,不帶命令行參數,這個屬性是必需的。

    (2) dest :用於指定命令執行時目標文件的存放位置。

    (3) spawn :用於指定是否在執行命令時產生輸出信息。默認爲false表明輸出日誌信息。若是指定了spawn屬性爲true,Ant將不會產生這個命令的日誌輸出。 

    (4) dir :用於指定執行命令所在的目錄,在此目錄下執行這個命令。 

    (5) relative:用於指定命令是否支持相對路徑。默認爲false,不支持相對路徑,相對於當前根目錄或dest屬性設定的目錄。

    (6) forwardslash:用於設定文件路徑是否支持斜線分隔符,儘管有些操做系統支持其餘的分隔符。默認時爲false,若是操做系統的分隔符爲斜線,那麼這個屬性將被忽略。 

    (7) os:列出容許執行這個命令的操做系統。

    (8) output:指定把命令行執行的輸出重定向到一個輸出文件。若是錯誤信息沒有重定向到特定文件,錯誤信息則將輸出到這個文件中。

    (9) error :指定一個文件用於接收錯誤的輸出信息。從Ant 1.6後提供了這個     屬性。 

    (10) logError:這個屬性用於指定把錯誤的日誌輸出到Ant工具的日誌信息中,也能夠經過error屬性指定錯誤的輸出文件。

    (11) append:指定是否能夠輸出到一個存在的文件或者覆蓋存在的文件,默認爲false。 

    (12) outputproperty:指定輸出定向到的屬性的名字,在屬性中可定義一個文件,這樣就能夠把輸出信息輸出到文件中。 

    (13) errorproperty:用於指定把錯誤信息輸出到的屬性的名字。

    (14) input:指定一個文件,從這個文件中讀取屬性,在執行命令時能夠引用獲得這些屬性。

    (15) inputstring:用於把inputstring屬性指定的字符串傳遞給執行的命令。

    (16) resultproperty:這個屬性用於存放命令執行後所返回的結果。 

    (17) timeout:設定一個時間,若是這段時間內命令沒執行完畢,則這個命令會被中斷。

    (18) failonerror:這個屬性用於指定是否出錯時命令終止。若是屬性取值爲true,那麼在執行的命令退出的同時返回一個不爲0的代碼,則構建進程將會停止。

    (19) failifexecutionfails :用於指定當不能執行程序時是否停止構建命令的執行,默認爲true。 

    (20) skipemptyfilesets:當指定的目錄中沒有文件,則構建命令將不會被執行。 

    (21) parallel:若是屬性爲true,則構建命令只執行一次,並把附加的文件做爲命令參數。若是爲false則每個附加的文件都會執行一次這個命令。默認爲false。  

    (22) type :指定傳給要執行的命令的參數類型,可爲file(文件)、dir(目錄)、path(路徑)。默認爲file。 

    (23) newenvironment:若是當前的環境變量被聲明,將不傳遞舊的環境變量,默認爲false。 

    (24) vmlauncher :默認爲true,經過Java虛擬機的特性來執行構件文件。若是爲false,則經過操做系統自己的腳本功能去執行。  

    (25) resolveExecutable:默認爲false,若是設爲true,那麼命令會在project的根目錄下執行。若是在UNIX或Linux下只容許用戶在本身的路徑下執行這個命令,那麼要把這個屬性設爲false。  

    (26) maxparallel :設定一個最大的平行值,用於指定一次執行的源文件的最大數目。若是設爲<0表明沒有限制。默認爲沒有限制。  

    (27) addsourcefile:是否自動添加源文件名到執行的命令中,默認爲true。

    (28) verbose :是否輸出命令執行時的概要信息,默認爲false不輸出。

    (29) ignoremissing :是否忽略不存在的文件,默認爲true。 

    (30) force :是否經過timestamp來對target文件進行對比。默認爲false。

    Apply/ExecOn Task可以使用的參數 

    執行Apply/ExecOn 任務時能夠經過Ant提供的一些內置類型來簡化操做,相似於參數傳遞的做用。可以使用的Ant類型有:    

    ● FileSet:能夠經過<fileset>元素來設定文件集合,在任務中引用這個FileSet。   

    ● FileList:能夠經過一個或多個FileList來指定文件列表,而後在Apply/ExecOn Task中進行引用。   

    ● Dirset:經過Dirset定義目錄集合,而後在Apply/ExecOn Task中進行引用。    

    ● Arg:可經過<arg>類型指定命令行參數,而後在Apply/ExecOn Task中使用。    

    ● Mapper:經過Mapper類型能夠指定dest屬性的文件的映射關係。   

    ● Srcfile:經過參數指定源文件,在<arg>的後面使用,<arg>參數的值爲Srcfile指定的源文件。    

    ● Targetfile:與Srcfile做用類似,用於指定目錄文件的參數。    

    ● Env:指定一個環境變量,並在命令行中傳遞,以<env>類型的形式使用。

    經過Apply/ExecOn Task執行Linux下ls命令 (顯示文件信息)的實例。  在Linux系統中,能夠經過ls的shell命令顯示文件的詳細信息。用Ant工具也能夠執行ls這個功能。具體的例子以下: 

    <apply executable="ls"> 
    
      <arg value="-l"/>  
    
      <fileset dir="/tmp">   
    
        <patternset>      
    
            <exclude name="**/*.txt"/>   
    
        </patternset>  
    
      </fileset>   
    
      <fileset refid="other.files"/>
    
    </apply>

    這個例子的做用是:調用ls–l的shell命令,列出/tmp目錄下的全部非.txt文件和全部id爲other.files的FileSet類型所指定的文件的詳細信息。

    使用Mapper、Srcfile類型的實例   下面是一個經過Apply/ExecOn任務使用Mapper和Srcfile類型的例子,具體內容以下:  

    <apply executable="cc" dest="src/C" parallel="false">   
    
        <arg value="-c"/>   
    
        <arg value="-o"/>   
    
        <targetfile/>   
    
        <srcfile/>    
    
               <fileset dir="src/C" includes="*.c"/>   
    
        <mapper type="glob" from="*.c" to="*.o"/> 
    
    </apply>

    這個例子的做用是:經過Mapper指定爲每一個比.o文件新的.c文件執行cc –c –o targetfile sourcefile命令。在這個命令中用.o文件的名稱替換targetfile(目標文件),用.c文件的名稱替換sourcefile

  • Chmod Task : 改變Linux/Unix系統的文件權限

    在UNIX和Linux系統下要改變文件的權限,可使用chmod的shell命令。例如:chmod 777 abc.txt。設置abc.txt文件的權限爲「全部人有對文件操做的全部權限」。在Ant工具中能夠經過Chmod任務方便地實現這些功能。在Chmod任務中能夠引用FileSet和DirSet類型指定的文件集合和目錄集合。 

    Chmod Task屬性及功能  Chmod任務包括以下屬性:  

    (1)file:用於指定即將被改變權限的文件名稱。  

    (2)dir:用於指定這個目錄下的全部文件的權限將要被改變。在Chmod任務中dir屬性和file屬性二者必須選擇其中一個。 

    (3)perm:用於指定文件的新權限。  

    (4)includes:用於指定一個或多個文件的匹配模式,只有符合這些模式的文件的權限纔會被改變。可用逗號符或空格符進行分隔。  

    (5)excludes:與includes屬性的做用正好相反,用於指定一個或多個文件匹配模式,只有不符合這些模式的文件的權限纔會被改變。可用逗號符或空格符進行分隔。 

    (6)defaultexcludes:用於指定是否不包括Ant工具默認不包含的文件匹配模式。可取值爲yes或no。忽略此屬性時表明不包含默認的不包含的文件模式。  Ant工具默認不包含的文件模式有:**/*~,**/#*#,**/.#*,**/%*%,**/._*, **/CVS,**/CVS/**,**/.cvsignore,**/SCCS,**/SCCS/**,**/vssver.scc,**/.svn,**/.svn/**,**/.DS_Store。   (7)parallel:用於指定是否爲每一個包含的文件獨立執行Chmod命令,默認爲true。  

    (8)type:可取值爲file、dir或both。取值file表示只改變文件的權限;若取值dir表示只改變目錄的權限;若取值both則表明改變文件和目錄二者的權限。  

    (9)maxparallel:用於指定一次執行Chmod命令的最大值。設爲<=0表明不限制,默認爲不限制。

    (10)verbose:用於指定在執行命令後是否輸出這個命令的執行信息。默認爲false不輸出。  

    經過Ant改變Linux/UNIX文件和目錄權限的例子

       在Linux和UNIX下一般經過Chmod命令來改變文件或目錄的權限,Ant工具的Chmod任務也能實現一樣的功能。例如,改變start.sh文件的權限讓全部人對此文件具備讀和執行的權限。   <chmod file="${dist}/start.sh" perm="ugo+rx"/>   全部用戶對${dist}/start.sh文件都具備讀和執行的權限。若是隻有文件的全部者才具備讀、寫和執行權限,那麼能夠編寫如下程序: 

    <chmod file="${dist}/start.sh" perm="o+rx"/>  

    固然也能夠用數據來表示權限,上面的程序可改成:   <chmod file="${dist}/start.sh" perm="700"/> <!--  //與上面程序做用相同,   文件的全部者才具備讀、寫和執行的權限  -->   固然也能夠經過FileSet和DirSet類型實現更復雜的功能,例如: 

    <chmod perm="go-rwx" type="file">  
    
        <fileset dir="/web">      
    
            <include name="**/*.cgi"/>     
    
            <include name="**/*.old"/>   
    
        </fileset>    
    
        <dirset dir="/web">      
    
            <include name="**/private_*"/>   
    
        </dirset> 
    
    </chmod>

    這個例子的做用是讓不是文件的全部者能夠訪問cgi腳本。文件的權限將會改變的文件有:全部/web目錄下的.cgi和.old文件,全部以private_*開頭的文件或目錄名以private_*開頭的目錄下的文件。

  • Copy Task : 把一個或者多個文件複製到指定的目錄下

但要注意的是,若是目標目錄下具備同名的文件,那麼只有當源文件相對於目標文件更新時,Ant工具纔會複製這個文件。在Copy任務中可使用FileSet類型來定義文件集合。 

Copy Task的屬性及功能  Copy 任務具備如下屬性:  

(1)file:用於指定要複製的源文件。  

(2)preservelastmodified:做用是使得複製後的文件與源文件的最後修改時間相同。默認爲false。  

(3)tofile:用於指定要複製到的文件。  

(4)todir:用於指定要複製到的目標目錄。todir和tofile只能使用其中一個屬性。 

(5)overwrite:用於指定是否須要覆蓋目錄和文件,無論文件是否比源文件新,都會覆蓋。默認爲false。 

(6)filtering:用於指定在複製時是否使用構件文件的全局過濾器對文件進行過濾。默認爲false。

(7)flatten:用於指定是否須要複製目錄,若是爲true表明把全部的文件複製到todir屬性設定的目錄下。默認爲false,複製目錄。  

(8)includeEmptyDirs:用於指定是否複製空目錄。默認爲true。  

(9)failonerror:用於指定當遇到錯誤時是否中止執行。默認爲true。 

(10)verbose:用於指定當複製文件時是否記錄日誌信息。  

(11)encoding:用於設定複製文件時的編碼或文件過濾器使用的編碼方式。默認時使用Java虛擬機的編碼方式。  

(12)outputencoding:指定寫文件時的編碼方式。默認時使用Java虛擬機的編碼方式。   (13)enablemultiplemappings:用於設定是否容許多個映射。默認爲false。 

(14)granularity:用於指定一個文件修改時間的毫秒數據的容許偏差。由於不是全部的文件系統的修改時間都是精確到毫秒數。默認時爲0,若是爲DOS系統則爲2。

經過Copy Task實現文件和目錄複製功能實例  

不論是對程序進行打包仍是通常的文件操做,基本上都離不開復制功能。經過Ant工具的Copy任務可讓程序在Windows和Linux/UNIX下對文件和目錄進行復制操做。
例如:  
(1)對單個文件進行復制:  

<copy file="myfile.txt" tofile="mycopy.txt"/>

這個例子的做用是在當前目錄複製myfile.txt,並把複製的文件命名爲mycopy.txt。當須要把文件複製到別外的目錄時能夠這樣編寫: 

 

    • <copy file="myfile.txt" todir="../some/other/dir"/>

      這個例子的做用是把文件複製到與當前目錄同級的some目錄的/other/dir子目錄下。這裏「..」表明相對路徑(當前目錄的上一級目錄)。 

      (2)對文件目錄進行復制: 

      <copy todir="../new/dir">     
          <fileset dir="src_dir"/>   
      </copy>

      這個例子的做用是把src_dir目錄複製到../new/dir目錄下。有時對文件進行復制時須要對文件進行備份。

      下面舉一個複製文件時對文件進行備份的例子。 

      <copy todir="../backup/dir">   
      
          <fileset dir="src_dir">      
      
              <exclude name="**/*.java"/>   
      
          </fileset>    
      
          <globmapper from="*" to="*.bak"/> 
      
      </copy>
      View Code   

      這個例子的做用是把src_dir目錄及其子目錄下全部非Java文件複製到../backup/dir目錄下,並重命名爲bak文件,以做備份。 

      在執行Copy Task時使用文件過濾的實例  

      下面是一個複製文件的同時替換文件中的特殊符號的例子:

      <copy todir="../backup/dir">     
      
          <fileset dir="src_dir"/>     
      
          <filterset>       
      
              <filter token="TITLE" value="Foo Bar"/>
      
          </filterset> 
      
      </copy>
      View Code

      這個例子的做用是把src_dir目錄下的全部文件複製到../backup/dir目錄,並在全部文件中查找並替換@TITLE@爲Foo Bar。當要進行新產品發佈時經過須要替換文件中的版本信息和時間信息。   說明:在Ant工具中還提供了copydir和copyfile這兩個特定的任務,分別用於對目錄和文件進行復制。但自從有了Copy任務後,這兩個任務已過時,不建議再使用,應該統一使用Copy任務。

  • Echo Task : 輸出系統信息

Echo任務的做用是根據logger(日誌)或listener(監聽器)的級別輸出相應的信息。至關於Java中的System.out來輸出信息。

Echo任務包含如下屬性: 

(1)message:用於定義要輸出的信息。這個屬性是必需的。  

(2)file:用於定義一個文件。這個文件用於接收message定義的輸出信息,當設定爲把信息輸出到接收文件時才起做用。  

(3)append:用於指定信息是否輸出到指定的文件。默認爲false。 

(4)level:用於指定這個信息的級別。可取值爲error,warning,info,verbose或debug。   Echo任務的使用比較簡單。例如定義一個信息的輸出,代碼以下:  

<echo message=" This is a simple message,out print by echo task! " />

當須要把信息輸出到具體的文件中時,能夠這樣編寫Echo Task:  

<echo message=" This is a simple message,out print by echo task! " file="/logs/messge.log" append="true"/>

      這個例子的做用是,把信息輸出到/logs/message.log文件中,而不是直接輸出到命令行。

  • Mkdir Task : 建立目錄。

可用於Windows或Linux下創建目錄。一個有趣的地方是,這個命令在Linux和Windows下相同,創建一個目錄均可以經過Mkdir+目錄名稱來實現。Mkdir 任務只有一個屬性dir,dir屬性用於指定要建立的目錄名稱。可爲相對路徑也能夠爲絕對路徑。   Mkdir的用法比較簡單,例如在當前目錄下建立一個名爲dist的子目錄(用於項目發佈):  

<property name="dist" value="dist" />  <mkdir dir="${dist}"/>

雖然Mkdir任務相對簡單,但Mkdir頗有用,特別在建立文件前對目錄進行驗證。

 

  • Move Task : 移動文件或目錄。

Move 任務用於移動文件和目錄,默認時Move任務會覆蓋目標文件或目錄(若是目標文件或目錄存在)。當關閉overwrite時,Move任務只會移動源文件比目標文件新的文件,或者目標文件不存在時才移動。在Move任務中能夠引用FileSet類型。 

Move Task的屬性及功能  Move 任務具備如下屬性:  

(1)file:用於指定要移動的文件或目錄。  

(2)preservelastmodified:用於指定移動後的文件的最後修改時間與源文件相同。 

(3)tofile:做用是指定移動後的文件新名稱和位置。 

(4)todir:做用是指定文件目錄的目標位置。

(5)overwrite:用於設定當源文件的最後修改時間大於目標文件的最後修改時間時,是否用源文件覆蓋目標文件。默認爲true。

(6)filtering:用於定義在移動時是否容許符號過濾。 

(7)flatten:做用是忽略目錄結構。把各層目錄下的文件移動到同一個目錄下。默認爲false。  

(8)includeEmptyDirs:用於指定在移動時是否忽略空目錄。默認爲false。 

(9)failonerror:用於定義當出現錯誤時是忽略並繼續執行,仍是當遇到錯誤時就中止執行命令。 

(10)verbose:用於指定當文件移動時是否輸出日誌信息。  

(11)encoding:用於定義在移動文件時使用的過濾器的編碼方式。

(12)outputencoding:用於定義在寫文件時使用的編碼方式。 

 (13)enablemultiplemapping:用於指定是否可使用多個映射。默認時只使用一個   映射。  

       (14)granularity:用於指定一個文件修改時間的毫秒數據的容許偏差。由於不是全部的文件系統的修改時間都精確到毫秒數。默認時爲0,若是是DOS系統則爲2。  
        使用Move Task實現移動文件和目錄功能的實例 

移動單個文件的實例:

<move file="file.orig" tofile="file.moved"/>

這個例子的做用是重命名file.org文件爲file.moved。把文件移動到目錄的例子以下:  

<move file="file.orig" todir="dir/to/move/to"/>  

這個例子的做用是把文件file.org移動到dir/to/move/to目錄下。 

移動目錄的實例: 

<move todir="new/dir/to/move/to">  
    <fileset dir="src/dir"/>  
</move>

這個例子的做用是把src/dir目錄移動到new/dir/to/move/to目錄。在Ant 1.6.3版本後,可使用如下file屬性來指定目錄從而實現上面目錄移動的功能:   <move file="src/dir" tofile="new/dir/to/move/to"/> 

經過Mapper功能對文件進行備份的例子: 

<move todir="my/src/dir" includeemptydirs="false">   
    <fileset dir="my/src/dir">     
        <exclude name="**/*.bak"/>    
    </fileset>    
    <mapper type="glob" from="*" to="*.bak"/> 
</move>

      這個實例的做用是把my/src/dir目錄下的全部文件重命名爲.bak的備份文件(.bak文件除外)。   

  • Zip Task : 建立ZIP文件。

在Zip任務裏能夠直接嵌套使用FileSet類型、include類型、exclude類型等,在這些文件類型中還能夠對文件進行過濾。 

Zip任務具備如下屬性,用於描述將要打包爲zip的文件和目錄等: 

(1)destfile:用於指定將要打包的zip文件。  

(2)zipfile:也用於指定要打包的zip文件,但已不建議使用,應該使用destfile屬性來代替。zipfile屬性和destfile屬性二者必須選擇其一。

 (3)basedir:用於指定打包zip文件的目錄。 

 (4)compress:用於指定是否使用壓縮的形式來保存數據。默認爲true(對數據進行壓縮)。  

(5)keepcompression:用於指定已壓縮的zip文件保持原先的壓縮格式。默認爲false。   (6)encoding:用於指定Zip任務裏的文件名稱的編碼方式。默認時採用操做系統的編碼方式。 

 (7)filesonly:用於指定是否在Zip任務中只存儲文件。默認爲false。

 (8)includes:用於指定一個或多個在Zip任務中要包含的文件。可使用逗號或空格符進行分隔。當這個屬性被忽略時表明zip將包含全部文件。

 (9)includesfile:用於指定zip文件中要包含的文件的名稱。

  (10)excludes:用於指定一個或多個在Zip任務中不被包含的文件。可使用逗號或空格符進行分隔。當這個屬性被忽略時表明Zip任務將包含全部文件。 

(11)excludesfile:用於指定在Zip任務中不被包含的文件的名稱。 

 (12)defaultexcludes:用於定義是否在Zip中不包含Ant默認要排除的文件模式。可取值爲yes或no。忽略時表明使用默認的排除文件模式,將不包含符合這些模式的文件。   (13)update:用於定義是否更新或覆蓋目標文件,當目標文件已存在時。默認爲false。   (14)whenempty:用於指定當沒有知足打包條件的文件時的處理方式。可取值爲fail、skip和create。fail表明建立zip失敗,skip表明忽略不處理,create表明依然建立zip文件。默認爲skip。 

(15)duplicate:定義當出現重複文件時的處理方式。可取值add、preserve和fail。add表明依然添加(覆蓋)文件,preserve表明不打包重複文件,fail表明將打包失敗。默認爲add。  

(16)roundup:用於指定打包zip文件時文件的修改時間是否採用下一個連續的秒數。默認爲true。 

(17)comment:做用是在zip文件中加上註釋。

使用Zip Task打包zip文件的實例   在Zip任務中可使用ZipFileSet類型定義一個或多個zip格式的文件集合,而後在Zip任務中引用。  

(1)      打包zip文件的實例,以下:

<zip destfile="${dist}/manual.zip"  basedir="htdocs/manual"  includes="api/**/*.html" excludes="**/todo.html" />

這個實例的做用是打包htdocs/manual目錄下的文件,而且命名爲manual.zip。在這個zip文件中只包含htdocs/manual/api目錄或其子目錄下的全部.html文件,但不包含其中文件名爲todo.html的文件。  

如下是一個使用ant構建項目的完整的例子:

<!-- 項目名稱Cesium,默認targetcombine -->
<project name="Cesium" default="combine">
    <!-- target名稱build -->
    <target name="build" description="A developer build that prepares the source tree for use as standard AMD modules.">
        <!-- 新建文件夾任務${buildDirectory}" = ./build -->
        <mkdir dir="${buildDirectory}" />
        <!--自定義任務,把glsl轉換爲js -->
        <glslToJavascript minify="${build.minification}" minifystatefile="${buildDirectory}/minifyShaders.state">
            <!--glsl文件目錄,${shadersDirectory}目錄下的全部glsl文件 -->
            <glslfiles dir="${shadersDirectory}" includes="**/*.glsl" />
            <!--${shadersDirectory}目錄下存在的js文件,不包括.profile.js -->
            <existingjsfiles dir="${shadersDirectory}" includes="**/*.js" excludes="*.profile.js" />
        </glslToJavascript>
        <!--自定義任務,建立CesiumJs,輸出到${sourceDirectory}/Cesium.js -->
        <createCesiumJs output="${sourceDirectory}/Cesium.js">
            <!--源文件是以cesiumJsFiles爲id的定義的fileset -->
            <sourcefiles refid="cesiumJsFiles" />
        </createCesiumJs>
        <!--自定義任務,建立SpecList,輸出到${specsDirectory}/SpecList.js -->
        <createSpecList output="${specsDirectory}/SpecList.js">
            <!--${specsDirectory}目錄下全部js文件-->
            <specs dir="${specsDirectory}" includes="**/*.js" excludes="*.js" />
        </createSpecList>
        <!--條件判斷,若是${build.debugUnminified}的值爲true,那麼給exclude.development.gallery屬性賦值爲**/development/*.html-->
        <condition property="exclude.development.gallery" value="**/development/*.html">
            <istrue value="${build.debugUnminified}" />
        </condition>
        <!--自定義任務,建立GalleryList,輸出到${galleryDirectory}/gallery-index.js -->
        <createGalleryList output="${galleryDirectory}/gallery-index.js">
            <!--根據上面的condition的條件,過濾掉值爲${exclude.development.gallery}的文件 -->
            <demos dir="${galleryDirectory}" includes="**/*.html" excludes="${exclude.development.gallery}" />
        </createGalleryList>
        <!--自定義任務,建立SandcastleJsHintOptions,輸出到${sandcastleDirectory}/jsHintOptions.js -->
        <createSandcastleJsHintOptions output="${sandcastleDirectory}/jsHintOptions.js" jshintoptionspath="${jsHintOptionsPath}" />
    </target>
    <!-- target名稱combine,依賴於build、combineJavaScript,先順序執行這兩個target在執行combine target -->
    <target name="combine" depends="build,combineJavaScript" description="Combines all source files into a single stand-alone script." />
    <!--target名稱minify -->
    <target name="minify" description="Combines all source files into a single stand-alone, minified script.">
        <!--調用combine target,並將參數build.minification和值true傳進去 -->
        <antcall target="combine">
            <param name="build.minification" value="true" />
        </antcall>
        <!--調用minifyCSS target -->
        <antcall target="minifyCSS" />
    </target>
    <!--target名稱combineRelease -->
    <target name="combineRelease" description="Combines all source files into a single stand-alone script with debugging code removed.">
        <!--調用combine target,並將參數pragmas.debug和值false傳進去 -->
        <antcall target="combine">
            <param name="pragmas.debug" value="false" />
        </antcall>
    </target>
    <!--target名稱minifyRelease -->
    <target name="minifyRelease" description="Combines all source files into a single stand-alone, minified script with debugging code removed.">
        <!--調用minify target,並將參數傳進去 -->
        <antcall target="minify">
            <param name="pragmas.debug" value="false" />
        </antcall>
    </target>
    <!--target名稱release -->
    <target name="release" description="A full release build that creates a shippable product, including building apps and generating documentation.">
        <!--調用minifyRelease target -->
        <antcall target="minifyRelease" />
        <!--調用combine target,並傳參 -->
        <antcall target="combine">
            <param name="build.debugUnminified" value="true" />
        </antcall>
        <!--調用generateDocumentation target -->
        <antcall target="generateDocumentation" />
        <!--調用buildApps target -->
        <antcall target="buildApps" />
    </target>
    <!--target名稱instrumentForCoverage,依賴於build target -->
    <target name="instrumentForCoverage" depends="build" description="A debug build instrumented for JSCoverage (currently Windows only).">
        <!--執行命令${jscoveragePath},參數爲 ${sourceDirectory} ${instrumentedDirectory} -no-instrument=./ThirdParty-->
        <exec executable="${jscoveragePath}">
            <arg value="${sourceDirectory}" />
            <arg value="${instrumentedDirectory}" />
            <arg value="--no-instrument=./ThirdParty" />
        </exec>
    </target>
    <!--target名稱makeZipFile,依賴於release target -->
    <target name="makeZipFile" depends="release" description="Builds zip files containing all release files.">
        <!--執行內置系統任務zip,輸出到Cesium-${version}.zip,以${basedir}爲基準路徑 -->
        <zip destfile="Cesium-${version}.zip" basedir="${basedir}">
            <!--定義了全部要打包的文件目錄及文件和排除的文件 -->
            <zipfileset dir="${buildDirectory}" prefix="Build">
                <include name="Apps/**" />
                <exclude name="Apps/TimelineDemo/**" />
                <include name="Cesium/**" />
                <include name="CesiumUnminified/**" />
                <include name="Documentation/**" />
            </zipfileset>
            <include name="Apps/**" />
            <exclude name="Apps/Sandcastle/gallery/development/**" />
            <include name="Source/**" />
            <include name="Specs/**" />
            <include name="ThirdParty/**" />
            <include name="logo.png" />
            <include name="favicon.ico" />
            <include name="server.js" />
            <include name="package.json" />
            <include name="LICENSE.md" />
            <include name="CHANGES.md" />
            <include name="README.md" />
            <include name="web.config" />
            <zipfileset file="index.release.html" fullpath="index.html" />
        </zip>
    </target>
    <!--target名稱clean -->
    <target name="clean" description="Removes all generated build artifacts.">
        <!--刪除文件任務,包含空目錄,遇到錯誤不中止任務,並定義了要刪除的文件集合fileset -->
        <delete includeEmptyDirs="true" failonerror="false">
            <fileset dir="${sourceDirectory}" includes="Cesium.js" />
            <fileset dir="${buildDirectory}" defaultexcludes="false" />
            <fileset dir="${instrumentedDirectory}" defaultexcludes="false" />
            <fileset dir="${shadersDirectory}" includes="**/*.js" excludes="*.profile.js" />
            <fileset dir="${specsDirectory}" includes="SpecList.js" />
            <fileset dir="${sandcastleDirectory}" includes="jsHintOptions.js" />
            <fileset dir="${galleryDirectory}" includes="gallery-index.js" />
            <fileset dir="." includes="Cesium-*.zip" />
        </delete>
    </target>

    <!-- 定義全局屬性,引用方式如:${build.minification},即false -->
    <property name="build.minification" value="false" />
    <property name="pragmas.debug" value="true" />
    <property name="runServer.public" value="false" />
    <property name="runServer.port" value="8080" />
    <property name="version" value="1.13" />
    <property name="sourceDirectory" location="Source" />
    <property name="shadersDirectory" location="${sourceDirectory}/Shaders" />
    <property name="examplesDirectory" location="Examples" />
    <property name="sandcastleDirectory" location="Apps/Sandcastle" />
    <property name="galleryDirectory" location="${sandcastleDirectory}/gallery" />
    <property name="specsDirectory" location="Specs" />
    <property name="toolsDirectory" location="Tools" />
    <property name="tasksDirectory" location="${toolsDirectory}/buildTasks" />
    <property name="thirdPartyDirectory" location="ThirdParty" />
    <property name="requirejsPath" location="${thirdPartyDirectory}/requirejs-2.1.9" />
    <property name="rjsPath" location="${requirejsPath}/r.js" />
    <property name="rjsOptions" location="${toolsDirectory}/build.js" />
    <property name="almondPath" location="${thirdPartyDirectory}/almond-0.2.6/almond.js" />
    <property name="jscoveragePath" location="${toolsDirectory}/jscoverage-0.5.1/jscoverage.exe" />
    <property name="rhinoJarPath" location="${toolsDirectory}/rhino-1.7R4/js.jar" />
    <property name="documentationImagesDirectory" location="Documentation/Images" />
    <property name="jsdoc3Directory" location="${toolsDirectory}/jsdoc3" />
    <property name="webProxyDirectory" location="${toolsDirectory}/proxy" />
    <property name="jsHintPath" location="${thirdPartyDirectory}/jshint-2.1.10/jshint.js" />
    <property name="clocPath" location="${toolsDirectory}/cloc-1.60/cloc-1.60.pl" />
    <property name="clocDefinitionsPath" location="${toolsDirectory}/cloc-1.60/cloc_definitions" />
    <property name="jsHintOptionsPath" location=".jshintrc" />
    <property name="nodePath" value="node" />
    <property name="npmPath" value="npm" />

    <!-- Outputs -->
    <property name="buildDirectory" location="Build" />
    <property name="buildOutputDirectory" location="${buildDirectory}/Cesium" />
    <property name="unminifiedOutputDirectory" location="${buildDirectory}/CesiumUnminified" />
    <property name="buildDocumentationDirectory" location="${buildDirectory}/Documentation" />
    <property name="buildDocumentationImagesDirectory" location="${buildDocumentationDirectory}/images" />
    <property name="instrumentedDirectory" location="Instrumented" />
    <property name="buildStubsDirectory" location="${buildDirectory}/Stubs" />

    <!-- 聲明一組路徑,並以相應的系統分隔符來分割,並命名id爲javascriptClassPath,在後面用refid引用該路徑-->
    <path id="javascriptClassPath">
        <pathelement path="${rhinoJarPath}" />
        <pathelement path="${toolsDirectory}/bsf-2.4.0/bsf.jar" />
        <pathelement path="${toolsDirectory}/commons-logging-1.1.1/commons-logging-1.1.1.jar" />
    </path>
    <!-- 定義一組文件-->
    <union id="cesiumJsFiles">
        <fileset dir="${sourceDirectory}">
            <include name="**/*.js" />
            <exclude name="*.js" />
            <exclude name="Workers/**" />
            <exclude name="ThirdParty/Workers/**" />
            <exclude name="**/*.profile.js" />
        </fileset>
        <fileset dir="${sourceDirectory}">
            <include name="Workers/createTaskProcessorWorker.js" />
        </fileset>
    </union>
    <!-- 定義一組文件-->
    <fileset dir="${sourceDirectory}" id="cesiumWorkersJsFileSet">
        <include name="**/*.js" />
        <exclude name="*.js" />
        <exclude name="**/*.profile.js" />
    </fileset>
    <!-- 聲明自定義任務glslToJavascript,語言爲javascript,處理該任務的源文件是${tasksDirectory}/glslToJavaScript.js,使用manager做爲引擎,引用以前定義的類路徑javascriptClassPath做爲classpath -->
    <!-- 該任務的使用見target build-->
    <scriptdef name="glslToJavascript" language="javascript" src="${tasksDirectory}/glslToJavaScript.js" manager="bsf" classpathref="javascriptClassPath" loaderref="javascript.loader">
        <attribute name="minify" />
        <attribute name="minifystatefile" />
        <element name="glslfiles" type="fileset" />
        <element name="existingjsfiles" type="fileset" />
    </scriptdef>

    <scriptdef name="createCesiumJs" language="javascript" src="${tasksDirectory}/createCesiumJs.js" manager="bsf" classpathref="javascriptClassPath" loaderref="javascript.loader">
        <attribute name="output" />
        <element name="sourcefiles" type="resources" />
    </scriptdef>

    <scriptdef name="createSpecList" language="javascript" src="${tasksDirectory}/createSpecList.js" manager="bsf" classpathref="javascriptClassPath" loaderref="javascript.loader">
        <attribute name="output" />
        <element name="specs" type="fileset" />
    </scriptdef>

    <scriptdef name="createGalleryList" language="javascript" src="${tasksDirectory}/createGalleryList.js" manager="bsf" classpathref="javascriptClassPath" loaderref="javascript.loader">
        <attribute name="output" />
        <element name="demos" type="fileset" />
    </scriptdef>

    <scriptdef name="createSandcastleJsHintOptions" language="javascript" src="${tasksDirectory}/createSandcastleJsHintOptions.js" manager="bsf" classpathref="javascriptClassPath" loaderref="javascript.loader">
        <attribute name="output" />
        <attribute name="jshintoptionspath" />
    </scriptdef>

    <scriptdef name="runJsHint" language="javascript" src="${tasksDirectory}/runJsHint.js" manager="bsf" classpathref="javascriptClassPath" loaderref="javascript.loader">
        <attribute name="jshintpath" />
        <attribute name="jshintoptionspath" />
        <attribute name="sandcastlejshintoptionspath" />
        <attribute name="failureproperty" />
        <element name="sourcefiles" type="fileset" />
    </scriptdef>

    <scriptdef name="generateStubs" language="javascript" src="${tasksDirectory}/generateStubs.js" manager="bsf" classpathref="javascriptClassPath" loaderref="javascript.loader">
        <attribute name="stuboutput" />
        <attribute name="pathsoutput" />
        <element name="sourcefiles" type="resources" />
    </scriptdef>

    <scriptdef name="sortRequires" language="javascript" src="${tasksDirectory}/sortRequires.js" manager="bsf" classpathref="javascriptClassPath" loaderref="javascript.loader">
        <element name="sourcefiles" type="fileset" />
    </scriptdef>
    <!-- target名稱jsHint(js語法檢查),依賴於buildtarget-->
    <target name="jsHint" depends="build" description="Runs JSHint on the entire source tree.">
        <!-- 運行自定義任務runJsHint,由前面的scriptdef聲明的,並給參數傳值(指定jsHint路徑、options路徑、sandcastlejshintoptions路徑)、源文件等-->
        <runJsHint jshintpath="${jsHintPath}" jshintoptionspath="${jsHintOptionsPath}" sandcastlejshintoptionspath="${sandcastleDirectory}/jsHintOptions.js" failureproperty="jsHint.failure">
            <sourcefiles dir="${basedir}">
                <include name="Source/**/*.js" />
                <exclude name="Source/Shaders/**" />
                <exclude name="Source/ThirdParty/**" />
                <exclude name="Source/Workers/cesiumWorkerBootstrapper.js" />

                <include name="Apps/**/*.js" />
                <include name="Apps/Sandcastle/gallery/*.html" />

                <exclude name="Apps/Sandcastle/ThirdParty/**" />

                <include name="Specs/**/*.js" />

                <include name="Tools/buildTasks/**/*.js" />
            </sourcefiles>
        </runJsHint>
        <fail if="jsHint.failure" message="JSHint failed!" />
    </target>

    <!-- target名稱sortRequires-->
    <target name="sortRequires" description="Sorts the list of requires in all source files">
        <!-- 執行自定義任務sortRequires,並給元素sourecesfiles傳值(指定源文件)-->
        <sortRequires>
            <sourcefiles dir="${basedir}">
                <include name="Source/**/*.js" />
                <exclude name="Source/Shaders/**" />
                <exclude name="Source/ThirdParty/**" />
                <exclude name="Source/Workers/cesiumWorkerBootstrapper.js" />
                <exclude name="Source/copyrightHeader.js" />
                <exclude name="Source/Workers/transferTypedArrayTest.js" />

                <include name="Apps/**/*.js" />
                <exclude name="Apps/Sandcastle/ThirdParty/**" />

                <include name="Specs/**/*.js" />
                <exclude name="Specs/SpecRunner.js" />
                <exclude name="Specs/SpecList.js" />

                <exclude name="Apps/Sandcastle/Sandcastle-client.js" />
                <exclude name="Apps/Sandcastle/Sandcastle-header.js" />
                <exclude name="Apps/Sandcastle/Sandcastle-warn.js" />
                <exclude name="Apps/Sandcastle/gallery/gallery-index.js" />
                <exclude name="Apps/Sandcastle/jsHintOptions.js" />

                <exclude name="**/*.profile.js" />
            </sourcefiles>
        </sortRequires>
    </target>

    <target name="cloc" depends="build" description="Runs cloc to count lines of code for Source and Specs directories.">
        <echo message="Source:" />
        <apply executable="perl" parallel="true">
            <arg value="${clocPath}" />
            <arg value="--quiet" />
            <arg value="--progress-rate=0" />
            <arg value="--read-lang-def=${clocDefinitionsPath}" />
            <arg value="Source/Core/" />
            <arg value="Source/DataSources/" />
            <arg value="Source/Renderer/" />
            <arg value="Source/Scene/" />
            <arg value="Source/Widgets/" />
            <arg value="Source/Workers/" />
            <fileset id="clocFileSet" dir="Source/">
                <include name="Shaders/*.glsl" />
                <include name="Shaders/**/*.glsl" />
                <include name="main.js" />
            </fileset>
        </apply>
        <echo message="${line.separator}Specs:" />
        <exec executable="perl">
            <arg value="${clocPath}" />
            <arg value="--quiet" />
            <arg value="--progress-rate=0" />
            <arg value="--read-lang-def=${clocDefinitionsPath}" />
            <arg value="Specs/" />
        </exec>
    </target>
    <!-- target名稱checkForNode,nodejs環境檢查-->
    <target name="checkForNode">
        <!-- 執行node任務 node -version -->
        <exec executable="${nodePath}" failonerror="false" failifexecutionfails="false" resultproperty="node.exec.result">
            <arg value="--version" />
        </exec>
        <fail message="Node.js is required to run this part of the build.  Install from http://nodejs.org/">
            <condition>
                <not>
                    <equals arg1="${node.exec.result}" arg2="0" />
                </not>
            </condition>
        </fail>
    </target>

    <!-- 任務名稱combineJavaScript.create,合併全部js源文件 -->
    <target name="combineJavaScript.create">
        <!-- 設置相對路徑屬性,由於r.js不能處理windows的絕對路徑 -->
        <property name="relativeAlmondPath" location="${almondPath}" relative="true" basedir="${sourceDirectory}" />
        <property name="combineOutputDirectory" location="${buildDirectory}/combineOutput" />

        <!-- 建立合併的js存放目錄 -->
        <mkdir dir="${combineOutputDirectory}" />
        <property name="relativeCombineOutputDirectory" location="${combineOutputDirectory}" relative="true" basedir="${sourceDirectory}" />

        <!-- 調用combineJavaScript.combineCesium target,建立合併的js源文件    -->
        <antcall target="combineJavaScript.combineCesium" />

        <!--調用自定義任務generateStubs,生成stubs,指定生成路徑,和所需源文件等參數     -->
        <mkdir dir="${buildStubsDirectory}" />
        <generateStubs stuboutput="${buildStubsDirectory}/Cesium.js" pathsoutput="${buildStubsDirectory}/paths.js">
            <sourcefiles refid="cesiumJsFiles" />
        </generateStubs>

        <!-- 調用combineJavaScript.combineCesiumWorkers target,合併全部web workers,由於web worker 源文件須要單獨處理,不能和其餘js文件合併在一塊兒 -->
        <antcall target="combineJavaScript.combineCesiumWorkers" />

        <!-- 將合併的文件複製到相應目錄下,並在文件頭添加copyrightHeader.js文件的內容 -->
        <copy todir="${outputDirectory}">
            <fileset dir="${combineOutputDirectory}" />
            <filterchain>
                <concatfilter prepend="${sourceDirectory}/copyrightHeader.js" />
            </filterchain>
        </copy>
        <!-- 刪除中間文件夾${combineOutputDirectory} -->
        <delete dir="${combineOutputDirectory}" />

        <!-- 複製其餘資源(css、texture等)到${outputDirectory},不包括空文件夾和glsl。json等文件 -->
        <copy todir="${outputDirectory}" includeEmptyDirs="false">
            <fileset dir="${sourceDirectory}">
                <exclude name="**/*.js" />
                <exclude name="**/*.glsl" />
                <exclude name="**/.gitignore" />
                <exclude name="**/package.json" />
            </fileset>
        </copy>
    </target>

    <!-- 合併js源文件target -->
    <target name="combineJavaScript.combineCesium" depends="combineJavaScript.combineCesium.check" unless="no.combineCesium.create">
        <!-- 執行node r.js -o optiongs.......(模塊包裹wrap=true,css優化方式:標準壓縮,js文件優化方式:不壓縮代碼,skipModuleInsertion避免不是用define來定義模塊可是又用r.js來壓縮代碼產生的bug,壓縮main.js的模塊及其依賴項,輸出到out指定目錄) -->
        <exec executable="${nodePath}" dir="${sourceDirectory}">
            <arg value="${rjsPath}" />
            <arg value="-o" />
            <arg value="${rjsOptions}" />
            <arg value="pragmas.debug=${pragmas.debug}" />
            <arg value="optimize=${optimize}" />
            <arg value="baseUrl=." />
            <arg value="skipModuleInsertion=true" />
            <arg value="name=${relativeAlmondPath}" />
            <arg value="include=main" />
            <arg value="out=${relativeCombineOutputDirectory}/Cesium.js" />
        </exec>
    </target>

    <!-- 合併webwork源文件target -->
    <target name="combineJavaScript.combineCesiumWorkers" depends="combineJavaScript.combineCesiumWorkers.check" unless="no.combineCesiumWorkers.create">
        <!-- 建立獨立的web worker文件node r.js -o............ -->
        <apply executable="${nodePath}" dir="${sourceDirectory}" relative="true" force="true">
            <arg value="${rjsPath}" />
            <arg value="-o" />
            <arg value="${rjsOptions}" />
            <arg value="pragmas.debug=${pragmas.debug}" />
            <arg value="optimize=${optimize}" />
            <arg value="baseUrl=." />
            <arg value="skipModuleInsertion=true" />
            <arg value="wrap=false" />
            <srcfile prefix="include=" />
            <targetfile prefix="out=" />
            <globmapper from="*" to="${relativeCombineOutputDirectory}/*.js" />
            <mappedresources>
                <fileset dir="${sourceDirectory}">
                    <include name="Workers/cesiumWorkerBootstrapper.js" />
                    <include name="Workers/transferTypedArrayTest.js" />
                    <include name="ThirdParty/Workers/*.js" />
                </fileset>
                <chainedmapper>
                    <globmapper from="*.js" to="*" />
                </chainedmapper>
            </mappedresources>
        </apply>

        <!-- 建立合併的worker文件 -->
        <apply executable="${nodePath}" dir="${sourceDirectory}" relative="true" force="true">
            <arg value="${rjsPath}" />
            <arg value="-o" />
            <arg value="${rjsOptions}" />
            <arg value="optimize=${optimize}" />
            <arg value="pragmas.debug=${pragmas.debug}" />
            <arg value="baseUrl=." />

            <srcfile prefix="name=Workers/" />
            <targetfile prefix="out=" />
            <globmapper from="*" to="${relativeCombineOutputDirectory}/Workers/*.js" />
            <mappedresources>
                <fileset dir="${sourceDirectory}/Workers">
                    <include name="*.js" />
                    <exclude name="*.profile.js" />
                    <exclude name="cesiumWorkerBootstrapper.js" />
                    <exclude name="transferTypedArrayTest.js" />
                    <exclude name="createTaskProcessorWorker.js" />
                </fileset>
                <chainedmapper>
                    <flattenmapper />
                    <globmapper from="*.js" to="*" />
                </chainedmapper>
            </mappedresources>
        </apply>
    </target>

    <!-- 合併js文件前的檢查,若是指定的目標文件${outputDirectory}/Cesium.js與源文件cesiumJsFiles的引用文件集相比有更新的時間錯,則設置屬性no.combineCesium.create-->
    <target name="combineJavaScript.combineCesium.check">
        <uptodate property="no.combineCesium.create" targetfile="${outputDirectory}/Cesium.js">
            <srcresources refid="cesiumJsFiles" />
        </uptodate>
    </target>

    <target name="combineJavaScript.combineCesiumWorkers.check">
        <uptodate property="no.combineCesiumWorkers.create" targetfile="${outputDirectory}/Cesium.js">
            <srcfiles refid="cesiumWorkersJsFileSet" />
        </uptodate>
    </target>

    <!-- 合併js源文件,而且不壓縮代碼target-->
    <target name="combineJavaScript.createUnminified">
        <antcall target="combineJavaScript.create">
            <param name="optimize" value="none" />
            <param name="outputDirectory" value="${unminifiedOutputDirectory}" />
        </antcall>
    </target>

    <!-- copy的條件:${build.minification}爲true而且設置了build.debugUnminified,就設置屬性combineJavascript.noCopy-->
    <target name="combineJavascript.checkCopy">
        <condition property="combineJavascript.noCopy">
            <or>
                <istrue value="${build.minification}" />
                <isset property="build.debugUnminified" />
            </or>
        </condition>
    </target>

    <!-- 複製合併的js文件,依賴於copy檢查target-->
    <target name="combineJavaScript.copyUnminified" depends="combineJavascript.checkCopy" unless="${combineJavascript.noCopy}">
        <copy todir="${buildOutputDirectory}">
            <fileset dir="${unminifiedOutputDirectory}" />
        </copy>
    </target>

    <!-- 合併js文件而且壓縮代碼,條件是${build.minification}爲ture-->
    <target name="combineJavaScript.createMinified" if="${build.minification}">
        <!-- 調用combineJavaScript.create,傳入參數uglify2(使用uglify2壓縮代碼),輸出目錄${buildOutputDirectory}-->
        <antcall target="combineJavaScript.create">
            <param name="optimize" value="uglify2" />
            <param name="outputDirectory" value="${buildOutputDirectory}" />
        </antcall>
    </target>

    <!-- 合併js文件,依賴於node環境檢查、建立沒有壓縮的js代碼,複製合併代碼等target-->
    <target name="combineJavaScript" depends="checkForNode,combineJavaScript.createUnminified,combineJavaScript.copyUnminified,combineJavaScript.createMinified" />

    <!-- 壓縮CSS。依賴於nodejs環境檢查-->
    <target name="minifyCSS" depends="checkForNode">
        <!-- copy任務:複製${sourceDirectory}目錄下的css到${buildOutputDirectory}目錄下,不包括空文件夾,若是存在則覆蓋-->
        <copy todir="${buildOutputDirectory}" includeEmptyDirs="false" overwrite="true">
            <fileset dir="${sourceDirectory}">
                <include name="**/*.css" />
            </fileset>
        </copy>
        <!-- 壓縮任務:node r.js -o....-->
        <apply executable="${nodePath}" dir="${buildOutputDirectory}" relative="true">
            <arg value="${rjsPath}" />
            <arg value="-o" />
            <arg value="${rjsOptions}" />
            <srcfile prefix="cssIn=" />
            <targetfile prefix="out=" />
            <identitymapper />
            <fileset dir="${buildOutputDirectory}">
                <include name="**/*.css" />
            </fileset>
        </apply>
    </target>

    <!-- 操做系統檢查:若是系統是windows,則設置屬性os.windows-->
    <condition property="os.windows">
        <os family="windows" />
    </condition>

    <!-- 若是系統不是windows,執行的npmInstall任務-->
    <target name="npmInstall.nonWindows" unless="os.windows">
        <!-- npm install(依賴於package.json)-->
        <exec executable="${npmPath}" dir="${basedir}" failonerror="true">
            <arg value="install" />
        </exec>
    </target>

    <!-- 若是系統是windows,執行的npmInstall-->
    <target name="npmInstall.windows" if="os.windows">
        <!-- /c npm install-->
        <exec executable="cmd" dir="${basedir}" failonerror="true">
            <arg value="/c" />
            <arg value="${npmPath}" />
            <arg value="install" />
        </exec>
    </target>

    <!-- npmInstall 依賴於系統檢查-->
    <target name="npmInstall" depends="npmInstall.windows,npmInstall.nonWindows" />

    <!-- 生成文檔,依賴於npminstall-->
    <target name="generateDocumentation" depends="checkForNode,npmInstall" description="Generates HTML documentation.">
        <!-- 執行命令:node node_modules/jsdoc/jsdoc.js conf....-->
        <exec executable="${nodePath}" dir="${basedir}" failonerror="true">
            <env key="CESIUM_VERSION" value="${version}" />
            <arg value="node_modules/jsdoc/jsdoc.js" />
            <arg line="--configure Tools/jsdoc/conf.json" />
        </exec>

        <!-- copy任務:把${documentationImagesDirectory}目錄複製到${buildDocumentationImagesDirectory}目錄-->
        <copy todir="${buildDocumentationImagesDirectory}">
            <fileset dir="${documentationImagesDirectory}" />
        </copy>
    </target>

    <!-- 運行server,依賴於nodejs環境檢查,npminstall等target-->
    <target name="runServer" depends="checkForNode,npmInstall" description="Runs a local web server.">
        <echo>The local web server can also be launched directly by running: node server.js</echo>
        <!-- 條件判斷:${runServer.public}爲true,澤設置屬性runServer.arg.public值爲public -->
        <condition property="runServer.arg.public" value="--public" else="">
            <istrue value="${runServer.public}" />
        </condition>
        <!-- 執行命令啓動server:node server.js ${runServer.arg.public} port ${runServer.port} -->
        <exec executable="${nodePath}" dir="${basedir}" failonerror="true">
            <arg value="server.js" />
            <arg line="${runServer.arg.public}" />
            <arg line="--port ${runServer.port}" />
        </exec>
    </target>

    <!-- 啓動server,public爲true -->
    <target name="runPublicServer" description="Runs a public web server.">
        <antcall target="runServer">
            <param name="runServer.public" value="true" />
        </antcall>
    </target>

    <!-- 建立APPs,調用buildCesiumViewer target -->
    <target name="buildApps" description="Create built versions of all example applications.">
        <antcall target="buildCesiumViewer" />
    </target>

    <!-- 建立cesiemviewer 依賴於nodejs環境檢查 -->
    <target name="buildCesiumViewer" depends="checkForNode">
        <!-- 設置路徑屬性 -->
        <property name="cesiumViewerDirectory" location="Apps/CesiumViewer" />
        <property name="cesiumViewerOutputDirectory" location="${buildDirectory}/Apps/CesiumViewer" />
        <mkdir dir="${cesiumViewerOutputDirectory}" />
        <property name="relativeCesiumViewerOutputDirectory" location="${cesiumViewerOutputDirectory}" relative="true" basedir="${cesiumViewerDirectory}" />

        <!-- 壓縮js代碼,生成${relativeCesiumViewerOutputDirectory}/CesiumViewerStartup.js -->
        <exec executable="${nodePath}" dir="${cesiumViewerDirectory}">
            <arg value="${rjsPath}" />
            <arg value="-o" />
            <arg value="${rjsOptions}" />
            <arg value="optimize=uglify2" />
            <arg value="pragmas.debug=false" />
            <arg value="mainConfigFile=../Apps/CesiumViewer/CesiumViewerStartup.js" />
            <arg value="name=CesiumViewerStartup" />
            <arg value="out=${relativeCesiumViewerOutputDirectory}/CesiumViewerStartup.js" />
        </exec>

        <!-- 將copyright頭添加到CesiumViewerStartup.js -->
        <copy file="${cesiumViewerOutputDirectory}/CesiumViewerStartup.js" tofile="${cesiumViewerOutputDirectory}/CesiumViewerStartup.js.tmp">
            <filterchain>
                <concatfilter prepend="${sourceDirectory}/copyrightHeader.js" />
            </filterchain>
        </copy>
        <!-- 重命名 -->
        <move file="${cesiumViewerOutputDirectory}/CesiumViewerStartup.js.tmp" tofile="${cesiumViewerOutputDirectory}/CesiumViewerStartup.js" />

        <!-- 壓縮CSS -->
        <exec executable="${nodePath}" dir="${cesiumViewerDirectory}">
            <arg value="${rjsPath}" />
            <arg value="-o" />
            <arg value="${rjsOptions}" />
            <arg value="cssIn=CesiumViewer.css" />
            <arg value="out=${relativeCesiumViewerOutputDirectory}/CesiumViewer.css" />
        </exec>

        <!-- 複製${cesiumViewerDirectory}目錄下的其餘資源,圖片、html等 到${cesiumViewerOutputDirectory}目錄下-->
        <copy todir="${cesiumViewerOutputDirectory}">
            <fileset dir="${cesiumViewerDirectory}">
                <exclude name="*.js" />
                <exclude name="*.css" />
            </fileset>
        </copy>

        <!-- 複製requirejs -->
        <copy file="${requirejsPath}/require.min.js" tofile="${cesiumViewerOutputDirectory}/require.js" />

        <!-- 複製assets、webworker文件、css等到 ${cesiumViewerOutputDirectory}-->
        <copy todir="${cesiumViewerOutputDirectory}" includeemptydirs="false">
            <fileset dir="${buildOutputDirectory}">
                <include name="Assets/**" />
                <include name="Workers/**" />
                <include name="ThirdParty/Workers/**" />
                <include name="Widgets/**" />
                <exclude name="Widgets/**/*.css" />
            </fileset>
            <fileset dir="${buildOutputDirectory}">
                <include name="Widgets/InfoBox/InfoBoxDescription.css" />
            </fileset>
        </copy>

        <!-- 複製webconfig -->
        <copy file="${basedir}/web.config" tofile="${cesiumViewerOutputDirectory}/web.config" />

        <!-- 字符替換:把${cesiumViewerOutputDirectory}下的CesiumViewerStartup.js全部../../Source和../../ThirdParty/requirejs-2.1.9替換爲. -->
        <replace dir="${cesiumViewerOutputDirectory}" summary="true">
            <replacefilter token="../../Source" value="." />
            <replacefilter token="../../ThirdParty/requirejs-2.1.9" value="." />
            <include name="CesiumViewerStartup.js" />
        </replace>

        <!-- 字符替換(html引用的路徑): ${cesiumViewerOutputDirectory}下的index.html的../../ThirdParty/requirejs-2.1.9替換爲.-->
        <replace dir="${cesiumViewerOutputDirectory}" summary="true">
            <replacefilter token="../../ThirdParty/requirejs-2.1.9" value="." />
            <include name="index.html" />
        </replace>

        <!-- 字符替換(css路徑): ${cesiumViewerOutputDirectory}下的全部css文件的../../Source/替換爲空-->
        <replace dir="${cesiumViewerOutputDirectory}" summary="true">
            <replacefilter token="../../Source/" value="" />
            <include name="*.css" />
        </replace>
    </target>
</project>
View Code
相關文章
相關標籤/搜索