Як запустити події після збирання Visual Studio лише для налагодження


592

Як я можу обмежити свої події після збирання лише типом одного типу збірки?

Я використовую події для копіювання файлів DLL у локальну віртуальну директорію IIS, але я не хочу, щоб це відбувалося на сервері збирання у режимі випуску.

Відповіді:


746

Події до і після збирання запускаються як пакетний сценарій. Можна зробити умовне твердження на $(ConfigurationName).

Наприклад

if $(ConfigurationName) == Debug xcopy something somewhere

7
дивно, можливо, це тільки я, але я спробував додати умову if, і тепер я отримую цю помилку - помилка вийшла з кодом 255
Michael L

101
Я виявив, що вся команда повинна бути в одному рядку, інакше ви отримаєте "вихід з кодом 255"
Робін Мінто

7
ви також можете скористатися gotos / labels для більш повного рішення (див. мою відповідь 24 липня)
CestLaGalere

11
і ви можете використовувати дужки з командою if (див. приклад в моїй відповіді)
gbjbaanb

1
Ви повинні використовувати "xcopy / Y", щоб файл перезаписався в цільовий каталог.
Маттіас

521

FYI, вам не потрібно використовувати goto. Команду IF shell можна використовувати з круглими дужками:

if $(ConfigurationName) == Debug (
  copy "$(TargetDir)myapp.dll" "c:\delivery\bin" /y
  copy "$(TargetDir)myapp.dll.config" "c:\delivery\bin" /y
) ELSE (
  echo "why, Microsoft, why".
)

62
Чи можу я також додати, щоб бути обережним щодо вступних дужок, які повинні негайно слідувати оператору if, ніби він знаходиться в наступному рядку, буде створено код помилки
wonea

37
Використовуйте "$(ConfigurationName)"(зверніть увагу на котирування), якщо ви отримаєте код помилки 255
jgauffin

20
Зверніть увагу, якщо ви використовуєте "" $ $ (ConfigurationName), вам також потрібні лапки навколо слова Debug - команда оболонки IF-оператори дуже .. буквальна ... коли мова йде про порівняння рядків.
gbjbaanb

5
Зауважте, щоб позбутися 255, мені довелося використовувати "" навколо $ (ConfigurationName) І видалити пробіли навколо умови, наприклад, якщо "$ (ConfigurationName)" == "Release" <- Немає пробілів навколо ==
fhilton

15
У моєму випадку Visual Studio 2017 $(ConfigurationName)порожній (командний рядок події після складання). if "$(Configuration)" == "Debug"працював на мене. BTW, якщо ви хочете зробити щось у всіх інших конфігураціях, використовуйте if NOT "$(Configuration)" == "Debug".
Ральф Хундевадт

125

Додайте подію побудови публікацій як звичайну. Потім збережіть проект, відкрийте його в Блокноті (або улюбленому редакторі) та додайте умову до групи властивостей PostBuildEvent. Ось приклад:

<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
    <PostBuildEvent>start gpedit</PostBuildEvent>
</PropertyGroup>

5
Це працює, але це змушує вас виконувати всі ваші проектні роботи для подій у файлі джерела проекту. Інші заяви про події збірки умовного типу також приховані від IDE.
Джозеф Дайгл

3
Я б сказав, що це краща відповідь для мене, бажаний метод просто не спрацював.
Майкл Л

8
Вам не потрібно відкривати його в Блокноті, ви можете залишитися у Visual Studio. Ви можете клацнути правою кнопкою миші файл проекту, натиснути "Вивантажити проект", потім ще раз правою кнопкою миші та натиснути "Редагувати". Тепер ви можете редагувати файл {{csproj}} за допомогою синтаксичного забарвлення. Клацніть правою кнопкою миші знову, але тепер натисніть "Перезавантажити проект", щоб перезавантажити.
Авель

1
Цей підхід не розширив макроси в самій команді PostBuildEvent, коли я його спробував. cd "$(ProjectDir)"розширено до cd "".
Дарріл

3
У VS 2017 ви також можете це зробити <Target Name="PostBuild" AfterTargets="PostBuildEvent" Condition="$(ConfigurationName) == Debug"> <Exec Command="your command"/></Target>. Змінні макросу і все працює як нормально.
СК

106

Як варіант (оскільки події поміщаються у пакетний файл і потім викликаються), використовуйте наступне (у полі Подія побудови, а не у пакетному файлі):

if $(ConfigurationName) == Debug goto :debug

:release
signtool.exe ....
xcopy ...

goto :exit

:debug
' Debug items in here

:exit

Таким чином, ви можете мати події для будь-якої конфігурації, і все ще керувати ними за допомогою макросів, а не передавати їх у пакетний файл, пам’ятайте, що %1це $(OutputPath)і т.д.


