2012-12-03 52 views
0

我們需要自動化測試,以便我們發佈的所有Java樣本都能夠正確編譯。我們需要它來構建沒有我們每個列表的所有文件。列出每一個意味着如果有人忘記添加一個新的(這將在某一天發生),顯式調用將錯過它。通過遍歷所有的build.xml文件,我們總能得到一切。如何在目錄下構建所有build.xml(.java)文件

這樣做是很容易的:

  1. 在一個乾淨的虛擬機安裝樣品(即我們恢復到快照每個測試運行)。
  2. 創建一個調用所有build.xml文件的build.xml文件。
  3. 使用ant運行生成的build.xml

步驟2需要以生成build.xml文件的裝置。有沒有辦法告訴ant在子目錄下運行所有​​的build.xml文件,或者創建一個調用所有底層build.xml文件的build.xml文件?

回答

1

這聽起來像你想要做的是運行一些子項目的相同的生成過程(希望)遵循標準的佈局模式。

如果是這種情況,您可以創建一個知道如何編譯這些項目的build.xml,並創建一個頂級構建腳本來查找所有子目錄,然後在每個腳本中調用通用構建腳本。 Subant was taylor-made for this,並且不需要一個神奇的C#程序在每個目錄中生成腳本。

0

我們找不到任何東西,所以我們編寫了一個程序,該程序創建了一個調用目錄下所有build.xml文件的build.xml。完整的解決方案是在Windward Wrocks(我的博客)。

的代碼是(是的,用C#創建一個Java的編譯文件):

using System; 
using System.IO; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 


namespace BuildJavaTestScript 
{ 
    public class Program 
    { 
     /// <summary> 
     /// Build build.xml for all build.xml files in sub-directories. 
     /// </summary> 
     /// <param name="args">Optional: build.xml root_folder</param> 
     public static void Main(string[] args) 
     { 
      string projFile = Path.GetFullPath(args.Length > 0 ? args[0] : "build.xml"); 
      string rootDirectory = Path.GetFullPath(args.Length > 1 ? args[1] : Directory.GetCurrentDirectory()); 
      Console.Out.WriteLine(string.Format("Creating build file {0}", projFile)); 
      Console.Out.WriteLine(string.Format("Root directory {0}", rootDirectory)); 


      XDocument xdoc = new XDocument(); 
      XElement elementProject = new XElement("project"); 
      xdoc.Add(elementProject); 
      elementProject.Add(new XAttribute("name", "BuildAll")); 
      elementProject.Add(new XAttribute("default", "compile")); 


      XElement elementTarget = new XElement("target"); 
      elementProject.Add(elementTarget); 
      elementTarget.Add(new XAttribute("name", "compile")); 


      XElement elementEcho = new XElement("echo"); 
      elementTarget.Add(elementEcho); 
      elementEcho.Add(new XAttribute("message", "Build All: jdk = ${java.home}, version = ${java.version}")); 


      // add .sln files - recursively 
      AddBuildXmlFiles(elementTarget, rootDirectory, rootDirectory); 


      Console.Out.WriteLine("writing build file to disk"); 
      // no BOM 
      using (var writer = new XmlTextWriter(projFile, new UTF8Encoding(false))) 
      { 
       writer.Formatting = Formatting.Indented; 
       xdoc.Save(writer); 
      } 


      Console.Out.WriteLine("all done"); 
     } 


     private static void AddBuildXmlFiles(XElement elementTarget, string rootDirectory, string folder) 
     { 


      // add build.xml files 
      foreach (string fileOn in Directory.GetFiles(folder, "build.xml")) 
      { 
       string filename = Path.GetFileName(fileOn); 
       string workingFolder; 
       if (folder.StartsWith(rootDirectory)) 
       { 
        workingFolder = folder.Substring(rootDirectory.Length).Trim(); 
        if ((workingFolder.Length > 0) && (workingFolder[0] == Path.DirectorySeparatorChar || workingFolder[0] == Path.AltDirectorySeparatorChar)) 
         workingFolder = workingFolder.Substring(1); 
       } 
       else 
        workingFolder = folder; 
       if (workingFolder.Length == 0) 
        continue; 


       XElement elementExec = new XElement("ant"); 
       elementExec.Add(new XAttribute("dir", workingFolder)); 
       elementExec.Add(new XAttribute("antfile", filename)); 
       elementTarget.Add(elementExec); 
      } 


      // look in sub-directories 
      foreach (string subDirectory in Directory.GetDirectories(folder)) 
       AddBuildXmlFiles(elementTarget, rootDirectory, subDirectory); 
     } 
    } 
} 
相關問題