0

出荷するすべてのJavaサンプルが正しくコンパイルされるようにテストを自動化する必要がありました。それぞれをリストせずにすべてのファイルをビルドするために必要です。それぞれをリストするということは、誰かが新しいものを追加するのを忘れた場合(いつか起こるでしょう)、明示的な呼び出しはそれを見逃すことを意味します。すべてのbuild.xmlファイルをウォークすることで、常にすべてを取得できます。

これを行うのは非常に簡単です。

  1. クリーンなVMにサンプルをインストールします(テスト実行ごとにスナップショットに戻します)。
  2. インストールされているすべてのbuild.xmlファイルを呼び出すbuild.xmlファイルを作成します。
  3. antを使用して、生成されたbuild.xmlを実行します

ステップ2には、build.xmlファイルを生成する手段が必要です。サブディレクトリの下にあるすべてのbuild.xmlファイルを実行するようにantに指示する方法、または基になるすべてのbuild.xmlファイルを呼び出すbuild.xmlを作成する方法はありますか?

4

2 に答える 2

1

あなたがやりたいことは、(うまくいけば)標準のレイアウトパターンに従ういくつかのサブプロジェクトに対して同じビルドプロセスを実行することのようです。

その場合は、それらのプロジェクトをコンパイルする方法を知っている単一のbuild.xmlを作成し、すべてのサブディレクトリを検索するトップレベルのビルドスクリプトを作成してから、それぞれで共通のビルドスクリプトを呼び出すことができます。 Subantはこのためにテーラーメイドであり、各ディレクトリにスクリプトを生成するために魔法のC#プログラムを必要としません。

于 2012-12-03T16:24:56.893 に答える
0

何も見つからなかったので、ディレクトリの下にあるすべてのbuild.xmlファイルを呼び出すbuild.xmlを作成するプログラムを作成しました。完全な解決策はWindwardWrocks(私のブログ)にあります。

コードは次のとおりです(はい、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 に答える