0

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

这样做很容易:

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

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

4

2 回答 2

1

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

如果是这种情况,您可以创建一个知道如何编译这些项目的单个 build.xml,并制作一个找到所有子目录的顶级构建脚本,然后在每个子目录中调用公共构建脚本。 Subant 是为此量身定制的,不需要神奇的 C# 程序即可在每个目录中生成脚本。

于 2012-12-03T16:24:56.893 回答
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); 
        } 
    } 
}
于 2012-12-03T02:35:13.533 回答