Visual Studio: Кілька команд після збирання?


101

Visual Studio 2008 дозволяє мені оголосити команду та долучити її до події після складання для проекту. Як і багато розробників, я регулярно використовую його для копіювання файлів у вихідний каталог додатків.

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

Це правильно, чи є більш простий спосіб викликати дві команди з події після складання? Заздалегідь дякую за вашу допомогу.

Відповіді:


124

Ви можете ввести стільки команд після створення збірки, скільки вам потрібно. Просто розділіть їх новими рядками.

Ось приклад одного з моїх проектів.

Командний рядок події побудови


3
Включення знімка екрана корисне лише в тому випадку, якщо ви маєте намір розмістити його назавжди.
Amandalishus

1
@ OWenJ23 ... або "imageshack" у цьому випадку;)
Ентоні Уолш

28
Незважаючи на те, що вони знаходяться в окремих рядках, мої команди виконуються разом, ніби вони були в одному рядку.
Тревор

6
На жаль, здається, що принаймні VS2015 не повідомляє про помилку, якщо одна з проміжних команд виходить з ладу ... вона повідомляє про результат останньої команди як результат кроку після складання.
Йоханнес С.

3
Здається, що це працює зсередини Visual Studio - але не підтримується, якщо ви використовуєте MsBuild на машині збирання TFS. MsBuild смужки розбиває рядок, а потім не виконує команду через поганий синтаксис.
Джефф Б

107

Важливо: Виконуючи пакетний файл, ви повинні використовувати оператор "call", щоб замовити виконання наступних рядків. Якщо ви не використовуєте "call", виконання переходить у .bat і не повертається до наступних рядків. Те саме, що і в запиті DOS.

наприклад:

call MyBatch1.bat
call MyBatch2.bat

3
Ця порада стосується команд grunt та npm, оскільки вони обидва працюють через пакетні файли (grunt.cmd та npm.cmd).
Метт Варблов

16

Є ще один варіант: можна розділити команди за допомогою && . Напр

copy $(TargetPath) d:\folder1 && copy $(TargetPath) d:\folder2

Це не точно так само, як розділення з новими рядками: з &&, якщо попередня команда не вдалася, наступний комутант не запуститься.

Розділення нових рядків легше читати, тому вам слід віддати перевагу. Однак я знаю принаймні один випадок, коли &&це корисно. Це сценарій, коли ви використовуєте аркуші властивостей, щоб мати різні кроки після збирання на різних машинах. VS 2008 не дозволяє встановлювати PostBuildStep в аркушах властивостей безпосередньо, але ви можете додати макрос користувача за допомогою своєї команди та викликати її з основних параметрів проекту. Макрос - це один рядок, тому ви можете використовувати &&там кілька команд.


11

Кожна команда повинна бути в окремому рядку. Однак я виявив те, що якщо є помилка при виконанні однієї з цих команд, вся помилка після збірки не працює, і тому вам потрібно буде спробувати кожну команду після складання по черзі для налагодження.


2
"xcopy / f" покаже повне джерело та цільове ім'я файлу, яке буде надруковано до відмови, що полегшує діагностику декількох команд xcopy, ніж кілька команд копіювання.
yoyo

9

Відокремлення команд за допомогою & або && або; не працює у VS2017. Не можу повірити, що така проста функціональність недоступна у VS2017. Visual studio намагається виконати весь текст у вікні події публікації повідомлення як один рядок. Єдиний варіант для мене зараз - створити пакетний сценарій, який мені особливо не подобається.


1
Розділення команд && працює для мене в VS2017. Вказання кожної команди в окремому рядку в редакторі VS2017 не працює для мене.
codeniffer

5

Додавання до WOMP «s відповідь :

Якщо у вас є кілька аркушів властивостей, що потрібно зробити для однієї події збірки, ви можете виконати наступне, щоб ланцюжок команд:

%(Command)
echo foo

де %(Command)розширюється до попереднього значення команди.

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


1
Це також працює з користувацьким кроком збірки. Також виконання оператора exitпартії в будь-якому місці ланцюга призводить до переривання ланцюга. Дійсно exit 1призводить до збою збірки, тоді як exit 0просто перериває крок, і збірка триває.
Мартін Коннелл

3

У Visual Studio 2017 ви можете зробити це:

<PostBuildEvent>
    <Command>
        copy $(TargetPath) $(SolutionDIr)\bin1
        copy $(TargetPath) $(SolutionDIr)\bin2
    </Command>
</PostBuildEvent>

1
Я відредагував .csproj і додав <Command> </Command> навколо двох моїх команд події після побудови. Це, здається, не спрацювало. Коли я переглянув Build Events у Visual Studio, у нього було <Command> </Command> навколо двох команд, але видав помилку в побудові: Команда "<Command xmlns =" ​​.. "> command1 command2 </Command>" вийшов з кодом 255.
Джиммі

1

Підхід, запропонований Womp, працює в Visual Studio 2015/2017 (Windows), але не працює в Visual Studio for Mac (Preview), який, здається, виконує лише першу з команд. Єдиним підходом, який я знайшов, працюючи в Mac і Windows версіях Visual Studio, було зв'язати 2 команди MSBuild:

<Target Name="AfterResolveReferences">
<Exec Command="path\MyFirstCommand.exe -parameters" />
</Target>
<Target Name="MySecondCommand" AfterTargets="AfterResolveReferences" >
<Exec Command="path\MySecondCommand.exe -parameters" />
</Target>

У наведеному вище прикладі використовується подія "AfterResolveReferences", але очевидно, вона повинна працювати і для події PostBuild.


1

Не вдало вирішити цю проблему. Ідея виклику дійсно викликає запуск інших сценаріїв. Я помітив, що виявлення помилок не буде працювати. Помістіть "exit / b 1" у FailMe.cmd Використання "call FailMe.cmd" у кроках створення повідомлення. Помітьте, що збірка не провалюється? Я використовую VS 2017, будуючи проект C #. Тепер спробуйте його з "FailMe.cmd" Тепер збірка повідомляє про помилку.

Тож вам може бути краще просто використовувати один сценарій, якщо важливе повідомлення про помилки.


-4

Тільки префікс "виклик" до вашого пакетного сценарію. Таким чином, що заяви нижче сценарію Batch також виконуються після повернення дзвінка з пакетного сценарію.

call Script1.cmd
call Script2.bat
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.