2017-01-03 1 views
0

Я пытаюсь найти правильный способ использования информации, уже присутствующей в файле решения довольно большой базы данных C++.Использовать msbuild для решения для вызова настраиваемой цели на некоторые проекты

Проблема, которую я пытаюсь решить, вызывает внешний скрипт в некоторых файлах проекта в решении, но наблюдает за уже существующими зависимостями, указанными в решении и файлах одного проекта.

Я успешно вызвал упомянутый (python) скрипт, добавив пользовательскую цель в один из моих файлов проекта и используя msbuild с командой/t: {TargetName} в файле vcxproj.

Теперь я могу добавить эту цель в каждый файл проекта, который должен вызвать этот скрипт, а затем вызвать msbuild для каждого из них в правильном порядке, однако это побеждает цель использования зависимостей, известных решению.

Вызов решения с пользовательской целью, однако, не работает (как видно из других вопросов, связанных с stackoverflow, таких как: Invoke Custom MSBuild Target on Solution File).

С другой стороны, поскольку я хочу, чтобы иметь возможность ТОЛЬКО вызвать целевой скрипт и не зависеть от вызова какой-либо команды сборки, я не могу использовать предлагаемые обходные пути в некоторых из ответов на добавление цели Post или PreBuild ,

Есть ли другой способ использования зависимостей без необходимости прохождения маршрута msbuild и пользовательских целей, или есть ли другое обходное решение, которое может служить моей цели?

ответ

0

Есть ли другой способ использования зависимостей, без необходимости идти по пути MSBuild и пользовательских целей, или есть другой обходной путь, который мог бы служить своей цели?

Вы можете построить SLN программно, вот консоль APP с 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

Смежные вопросы