MSBuild Target не работает в NET Core Project - PullRequest
0 голосов
/ 14 февраля 2020

Я использую Visual Studio 2019,. NET Core 3.1

Я создаю новый проект и использую шаблон Библиотека классов (. NET Core)

Я щелкаю правой кнопкой мыши по проекту в обозревателе решений, нажимаю Изменить файл проекта

и добавляю следующую цель:

  <Target Name="Test" AfterTargets="Build">
    <Message Text="This is a test" Importance="high" />
  </Target>

Когда я публикую sh ... он попадает в это цель несколько раз, и в области «Выход» я вижу «Это тест» несколько раз.

Я бы хотел, чтобы эта цель выполнялась после Publi sh вместо сборки.

Это работает в решении. NET Core Web API, где перед событием Publi sh я выполняю ng build в проекте angular, который включен в опубликованный результат. .

Но в библиотеке классов она, как и цель Publi sh msbuild, никогда не выполняется, даже если я выполняю настоящий Publi sh.

Итак ...

  <Target Name="Test" AfterTargets="Publish">
    <Message Text="This is a test" Importance="high" />
  </Target>

Это сообщение никогда не отображается на моей панели вывода.

Эта библиотека классов будет опубликована на частном сервере NuGet, и я хотел бы выполнить nuget pu sh после завершения действия Publi sh. Я могу легко выполнить команду pu sh на сервере NuGet, как только получу, что цель msbuild действительно запустится в нужное время.

Я что-то здесь упускаю? Как выполнить задание после завершения действия Publi sh для решения. NET Core Library?

РЕДАКТИРОВАТЬ: Возникает другой вопрос. Когда я публикую sh, я получаю такой вывод:

1>------ Build started: Project: ClassLibrary1, Configuration: Release Any CPU ------
1>ClassLibrary1 -> C:\Users\11016409\Documents\source\Libraries\NET Core\ClassLibrary1\ClassLibrary1\bin\Release\netcoreapp3.1\ClassLibrary1.dll
1>This is a test
2>------ Publish started: Project: ClassLibrary1, Configuration: Release Any CPU ------
2>ClassLibrary1 -> C:\Users\11016409\Documents\source\Libraries\NET Core\ClassLibrary1\ClassLibrary1\bin\Release\netcoreapp3.1\ClassLibrary1.dll
2>This is a test
2>Successfully created package 'C:\Users\11016409\Documents\source\Libraries\NET Core\ClassLibrary1\ClassLibrary1\bin\Release\netcoreapp3.1\publish\ClassLibrary1.1.0.0.nupkg'.
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
========== Publish: 1 succeeded, 0 failed, 0 skipped ==========

почему он запускает фазу сборки дважды?

1 Ответ

0 голосов
/ 18 февраля 2020

Существуют определенные встроенные цели, которые никогда не будут поражены, например Publi sh для проекта NET Core Class Library. Я даже установил для публикуемого свойства значение true безрезультатно Я никогда не мог понять это. Но я обнаружил, что это выполняющий встроенный целевой «Пакет», в который я мог подключиться.

  <Target Name="nuget push" AfterTargets="Pack">
    <Exec WorkingDirectory="$(PackageOutputPath)" Command="nuget push $(PackageId).$(PackageVersion).nupkg -source http://DevServices/NuGet" />
  </Target>

Пакет - это место, где он генерирует фактический файл .nupkg. Как только цель Pack закончена, я могу отправить sh на мой локальный сервер NuGet.

Убедитесь, что у вас снят флажок в свойствах проекта для создания пакета Nuget в каждой сборке, поскольку цель Pack будет выполняться при каждой сборке.

Таким образом Pack будет выполняться только при публикации Publi sh проекта. Вы можете опубликовать sh в любом месте, и он сгенерирует nuget pu sh для сгенерированного .nupkg независимо от того, в каком месте вы опубликовали.

Если вам действительно нужно генерировать .nupkg в каждой сборке но вы хотите использовать nuget pu sh только при использовании publi sh, а затем использовать эту цель вместо этого и иметь только pu sh пакет nuget для вашего сервера nuget, если путь вывода соответствует вашей папке publi sh location:

  <Target Name="nuget push" AfterTargets="Pack" Condition="$(PackageOutputPath.EndsWith('\publish\'))">
    <Exec WorkingDirectory="$(PackageOutputPath)" Command="nuget push $(PackageId).$(PackageVersion).nupkg -source http://DevServices/NuGet" />
  </Target>

Примечание. С этим методом nuget pu sh очень удобно, если ваш сервер nuget настроен так, чтобы не позволять перезаписывать существующие версии пакетов (как это и должно быть). быть) тогда он требует, чтобы те пакеты подталкивания обновили номер версии, прежде чем он заработает. В противном случае на publi sh будет выдана ошибка, что он не сможет перезаписать существующую версию пакета. Все в GUI, как это, позволяет легко зайти и обновить версию библиотеки и снова попробовать publi sh. Супер быстро Супер просто.

...