2017-01-03 7 views
0

かなり大きなC++コードベースのソリューションファイルに既に存在する情報を活用する適切な方法を見つけようとしています。ソリューション上でmsbuildを使用していくつかのプロジェクトでカスタムターゲットを呼び出す

私が解決しようとしている問題は、ソリューション内のいくつかのプロジェクトファイルで外部スクリプトを呼び出すことですが、ソリューションと単一プロジェクトファイルで指定された既に存在する依存関係を観察することです。

私のプロジェクトファイルの1つにカスタムターゲットを追加し、vcxprojファイルで/ t:{TargetName}コマンドを使用してmsbuildを使用して、上記の(python)スクリプトを呼び出すことに成功しました。

このスクリプトを呼び出す必要があるすべてのプロジェクトファイルにこのターゲットを追加し、その後、正しい順序でmsbuildをそれぞれ呼び出すことができましたが、これはソリューションが知っている依存関係を活用する目的に反するものです。

カスタムターゲットを使用してソリューションを呼び出すことはできません(このような他のスタックオーバーフローに関する質問では、Invoke Custom MSBuild Target on Solution File)。

一方、スクリプトターゲットを呼び出すだけでビルドコマンドを呼び出すことに依存しないようにしたいので、PostやPreBuildターゲットを追加するという回答の中に提案された回避策を使用することはできません。

msbuildとカスタムターゲットのルートを経由せずに依存関係を使用する他の方法はありますか?または私の目的に役立つ別の回避策がありますか?

答えて

0

MSBuildのカスタムターゲットのルートを移動することなく、依存関係を使用して、任意の他の方法はありますか、私の目的を果たすことができ、他の回避策はありますか?

あなたがプログラムでSLNを構築することができ、ここではあなたの参照のためのC#を使用してコンソールアプリです。

using Microsoft.Build.Construction; 
using Microsoft.Build.Evaluation; 
using Microsoft.Build.Framework; 
using Microsoft.Build.Logging; 
using System; 

namespace LoadAllProject 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      ILogger logger = new ConsoleLogger(); 
      string solutionPath = @"D:\Project\Msbuild\CppApp5\CppApp5.sln"; 
      var solutionFile = SolutionFile.Parse(solutionPath); 
      foreach (var item in solutionFile.ProjectsInOrder) 
      { 
       Project project = ProjectCollection.GlobalProjectCollection.LoadProject(item.AbsolutePath); 
       project.SetGlobalProperty("Configuration", "Debug"); 
       if (project.GetPropertyValue("RootNamespace") == "CppApp5") 
       { 
        project.Build(new[] { "Build", "Yourcustomtarget" }, new[] { logger }); 
       } 
       else 
       { 
        project.Build(new[] { "Build" }, new[] { logger }); 
       } 
      } 
      Console.ReadKey(); 
     } 
    } 
} 
+0

ちょっと変わっても、カスタムターゲットが指定されているすべてのプロジェクトのスクリプトを呼び出す際にこれを使うようにしました。あなたはタンクク。しかし、ソリューションファイルの依存関係を使用する大きな理由の1つは、いくつかのプロジェクト(依存関係のないプロジェクト)の実行を並列化できるようにすることです。私は、すべてのプロジェクトに「すべての依存関係が完了するとすぐに」実行するようにどのように指示するのかをまだ分かりませんでした。 – lordylike

+0

私が知る限り、このメソッドは並列をサポートしていません。 –

+0

はい、私はそれを考え出しました。しかし、私はあなたの基本的なアイデアといくつかの依存関係解析を使用して、私が行きたいところを得ることができました。だから、ありがとう。 – lordylike

関連する問題