Цель 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>