6
Якщо у вас є можливість подивитися якийсь свій код у рефлекторі, компілятор перетворює безліч операторів комутації / справи в goto's.
StingyJack

10
Більшість усіх компіляторів перекладають код у більш прості інструкції, такі як goto. І зворотна інженерія не може зібрати більш прості інструкції в "приємні" більш складні інструкції, які ви хотіли б побачити. Я не бачу, як Microsoft змушує нас використовувати goto, або як це стосується цієї публікації.
TamusJRoyce

1
@StingyJack: якщо ви подивитеся на скомпільований код, ви побачите, що все це перетворюється на інструкції JMP :) Мені все одно, що робить компілятор під обкладинками, поки я можу писати добре читабельний код. (не те, що користуватися goto часом не дуже легко читати)
gbjbaanb

Якщо я поміщаю свої команди після складання всередині партії, я отримую це повідомлення про помилку, коли натискаю збірку:Error 1 The command "C:\MyProject\postbuild.bat" exited with code 99. MyProject
Себастьян

4
якщо ви хочете, ви можете видалити ifта використовуватиgoto :$(ConfigurationName)
Calimero100582

15

Visual Studio 2015: Правильний синтаксис (тримати його в одному рядку):

if "$(ConfigurationName)"=="My Debug CFG" ( xcopy "$(TargetDir)test1.tmp" "$(TargetDir)test.xml" /y) else ( xcopy "$(TargetDir)test2.tmp" "$(TargetDir)test.xml" /y)

Тут немає помилки 255.


3
тримати його на одній лінії
Ерік Бол-Фейсот

Добре працює. Tks
Vinicius Gonçalves

1
Ваша умовна техніка працювала найкраще для мене. Однак це спрацювало навіть краще без умов, і це набагато стисліше. скопіювати "$ (ProjectDir) \ .. \ $ (ConfigurationName) \ MyFileName" "$ (TargetDir)"
shawn1874,

1
Ваш сценарій правильний, але мій сценарій дозволяє копіювати різні файли для різних конфігурацій.
Ерік Бол-Фейсот

8

Станом на Visual Studio 2019, сучасний .csprojформат підтримує додавання умови безпосередньо на Targetелемент:

<Target Name="PostBuild" AfterTargets="PostBuildEvent" Condition="'$(Configuration)' == 'Debug'">
    <Exec Command="nswag run nswag.json" />
</Target>

Користувальницький інтерфейс не забезпечує спосіб налаштування цього, але, схоже, безпечно залишає Configurationатрибут на місці, якщо ви вносите зміни через інтерфейс користувача.


Це працювало для мене у VS 2019, дякую!
BrandoTheBrave

Це дійсно заслуговує на те, щоб бути вищим, також вони дійсно повинні оновити інтерфейс користувача, щоб дозволити позначити конфігурацію збірки або принаймні додати умову з властивостей csproj.
DeadlyChambers

4

Ви можете передати ім'я конфігурації в сценарій після збирання і перевірити його там, щоб побачити, чи слід воно запускати.

Передайте ім'я конфігурації за допомогою $(ConfigurationName).

Перевірка його ґрунтується на тому, як ви реалізуєте крок після збирання - це буде аргумент командного рядка.


-1

Це працює для мене у Visual Studio 2015.

Я копіюю всі DLL-файли з папки, що знаходиться в папці бібліотеки на тому ж рівні, що і моя папка рішення, у цільовий каталог проекту, який будується.

Використовуючи відносний шлях з мого каталогу проектів і збираючись вгору по структурі папки два кроки з .. \ .. \ lib

MySolutionFolder
.... MyProject
Lib

if $(ConfigurationName) == Debug (
xcopy /Y "$(ProjectDir)..\..\lib\*.dll" "$(TargetDir)"
) ELSE (echo "Not Debug mode, no file copy from lib")

-2

Як і будь-яке налаштування проекту, buildevents можна налаштувати за конфігурацією. Просто виберіть конфігурацію, яку потрібно змінити, у спадному вікні діалогового вікна "Властивості" та відредагуйте крок створення повідомлення.


10
Події побудови не характерні для будь-якої конфігурації, коли вони створені в IDE.
Джозеф Дайгл

1
Не працює і у VS2015. Не можна налаштувати за конфігурацією.
Віллем

2
Це стосується лише проектів C ++ у Visual Studio, а не C #
bytecode77

-3

У Visual Studio 2012 ви повинні використовувати (я думаю, і в Visual Studio 2010)

if $(Configuration) == Debug xcopy

$(ConfigurationName) був вказаний як макрос, але він не був призначений.

Введіть тут опис зображення

Порівняйте: Макроси для команд і властивостей збірки


7
Ви хочете використовувати ConfigurationName. Цей образ ... насправді важко зрозуміти з усією розмитістю.
Стелс-раббі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.