Как заставить MSBuild создать пользовательскую цель, указанную в csproj building sln? - PullRequest
5 голосов
/ 06 декабря 2011

У меня проблема с MSBuild Я не могу решить ее самостоятельно.В результате я полагаюсь на мудрость сообщества.

Реальная ситуация, с которой у меня проблемы

У меня есть файл решения, содержащий несколько проектов с зависимостями от других проектов вто же решение.Я хотел бы добавить пользовательскую цель в один из файлов проекта csproj и собрать его из командной строки.Это позволит мне сделать все необходимые выходные файлы для этого проекта для дальнейшей обработки при построении пользовательской цели.Но главное, что я не могу понять, как это сделать, поиск в Google тоже не помогает.

Упрощение

Чтобы упростить задачу, я решилСоздайте новый консольный проект C #, добавьте простую настраиваемую цель в файл проекта и попробуйте собрать его.Все еще безуспешно!Вот что я сделал до сих пор:

  1. Создал приложение решения с консольным проектом по умолчанию coreapp.Это дает мне по крайней мере два файла:

    • app.sln
    • coreapp \ coreapp.csproj
  2. Модифицированный coreapp.csprojс добавлением моей пользовательской цели внутри тега Project

    <Target Name="SampleTarget">
      <Message Text="This is a SampleTarget" />
    </Target>
    
  3. Запустите в командной строке следующую команду

    %windir%\Microsoft.NET\framework\v3.5\msbuild.exe app.sln /t:coreapp:SampleTarget

    иличётный

    %windir%\Microsoft.NET\framework\v3.5\msbuild.exe app.sln /t:coreapp.csproj:SampleTarget

Результаты

Не повезло, с ошибкой

MSB4057: The target "coreapp.csproj:SampleTarget" does not exist in the project.

Я подозреваю, что MSBuild считает, что что-то принципиально отличается от того, что я хочу, чтобы он думал ...

Кроме того, я также пытался установить в той же командной строке переменную среды MSBuildEmitSolution =1 для принудительного создания дампа msbuild временного файла решения, который он создает при обработке решения.В этом файле действительно нет такой цели.Однако я полагаю, что это не причина, потому что я попросил msbuild создать coreapp.proj, где действительно находится целевой SampleTarget.

Вопрос в том, как создать SampleTarget в этом упрощенном сценарии с использованием файла решения, поскольку потенциально он может содержать зависимостидля проекта, содержащего эту цель SampleTarget?

Я был бы признателен за любую помощь или помощь для дальнейшего исследования!

Ответы [ 2 ]

3 голосов
/ 13 ноября 2014

Вместо вставки пользовательской цели в файл вашего проекта, вы можете попробовать создать новый автономный файл msbuild, который будет:

  • сборка файла решения (который строит проекты)
  • определяет вашу дополнительную цель

Например, назовите это app-custom-Debug.msbuild.

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <WorkingFolder>$(MSBuildProjectDirectory)</WorkingFolder>
    <Configuration>Debug</Configuration>
    <SolutionFile>app.sln</SolutionFile>
  </PropertyGroup>

  <Target Name="Build" DependsOnTargets="Compile" />  

  <Target Name="Compile">
    <Message Text="=== COMPILING $(Configuration) configuration ===" />
    <MSBuild Projects="$(SolutionFile)"
             Properties="Configuration=$(Configuration)" />
  </Target>

  <Target Name="SampleTarget">
    <Message Text="This is a SampleTarget" />
  </Target>

</Project>

Затем вы выполните:

msbuild.exe app-custom-Debug.msbuild /t:SampleTarget
0 голосов
/ 07 декабря 2011

Один из вариантов - привязать вашу SampleTarget к стандартным целям Build, переопределив соответствующее свойство DependsOn. В этом случае вы можете сказать BeforeBuild, что это DependsOn SampleTarget, или вы делаете то же самое с AfterBuild. Это гарантирует, что MSBuild обработает вашу цель до указанной стандартной цели.

...