Какое правильное событие сборки для запуска постобработки сборки в Visual Studio/MSBuild

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

Итак, я думаю, мне нужно улучшить процесс сборки/MSBuild моих проектов непосредственно в файлах *.csproj - это правильно? И какое событие сборки является правильным для вызова постпроцессора сборки командной строки?


person Buthrakaur    schedule 06.05.2012    source источник
comment
У меня не было возможности использовать ни один из них, но я бы предположил, что вы сможете установить PostSharp и посмотреть его целевой файл, чтобы выяснить, как/когда/где он добавляет себя в процесс сборки, а затем просто сделать то же самое для AfterThought? Это сообщение в блоге создает впечатление, что они добавляют себя в CompileDependsOn? sharpcrafters.com/blog/post/   -  person James Manning    schedule 07.05.2012
comment
Я только что попытался использовать CompileDependsOn, но похоже, что сборка ($(TargetPath)) еще недоступна в выходных данных проекта. ‹Target Name=AfterThought› ‹Exec Command='$(SolutionDir)..\LIBS\Afterthought\Afterthought.Amender.exe $(TargetPath) $(SolutionDir)..\My.Amendments.dll'/› ‹/Target› ‹PropertyGroup› ‹CompileDependsOn› $(CompileDependsOn); Запоздалая мысль; ‹/CompileDependsOn› ‹/PropertyGroup›   -  person Buthrakaur    schedule 07.05.2012
comment
Я только что обнаружил, что должен использовать @(IntermediateAssembly) вместо $(TargetPath) в CompileDependsOn. После того, как я применил эту настройку, процесс сборки начал работать, как я и предполагал.   -  person Buthrakaur    schedule 07.05.2012


Ответы (2)


Есть два:

  • <Target Name="AfterBuild" будет запускать команды MSBuild
  • <PropertyGroup><PostBuildEvent> будет запускать команды оболочки и доступен из диалогового окна проекта Visual Studio как «Командная строка события после сборки» на вкладке «События сборки».
person robrich    schedule 06.05.2012
comment
PostBuildEvent - это тот, который я пробовал до сих пор, но он выполняется слишком поздно - сборки уже скопированы в зависимые проекты (до запуска постпроцессора). Я только что попробовал цель AfterBuild, но результат тот же. Мне нужно какое-то событие сборки, которое происходит непосредственно перед копированием скомпилированной сборки в зависимые проекты. - person Buthrakaur; 06.05.2012
comment
Если я не ошибаюсь, он завершает сборку текущего проекта, включая оба этих события, перед копированием сборок в проекты, на которые ссылаются. Как делается копия? Это просто ссылки на проекты? Возможно, вместо этого вы связались со сборкой внутри /bin/Debug? Является ли порядок сборки проекта таким, что этот другой проект действительно строится первым? - person robrich; 06.05.2012
comment
Это ссылки на проект и порядок сборки правильный. Дело в том, что это работает, когда зависимый проект представляет собой простую библиотеку классов - проблема возникает только с проектами веб-сайтов и веб-приложений. Я только что попытался использовать событие AfterCompile, но похоже, что сборка еще не существует в выходной папке. - person Buthrakaur; 06.05.2012
comment
Можете ли вы сделать это как ‹PreBuildEvent› проекта веб-приложения? - person robrich; 06.05.2012
comment
Да, я мог бы, но это было бы очень некрасиво и бессистемно. Решение довольно большое (более 30 проектов) и многие проекты проходят постобработку. Я также мог бы создать пустой проект, интегрированный в цепочку зависимостей/сборок проекта, которая просто вызывала бы постпроцессор, но я ищу чистое решение - это означает вызов постпроцессора из самого проекта. - person Buthrakaur; 06.05.2012

Окончательное решение моей проблемы — цель CompileDependsOn:

  <Target Name="AfterThought">
    <Exec Command="&quot;$(SolutionDir)..\LIBS\Afterthought\Afterthought.Amender.exe&quot; &quot;@(IntermediateAssembly->'%(FullPath)')&quot; &quot;$(SolutionDir)..\Amendments\bin\$(Configuration)\Amendments.dll&quot; @(ReferencePath->'&quot;%(RootDir)%(Directory).&quot;', ' ')" />
  </Target>
  <PropertyGroup>
    <CompileDependsOn>
    $(CompileDependsOn);
    AfterThought;
   </CompileDependsOn>
  </PropertyGroup>
person Buthrakaur    schedule 14.05.2012