Подтвердить что ты не робот

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

Я пытаюсь вызвать простую задачу после публикации события. Когда я говорю "публиковать", я имею в виду публикацию в Visual Studio, щелкните правой кнопкой мыши по проекту и нажав "Опубликовать...". Я включил (Imported) файл целей в файл проекта, который отлично работает, потому что я уже тестировал его на событии 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.

EDIT:

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

EDIT: @Алексей Щербак благодарит вас за ваш быстрый ответ. Я получаю это на выходе 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 я выполнял простое чтение из текстового файла, который, предположительно, должен быть скопирован в папку "Опубликовать", и это не удалось.

4b9b3361

Ответ 1

В контекстном меню "Опубликовать" не запущена цель "Опубликовать" (если мы говорим о публикации веб-сайта, а не о публикации пакета ClickOnce).

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

Я полагаю, вы должны прочитать этот вопрос и ответ. Jez и я предоставили довольно исчерпывающий ответ о том, как подключиться к объекту Before\After publish.

Вкратце - для версии 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'" Если вы добавите больше контекста, например, какую цель вы хотите запустить после публикации и т.д. - это может добавить больше контекста и помочь другим понять проблему.

Ответ 2

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

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

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

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

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

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

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

Ответ 3

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

По сути, это волшебство:

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

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

Ответ 4

Я попробовал любой другой ответ, но они просто не работали. В моем случае я публикую 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 работает не так, как ожидалось.

Изменение: см. Этот отличный ответ о том, как точно увидеть, какие цели выполняются.

Ответ 5

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

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

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