2015-04-19 2 views
4

У нас есть решение с несколькими проектами в нем, и нам нужно запустить инструмент на нашем скомпилированном коде после того, как весь наш код будет скомпилирован. Инструмент должен принимать в качестве входных данных все DLL-файлы и .exe-файлы, созданные из решения (так что для инкрементной сборки недостаточно, чтобы дать ему только восстановленные двоичные файлы), и все эти двоичные файлы должны быть до Дата.MSBuild: Запуск целевой задачи после сборки решений из Visual Studio

Теперь мы делаем это с помощью файла MSBuild .proj, который мы запускаем из командной строки, которая включает все проекты, и использует элемент вывода MSBuild для поиска путей к двоичным файлам в решении.

У этого есть две проблемы, которые делают это решение не совсем подходящим для нас. Инструмент не обязательно должен запускаться во всех проектах, только некоторые из них. И требуется, чтобы мы могли строить из Visual Studio.

Кажется, что мне нужно, чтобы в файлах проектов .csproj некоторых проектов было указано что-то, что говорит «запустите инструмент на мне», чтобы собрать пути этого проекта и запустить инструмент в этой коллекции путей.

Но я не вижу, как это сделать. Похоже, что когда я создаю Visual Studio, я не могу делиться состоянием между сборками проектов, и похоже, что после сборки решения нет никакого крючка.

Из командной строки есть до. *. Sln.targets и after. *. Sln.targets, но они не работают из Visual Studio.

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

+0

Вы можете добавить пустой проект в решение, добавить зависимости друг от друга и определить событие post-build в добавленном проекте. – Nikerboker

ответ

1

У Msbuild есть цели расширяемости. Эти пустые цели могут использоваться в файлах проекта. См. following article and section Build process extensibility points.

Например, если вы хотите, чтобы развернуть некоторые связанные файлы вместе с сборки, когда он был построен, перекрывая цель AfterBuild будет путь, как показано ниже.

Я изменил свой пример, чтобы использовать задачу exec, как показано ниже. В этом примере используйте yourCustomTasks.exe в ваших двоичных файлах после их создания.

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <!-- Properties and items are deleted for clarity --> 
    <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> 
    <ItemGroup> 
     <Binaries Include="*.dll;*.exe"/> 
    </ItemGroup> 
    <Target Name="AfterBuild"> 
     <Exec Command="YourCustomTasks.exe %(Binaries.Identity)" /> 
    </Target> 
</Project> 

Если вы хотите, чтобы ваша цель, чтобы работать после того, как ваше решение, использовать following answer.

Чтобы выполнить решение шириной до и после цели, вы можете создать два файлы проекта MSBuild с именем «after..sln.targets» и «before..sln.targets» в той же папке, что и решение.

+0

Но это будет выполняться один раз для проекта _each_, который был создан, а не _once_, после того, как были созданы _all_ проекты. – GalaxyInvader

+0

@GalaxyInvader обновил мой ответ. Но, похоже, это не работает в Visual Studio. Но вы можете попробовать другие цели уровня решения, чтобы убедиться, что они работают на вас. –

+0

Что касается вашего редактирования: я специально упомянул в своем сообщении, что до/после. *. Sln.цели не работают из Visual Studio, что также указано в комментариях к вашему ответу на ..... – GalaxyInvader

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