it-swarm.com.ru

Событие после публикации в Visual Studio

Я пытаюсь вызвать простую задачу после публикации события. Когда я говорю «опубликовать», я имею в виду опубликовать в Visual Studio, щелкнуть правой кнопкой мыши по проекту и нажать «Опубликовать ...». Я включил (импортированный) файл целей в файл проекта, который работает нормально, потому что я уже проверил его на событии Build . Я нашел на http://msdn.Microsoft.com/en-us/library/ms366724 .aspx что есть событие AfterPublish, которое должно делать то, что мне нужно, но это не так. Я не уверен, что это одно и то же событие, которое должно сработать при публикации в Visual Studio, кто-то, пожалуйста, проясните это . Мой вопрос: как вызвать любую задачу из файла целей при публикации в Visual Studio?

Я пробовал это в файле целей:

<Project xmlns="http://schemas.Microsoft.com/developer/msbuild/2003">
    <Target Name="AfterPublish">
        <Message Label="Test"></Message>        
        <Warning Label="Test"></Warning>
    </Target>   
</Project>

Я использую Visual Studio 2010.

Правка:

Я на самом деле ищу какой-либо способ выполнить определенное действие при публикации в Visual Studio. Я также думал о добавлении событий сборки, но понятия не имею, как определить, выполняется ли публикация или нет.

Правка: @ Алексей Щербак спасибо за ваш быстрый ответ . Я получаю это в моем выводе MSBuild:

12/10/2012 12:29:40 AM:        Done executing task "CallTarget".
12/10/2012 12:29:40 AM:        Done building target "PipelinePreDeployCopyAllFilesToOneFolder" in project "PublishTestApp.csproj".
12/10/2012 12:29:40 AM:Done building project "PublishTestApp.csproj".
Deleting existing files...
Publishing folder /...
Publishing folder Account...
Publishing folder bin...
Publishing folder Scripts...
Publishing folder Styles...
========== Build: 1 succeeded or up-to-date, 0 failed, 0 skipped ==========
========== Publish: 1 succeeded, 0 failed, 0 skipped ==========

Таким образом, моя задача будет выполнена сразу после PipelinePreDeployCopyAllFilesToOneFolder, но до фактического копирования файлов, и я не считаю, что публикация еще не завершена в тот момент…. Конечно, я действительно проверял это, поэтому в задаче MSBuild я выполнял простое чтение из текстового файла, который предполагается скопировать в папку «Опубликовать», и это не удалось.

22
Andrija Cacanovic

В контекстном меню «Публикация» отсутствует цель «Публикация» (если мы говорим о публикации веб-сайта, а не публикации пакета ClickOnce).

Если вы используете VS2010 - контекстное меню запустит цель «PipelinePreDeployCopyAllFilesToOneFolder», а в VS2012 (учтите это, если вы собираетесь переключиться) она запустит цель «MSDeployPublish».

Я полагаю, вы должны прочитать этот вопрос и ответ . Мы с Джезом предоставили исчерпывающий ответ о том, как подключиться к публикации «До\После».

Вкратце - для версии MSBuild> = 4.0 вы можете использовать этот подход

<Target Name="Mytarget" AfterTargets="PipelinePreDeployCopyAllFilesToOneFolder" >
    <Message Label="Test"></Message>        
    <Warning Label="Test"></Warning>
</Target>

@ Edit1: используйте CopyAllFilesToSingleFolderForPackage вместо PipelinePreDeployCopyAllFilesToOneFolder - файлы должны быть скопированы после этой цели . Если вам нужно запускать вашу цель только тогда, когда она запускается в контексте VS - проверьте ссылку, которую я разместил, и добавьте еще несколько условий - чтобы проверить запуск Visual Studio, как это Condition="'$(BuildingInsideVisualStudio)'=='true' AND '$(VisualStudioVersion)'=='10.0'" Если вы добавите больше контекста, например, какую цель вы хотите запустить после публикации и т. д., - это может добавить больше контекста и помочь другим понять проблему

16
Alexey Shcherbak

Добавление моих 2 центов

MS подтвердила, что при публикации в файловой системе у них нет цели для запуска после этого.

«В настоящее время мы не поддерживаем выполнение пользовательских целей после публикации Из VS для протокола файловой системы».

Цитируется из этот SO вопрос

Итак, что мы в итоге сделали:

  1. используйте AfterTargets="CopyAllFilesToSingleFolderForPackage" (запускается непосредственно перед тем, как файлы копируются в место публикации)
  2. который выполняет bat-файл
  3. bat-файл начинается с команды timeout 10 (ждет 10 секунд) - из-за отсутствия лучшего способа.

ВАЖНО: Этот bat-файл должен быть выполнен асинхронно, поэтому процесс публикации продолжается после его запуска, пожалуйста, обратитесь к этому ответу SO о том, как это сделать.

8
Alex

Я попробовал любой другой ответ, но они просто не работали. В моем случае я публикую VSTO Add-In с VS2015, так что, может быть, происходит что-то другое, но вот два варианта, которые сработали:

<Target Name="AfterPublish">
  <Warning Text="publish warning 1" />
</Target>
<Target Name="CustomTarget" AfterTargets="AfterPublish">
  <Warning Text="publish warning 2" />
</Target>

Одна из причин, по которой я (и предположительно другие) испытали трудности с этим, заключается в том, что задача Message, похоже, ничего не делает. Я ожидал текст в представлении Output, но ничего не показывалось. В Error List также не было элементов Message, но с помощью Warning они действительно отображались в Error List. К сожалению, я не знаю достаточно о MSBuild, чтобы сказать, почему Message ведет себя не так, как ожидалось.

4
Chris

Я только что написал пост о том, как я достиг этого в Visual Studio 2013 здесь: http://www.alexdresko.com/2015/02/28/taking-visual-studio-build-and-publish-events-to- следующий уровень/

По сути, это магия:

<Target Name="Mytarget" AfterTargets="MSDeployPublish" >
    <Message Text="The name of the publish profile is $(DestinationAppRoot)"/>   
    .... Here's where you do something awesome... 
</Target>

Я призываю вас прочитать весь пост для получения дополнительной информации.

4
Alex Dresko

Мой ответ на другой вопрос может быть полезным.

Скрипт AfterPublish не запускается при публикации веб-приложения

В частности, используя путь к «опубликованным файлам», вы можете передать параметр через $(WebProjectOutputDir)\$(WPPAllFilesInSingleFolder). Это было бы что-то вроде c:\{path to *.csproj}\obj\{build configuration}\Package\PackageTmp.

0
Terry