並不是說它們比其他替代方案更好,但它們是一個標準,而且它們是其他任務中持續使用的標準。程式碼在符合這些標準之前,不會納入資料庫中。
如果您正在撰寫供個人或組織使用的任務,您可以自由使用任何您喜歡的樣式。但使用 Sun Java 樣式將有助於您熟悉其他 Ant 來源,這可能很重要。
一個重要的規則是「沒有標籤」。改用四個空格。不是兩個,不是八個,是四個。即使您的編輯器被設定為有四個空格的標籤,許多其他編輯器都沒有。空格在編輯器和平台之間具有更高的相容性。一些 IDE(JEdit)可以突出顯示標籤,以防止您意外插入標籤。
在主 ant 目錄中有一個 Ant 建置檔案 check.xml,它會在 Ant 的原始碼中執行 checkstyle。
Ant 1.x 任務在屬性命名方面非常不一致——有些任務使用 source,有些使用 src。以下是首選屬性名稱的清單
failonerror | boolean 用於控制執行失敗是否應擲回 BuildException 或僅列印錯誤。參數驗證失敗應始終擲回錯誤,無論此標誌如何。 |
destdir | 輸出的目標目錄 |
destfile | 輸出的目標檔案 |
srcdir | 來源目錄 |
srcfile | 來源檔案 |
是的,這是一個非常簡短的清單。至少嘗試與核心任務保持模糊的一致性。
Ant 中另一個常見的重複使用機制是讓一個任務建立和設定另一個任務。這相當簡單。Ant 的 API 中有可用的設施,讓任務可以由它們熟悉的名稱(「java」、「exec」等)實例化。建議您不要使用這種方法,因為使用者覆寫名稱以指向完全不同的類別的可能性非常真實。使用直接建構函式呼叫(或反射)來實例化您的子任務。自 Ant 1.6.3 以來,您可以呼叫 org.apache.tools.ant.Task#bindToOwner()
將輔助任務「遮罩」為其父任務。
有問題的是依賴於較新 Java 版本中功能的程式碼,例如 JDK 7 中的 java.nio.file.Path。也要注意舊類別中新增的方法;任何程式碼都不能直接使用這些方法,而且仍然可以在較舊的系統上編譯和執行。如果要使用現有類別中的新方法,則必須透過反射使用它,並以某種方式處理 NoSuchMethodException。
如果程式碼根本無法在較舊版本的 Java 上執行,該怎麼辦?可能會發生這種情況。將任務設為選用任務,並透過修改 build.xml 將編譯限制在較新的 JDK(或更新版本)上,這可能會不錯。更好的方法是使用反射在執行時連結到類別。
類似的考量也適用於新的語言功能,例如 JDK 7 字串切換陳述式。
我們不能做的一件事是移動現有的任務或刪除它們。請記住,Ant 有一個 Java API 以及一個 XML 語言。我們不想中斷那個 API,或任何繼承現有 Ant 任務的內容。重構時,您需要在原始類別所在的位置保留門面,這樣現有的程式碼才不會中斷。
一組寫得很好的測試案例會在開發過程中中斷 Ant 任務,直到程式碼實際完成。稍後出現的每個錯誤都應該新增一個測試案例來展示問題並修復它。
測試案例是開發過程中測試任務的好方法。在 ant 原始碼樹中呼叫 'build run-test',將執行所有 ant 測試,以驗證您的變更不會中斷任何內容。若要測試單一任務,請使用一次性 ant run-single-test -Dtestcase=${testname}
,其中 ${testname}
是您的測試類別名稱。
測試案例也由提交者用於驗證變更和修補程式是否符合它們的說法。如果您有測試案例,它會大幅提升您的可信度。準確地說,我們討厭沒有測試案例的提交,因為這表示我們必須自己撰寫它們。只有在我們需要任務或它被認為對許多使用者來說至關重要時,才會執行此操作。
還要記住,Ant 1.x 被設計為在 Java 1.2 上編譯和執行,因此您應該在 Java 1.2 以及您使用的任何後續版本上進行測試。您應該能夠從 Sun 下載舊的 SDK 以達到此目的。
最後,在開始開發您的專案之前和之後,執行完整的 build test
,以確保您沒有意外中斷其他任何內容。
您可以使用 proposal/xdocs 中的 xdocs 內容,從來源的 javadoc 自動產生您的文件頁面;這讓生活更輕鬆,並且會讓轉換到由 xdoclet 產生的完整文件建置程序變得非常簡單。
這很重要。
Apache 相當自由放任的授權目前不認為與自由軟體基金會的 GPL 或較寬鬆的 GPL(Gnu 專案)相容。這些授權有更嚴格的條款「copyleft」,而 Apache 授權中沒有這些條款。這允許個人和組織在 Apache 函式庫和來源之上建置商業和閉源應用程式。
由於 Gnu GPL 授權會立即延伸涵蓋任何它被納入其中的較大型應用程式(或在 LGPL 的情況下是函式庫),因此 Ant 團隊無法將任何基於 GPL 或 LGPL 來源的任務納入 Ant 程式碼庫。您可以自由提交,但它會被禮貌而堅定地拒絕。
如果您透過 import
或反射連結到 GPL 或 LGPL 函式庫,您的任務必須在相同的條款下授權。因此連結到 (L)GPL 程式碼的任務無法進入 Apache 管理的程式碼庫。呼叫此類程式碼的任務可以使用「exec」或「java」任務來執行程式,因為您此時只是執行它們,而不是連結到它們。
即使我們無法將您的任務納入 Apache 程式碼庫,我們仍然可以指出您託管它的位置;只要提交一個指向您的任務的 xdocs/external.html 的 diff 即可。
如果您的任務直接連結到專有程式碼,我們有不同的問題:建置任務真的非常困難。請使用反射。
如果您正在考慮撰寫任務,將您的想法張貼到清單上會很有幫助,您會得到其他人的見解,也許還有一些半寫好的任務可以執行基礎工作,所有這些都不需要撰寫一行程式碼。
您可以使用下列任一種方法建立您的修補程式檔(提交者建議使用第一種)
使用 Ant 產生一個 patch 檔案給 Ant
ant -f patch.xml這將會建立一個名為 patch.tar.gz 的檔案,其中包含已修改檔案的統一 diff,以及已新增的檔案。檢閱檔案以確認完整性與正確性。建議採用此方法,因為它標準化了 patch 檔案的建構方式。它也能消除遺漏提交構成 patch 一部分的新檔案的可能性。
現有檔案的 patch 應使用 svn diff filename
產生,並將輸出儲存到檔案中。如果您要取得目錄中多個檔案所做的變更,只需使用 svn diff
。然後,對 patch 檔案以及您已新增的任何新檔案進行 Tar 和 GZip 壓縮。
patch 應作為郵件附件寄出,郵件標題為 [PATCH],主旨中有一個獨特的單行摘要。檔案名稱/工作和變更通常就足夠了。將變更包含為附件非常重要,因為太多郵件程式會重新格式化貼上的文字,這會破壞 patch。
然後,您等待其中一位提交者提交 patch,如果認為這樣做是適當的。錯誤修正會很快進行,其他變更通常會在進行(可能已修改的)提交之前引發一些討論。
新的提交應以 [SUBMIT] 進行。郵件守護程式會拒絕任何超過 100KB 的郵件,因此應將任何大型更新壓縮。如果您的提交大於此大小,何不將其拆分成不同的工作。
我們也希望將提交新增到 bugzilla,這樣它們就不會遺失。請先使用有意義的名稱提交報告,然後將檔案新增為附件進行提交。請使用 CVS diff 檔案!
如果您在幾週後沒有收到任何消息,請提醒郵件清單。有時,非常好的提交會在其他問題的雜訊中遺失。在產品的新點版本發布之前尤其如此。在那個時候,除了錯誤修正之外的任何事情都傾向於被忽略。