2017-01-03 1 views
0

커다란 C++ 코드 기반의 솔루션 파일에 이미있는 정보를 활용하는 적절한 방법을 찾아 내려고 노력했습니다.솔루션에서 msbuild를 사용하여 일부 프로젝트에서 사용자 지정 대상 호출이 가능합니다.

내가 해결하려고하는 문제는 솔루션 내의 일부 프로젝트 파일에서 외부 스크립트를 호출하는 것이지만 솔루션 및 단일 프로젝트 파일에 지정된 이미 존재하는 종속성을 관찰하는 것입니다.

내 프로젝트 파일 중 하나에 사용자 지정 대상을 추가하고 vbufj 파일에서 /t : {TargetName} 명령과 함께 msbuild를 사용하여이 (Python) 스크립트를 성공적으로 호출했습니다.

이제이 스크립트를 호출해야하는 모든 프로젝트 파일에이 대상을 추가 한 다음 나중에 올바른 순서로 msbuild를 호출 할 수 있습니다. 그러나이 방법은 솔루션에서 알려진 종속성을 활용하는 목적을 상쇄합니다.

그러나 사용자 지정 대상으로 솔루션을 호출하면 (예 : Invoke Custom MSBuild Target on Solution File과 같은 다른 stackoverflow 질문 에서처럼) 작동하지 않습니다.

반면에 스크립트 타겟 만 호출하고 일부 빌드 명령을 호출하지 않아도되기를 원하기 때문에 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

약간의 조정만으로도 사용자 지정 대상이 지정된 모든 프로젝트에 대해 스크립트를 호출 할 수 있습니다. 너를 망쳤다. 그러나 솔루션 파일의 종속성을 사용하는 한 가지 큰 이유는 일부 프로젝트 (즉 종속성이없는 프로젝트)의 실행을 병렬화 할 수 있기 때문입니다. 나는 모든 프로젝트가 "모든 의존성이 끝나자 마자"라고 말하는 방법을 아직 생각하지 못했습니다. – lordylike

+0

내가 아는 한,이 방법은 병렬을 지원하지 않습니다. –

+0

예, 알아 냈습니다. 그러나 기본 생각과 일부 종속성 구문 분석을 사용하여 내가 원하는 곳으로 이동할 수있었습니다. 고마워. – lordylike

관련 문제