-
ant
例如:
<target name="callProjectB"> <echo message="In projectA calling projectB"/> <ant antfile="subfile/projectB.xml" /> </target>
說明:項目A通過ant命令執行項目B
屬性:
(1) antfile : 指定要執行的構建文件名稱,可以包含路徑信息。
(2) dir : 指定構建文件所在的目錄,相當於指定了要執行的構建文件的basedir屬性,如果dir屬性沒有設置,會以當前構建文件的根目錄作為ant任務的根目錄。
(3) Target:指定要執行的構建文件要執行的target。例如

<project name="porjectA" default="callProjectB"> <target name="callProjectB"> <echo message="In projectA calling projectB"/> <ant antfile="subfile/projectB.xml" target=" target2"/> </target> </project>
(4) output :指定ant工具執行時的信息輸出,可定位到控制台或者文件中,當定位到文件中相當於在命令行指定了-logfile filename。
<ant antfile="subfile/projectB.xml" output="out.log"/>
(5) inheritAll:如果設定為true,那么被調用的構建文件的project元素中可使用當前project中的reference任務。Reference任務的作用是吧當前屬性復制到被調用的ant project中使用,reference任務包含兩個屬性:
refid :代表當前project中的屬性id。
Torefid :用於指定在被調用的project中的引用id。
例如:
<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>
通過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>
這個例子的作用是把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>
這個例子的作用是把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>