Цель AfterPublish не работает

Самая простая задача в мире (см. Ниже) не выполняется после того, как я опубликую свой проект веб-приложения. Есть идеи почему?

<Target Name="AfterPublish">
  <Copy SourceFiles="C:\A.txt" DestinationFiles="C:\B.txt" />
</Target>

4 ответа

Примечание. Следующее относится к VS2010 и публикации проектов веб-приложений с помощью метода публикации "Web Deploy", выбранного в диалоговом окне "Build/Publish {projectname}".

Правильное утверждение Жюльена Хорау в том, что "Опубликовать" - это НЕ имя цели msbuild, вызванной в вышеуказанном случае; фактическое имя цели - "MSDeployPublish".

Следовательно, вы должны определить элемент "Target", для которого значение атрибута "AfterTarget" установлено в "MSDeployPublish" - значение атрибута "Name" не имеет значения (при условии, что оно уникально среди целевых имен).

Вот как это сделать:

  • Откройте файл проекта (например, *.csproj) в текстовом /XML-редакторе и непосредственно перед закрытием </Project> добавить тег <Target Name="CustomPostPublishAction" AfterTargets="MSDeployPublish"> элемент; выберите имя по вашему выбору для "CustomPostPublishAction".
  • Добавьте так называемый дочерний элемент Task, который выполняет желаемое действие; например, чтобы добавить команду для передачи в cmd.exe, используйте <Exec Command="..." /> элемент.

Пример:

<Target Name="CustomPostPublishActions" AfterTargets="MSDeployPublish" >
    <Exec Command="echo Post-PUBLISH event: Active configuration is: $(ConfigurationName)" />
</Target>

Замечания:

  • В командных строках используйте ссылки на сущность XML (?) Вместо символов, которые могут нарушить синтаксический анализ XML, например ">" вместо "<".
  • Для документации <Target> элемент в целом, см. http://msdn.microsoft.com/en-us/library/t50z2hka.aspx
  • Ссылка на элементы задачи здесь: http://msdn.microsoft.com/en-us/library/7z253716.aspx
  • В общем, если вам нужно определить имя цели msbuild.exe, которая фактически вызывается Visual Studio 2010, выполните следующие действия:
    • Перейдите в Инструменты / Параметры..., Проект и решения / Построить и запустить, выберите "Подробно" (или, для более подробной информации, "Диагностика") из выпадающего списка с пометкой "Детализация выходных данных сборки проекта MSBuild".
    • После выполнения действия build / publish, например, Build/Publish, проверьте в окне "Вывод" последнее вхождение строки "Готово создание цели", чтобы определить цель верхнего уровня, которая была вызвана.

Visual Studio 2013. Публикация веб-приложения в файловой системе.

  <Target Name="Moose" AfterTargets="GatherAllFilesToPublish" >
    <Message Importance="high" Text="***Moooooooooooooooose***$(WPPAllFilesInSingleFolder)***$(TargetDir)" />
  </Target>

Примечание. Убедитесь, что для ведения журнала сборки установлено значение как минимум "Подробно". Ищите его в Сервис -> Параметры -> Проекты и Solutinos -> Построить и запустить -> MSBuild. Диагностика также подойдет, если вы хотите выяснить, какая цель сборки была запущена в последний раз перед фактической публикацией.

Кажется, это работает в Visual Studio 2019

<Target Name="MyCustomTarget" AfterTargets="Publish">
  <Copy SourceFiles="C:\A.txt" DestinationFiles="C:\B.txt" />
</Target>
  • Вы должны определить переопределить цель в конце вашего файла, после того, как <Import ... />
  • Запустите MSBuild с подробным описанием, чтобы понять, почему ваша цель игнорируется:

    msbuild project.csproj /t:Target_to_Launch /v:d
    

AfterPublish называется после Publish цель, но Publish не является целью, вызываемой при публикации веб-приложения. Publish является целью публикации приложения ClickOnce.

Вам нужно будет найти цель, которую вы используете, когда будете звонить Publish в Visual Studio это может быть Package, WebPublish...

Сейчас я немного ленив, чтобы выяснить беспорядок целей и найти подходящую для публикации на основе файлов (которая может вас заинтересовать). Тем временем вы можете определить цель AfterBuild в файле *.pubxml.

<Target Name="AfterBuild">

...

Я также рекомендую отключить свойство "DeleteExistingFiles", потому что, если вы копируете файлы в публикуемые каталоги, он выполняет очистку где-то в процессе публикации.

<DeleteExistingFiles>False</DeleteExistingFiles>
Другие вопросы по тегам