2012-12-03 3 views
0

모든 C#, C++, & VB.NET 샘플이 올바르게 컴파일되도록 테스트해야했습니다. 각 파일을 나열하지 않고 모든 파일을 빌드해야합니다. 각각의 목록을 작성하면 누군가가 새로운 것을 추가하는 것을 잊어 버리면 (언젠가 발생합니다), 명시 적 호출은이를 놓칠 것입니다. 모든 .sln 파일을 처리하면 항상 모든 것을 얻습니다. 이렇게디렉터리 아래에 모든 솔루션 (.SLN) 파일을 작성하는 방법

은 매우 간단합니다 :

  1. 깨끗한 VM에 샘플을 설치 (우리는 각 테스트 실행을 위해 다시 스냅 샷으로 되돌아가므로).
  2. 설치된 모든 .sln 파일을 호출하는 BuildAll.proj (MSBuild) 파일을 만듭니다.
  3. 사용 MSBuild에서 생성 된 BuildAll.proj는

2 단계는 BuildAll.proj 파일을 생성 할 수있는 수단을 필요로 파일을 실행합니다. 하위 디렉터리 아래에서 모든 .sln 파일을 실행하거나 모든 기본 .slnl 파일을 호출하는 BuildAll.proj를 만들도록 MSBuild에 지시 할 수있는 방법이 있습니까?

답변

0

디렉터리 아래에있는 모든 .sln 파일을 호출하는 BuildAll.proj를 만드는 프로그램을 작성 했으므로 찾을 수 없습니다. 전체 솔루션은 Windward Wrocks (내 블로그)입니다.

코드는 다음과 같습니다

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


namespace BuildDotNetTestScript 
{ 
    /// <summary> 
    /// Builds a test script to compile all .sln files under the directory in. 
    /// </summary> 
    public class Program 
    { 
     private static readonly XNamespace xmlns = "http://schemas.microsoft.com/developer/msbuild/2003"; 


     private enum VS_VER 
     { 
      VS_2005, 
      VS_2008, 
      VS_2010, 
      NONE 
     } 


     private static VS_VER vsVersion = VS_VER.NONE; 


     /// <summary> 
     /// Build TestAll.proj for all .sln files in this directory and sub-directories. 
     /// </summary> 
     /// <param name="args">Optional: [-VS2005 | -VS2008 | -VS2010] TestAll.proj root_folder</param> 
     public static void Main(string[] args) 
     { 


      int indexArgs = 0; 
      if (args.Length >= 1 && args[0][0] == '-') 
      { 
       indexArgs = 1; 
       switch (args[0].ToUpper().Trim()) 
       { 
        case "-VS2005": 
         vsVersion = VS_VER.VS_2005; 
         break; 
        case "-VS2008": 
         vsVersion = VS_VER.VS_2008; 
         break; 
        case "-VS2010": 
         vsVersion = VS_VER.VS_2010; 
         break; 
        default: 
         Console.Error.WriteLine("Only options are -VS2005, -VS2008, or -VS2010"); 
         Environment.Exit(1); 
         return; 
       } 
      } 


      string projFile = Path.GetFullPath(args.Length > indexArgs ? args[indexArgs] : "TestAll.proj"); 
      string rootDirectory = 
       Path.GetFullPath(args.Length > indexArgs + 1 ? args[indexArgs + 1] : Directory.GetCurrentDirectory()); 
      Console.Out.WriteLine(string.Format("Creating project file {0}", projFile)); 
      Console.Out.WriteLine(string.Format("Root directory {0}", rootDirectory)); 


      XDocument xdoc = new XDocument(); 
      XElement elementProject = new XElement(xmlns + "Project"); 
      xdoc.Add(elementProject); 
      elementProject.Add(new XAttribute("DefaultTargets", "compile")); 
      elementProject.Add(new XAttribute("ToolsVersion", "3.5")); 


      XElement elementPropertyGroup = new XElement(xmlns + "PropertyGroup"); 
      elementProject.Add(elementPropertyGroup); 
      XElement elementDevEnv = new XElement(xmlns + "devenv"); 
      elementPropertyGroup.Add(elementDevEnv); 
      elementDevEnv.Value = "devenv.exe"; 


      XElement elementTarget = new XElement(xmlns + "Target"); 
      elementProject.Add(elementTarget); 
      elementTarget.Add(new XAttribute("Name", "compile")); 


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


      Console.Out.WriteLine("writing project 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 AddSlnFiles(XElement elementTarget, string rootDirectory, string folder) 
     { 


      // add .sln files 
      foreach (string fileOn in Directory.GetFiles(folder, "*.sln")) 
      { 
       // .../JS/... is VS2005 
       bool isJSharp = fileOn.ToUpper().Replace('\\', '/').Contains("/JS/"); 
       bool versionMatch = true; 
       switch (vsVersion) 
       { 
        case VS_VER.VS_2005: 
         if ((!fileOn.ToUpper().Contains("VS2005")) && (! isJSharp)) 
          versionMatch = false; 
         break; 
        case VS_VER.VS_2008: 
         if (isJSharp || !fileOn.ToUpper().Contains("VS2008")) 
          versionMatch = false; 
         break; 
        case VS_VER.VS_2010: 
         if (isJSharp || !fileOn.ToUpper().Contains("VS2010")) 
          versionMatch = false; 
         break; 
        default: 
         if (isJSharp || fileOn.ToUpper().Contains("VS2005") || fileOn.ToUpper().Contains("VS2008") || fileOn.ToUpper().Contains("VS2010")) 
          versionMatch = false; 
         break; 
       } 
       if (!versionMatch) 
        continue; 


       string command = string.Format("\"$(devenv)\" \"{0}\" /Rebuild", Path.GetFileName(fileOn)); 
       XElement elementExec = new XElement(xmlns + "Exec"); 
       elementExec.Add(new XAttribute("Command", command)); 


       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) 
        elementExec.Add(new XAttribute("WorkingDirectory", workingFolder)); 
       elementTarget.Add(elementExec); 
      } 


      // look in sub-directories 
      foreach (string subDirectory in Directory.GetDirectories(folder)) 
       AddSlnFiles(elementTarget, rootDirectory, subDirectory); 
     } 
    } 
} 
1

이 PowerShell 스크립트는 모든 NuGet 패키지를 복원하고 현재 디렉토리에 재귀 적으로 모든 솔루션을 구축 할 것입니다. nuget.exe 및 msbuild가 PATH에 있는지 확인하십시오.

$baseDir = (Get-Item -Path ".\" -Verbose).FullName 
$items = Get-ChildItem -Path $baseDir -Include *.sln -Recurse 
foreach ($item in $items){ 
    nuget restore $item 
    msbuild $item 
} 
관련 문제