【问题标题】:How can I build all build.xml (.java) files under a directory如何在目录下构建所有 build.xml (.java) 文件
【发布时间】:2012-12-04 00:24:56
【问题描述】:

我们需要自动测试我们发布的所有 Java 示例是否都能正确编译。我们需要它来构建所有文件而不列出每个文件。列出每一个意味着如果有人忘记添加一个新的(这将在某天发生),显式调用将错过它。通过遍历所有 build.xml 文件,我们总能得到一切。

这样做很容易:

  1. 在干净的 VM 上安装示例(我们在每次测试运行时恢复为快照)。
  2. 创建一个调用所有已安装的 build.xml 文件的 build.xml 文件。
  3. 使用ant运行生成的build.xml

第 2 步需要一种方法来生成 build.xml 文件。有没有办法告诉 ant 运行子目录下的所有 build.xml 文件,或者创建一个调用所有底层 build.xml 文件的 build.xml?

【问题讨论】:

    标签: ant build subdirectory


    【解决方案1】:

    听起来您想做的是为许多(希望)遵循标准布局模式的子项目运行相同的构建过程。

    如果是这种情况,您可以创建一个知道如何编译这些项目的 build.xml,并制作一个顶级构建脚本来查找所有子目录,然后在每个子目录中调用公共构建脚本。 Subant was taylor-made for this,并且不需要神奇的 C# 程序在每个目录中生成脚本。

    【讨论】:

      【解决方案2】:

      我们找不到任何东西,所以我们编写了一个程序来创建一个 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); 
              } 
          } 
      }
      

      【讨论】:

        猜你喜欢
        • 2011-02-12
        • 1970-01-01
        • 1970-01-01
        • 2018-07-03
        • 2014-09-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-23
        相关资源
        最近更新 更多