Подія Visual Studio Post Build - скопіюйте у відносне розташування каталогу


228

Після успішної збірки я хочу скопіювати вміст вихідного каталогу в інше місце під тією ж «базовою» папкою. Ця батьківська папка є відносною частиною і може змінюватися залежно від налаштувань контролю джерела.

Я перерахував декілька доступних мені значень макросів ...

$ (SolutionDir) = D: \ GlobalDir \ Версія \ AppName \ Solution1 \ build

$ (ProjectDir) = D: \ GlobalDir \ Версія \ AppName \ Рішення1 \ Версія \ ПроектA \

Я хочу скопіювати вміст виводу Dir у таку папку:

D: \ GlobalDir \ Версія \ AppName \ Рішення2 \ Проект \ Залежність

Базове розташування "D: \ GlobalDir \ Версія \ AppName" потрібно отримати з одного з вищевказаних макросів. Однак жодне зі значень макросу не містить лише батьківського розташування.

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

Відповіді:


188

Якщо жоден з TargetDir або інших макросів не вказує на потрібне місце, скористайтеся каталогом "..", щоб повернутися назад до ієрархії папок.

тобто. Використовуйте $(SolutionDir)\..\..для отримання базового каталогу.


Список усіх макросів див. Тут:

http://msdn.microsoft.com/en-us/library/c02as0cs.aspx


Дякую!! Гарна порада
Merlyn007

293

Ось що ви хочете розмістити в командному рядку проекту "Побудувати" після проекту:

copy /Y "$(TargetDir)$(ProjectName).dll" "$(SolutionDir)lib\$(ProjectName).dll"

EDIT: Або якщо ваше цільове ім’я відрізняється від назви проекту.

copy /Y "$(TargetDir)$(TargetName).dll" "$(SolutionDir)lib\$(TargetName).dll"

1
Гарна порада. Я забув цитати.
Метт Монтаг

3
Це не працювало для мене, тому що я забув /Y. Дякуємо, що показали всю команду.
Марк

10
Можна xcopyдосягти подібного результату за допомогою символів підстановки та відповідних комутаторів, зберігаючи структуру (дерево) вихідної папки, наприклад:xcopy /i /e /s /y /f "<source>\MyFolder\*" "<destination>\MyFolder"
Dr1Ku

4
Я б запропонував використовувати $ (TargetName) замість $ (ProjectName) у вихідній частині.
Олександр Шмідт

2
оновлення до моїх поперед. коментар: copy /Y "$(TargetPath)" "$(SolutionDir)somewhere\"без додаткової косої риски, оскільки $ (SolutionDir) містить зворотний нахил (принаймні в VS2012)
крижаний

40

Ви можете спробувати:

$(SolutionDir)..\..\

8
Будь ласка, майте на увазі, що змінна $ (SolutionDir) вже має зворотну косу рису. Джерело: "Каталог рішення (визначений приводом і контуром); включає в себе зворотну косу рису" \ "." msdn.microsoft.com/en-us/library/42x5kfw4.aspx
Snicker

10

Я думаю, це пов’язано, але у мене виникла проблема при побудові безпосередньо за допомогою msbuildкомандного рядка (з пакетного файлу) проти будівлі зсередини VS.

Використовуючи щось таке:

<PostBuildEvent>
  MOVE /Y "$(TargetDir)something.file1" "$(ProjectDir)something.file1"
  start XCOPY /Y /R "$(SolutionDir)SomeConsoleApp\bin\$(ConfigurationName)\*" "$(ProjectDir)App_Data\Consoles\SomeConsoleApp\"
</PostBuildEvent>

(зверніть увагу: start XCOPYзамість того, щоб XCOPYвикористовувати проблему дозволів, яка перешкоджала копіюванню)

Макрос, який $(SolutionDir)оцінюється ..\при виконанні msbuild з пакетного файлу, в результаті чого XCOPYкоманда не вдалася . Інакше він працював чудово, будуючи його з Visual Studio. Підтверджено за допомогою/verbosity:diagnostic щоб побачити оцінений вихід.

Використання макросу $(ProjectDir)..\, що означає те саме, працювало чудово і зберігало повний шлях в обох сценаріях складання.


1
перехресне посилання на той самий хак, якщо я забув дати кредит ...
drzaus

Startпрацював на мене (для xcopyспільної папки).
AgentFire

4

Чи не було б сенсу безпосередньо використовувати msbuild? Якщо ви робите це з кожною збіркою, то можете наприкінці додати завдання msbuild? Якщо ви просто хочете побачити, чи не можете ви знайти інше значення макросу, яке не відображається на ID Visual Studio IDE, ви можете переключити параметри msbuild на діагностику, і це покаже всі змінні, які ви могли б використовувати, як а також їх поточне значення.

Щоб увімкнути це у візуальній студії, перейдіть до Інструменти / Параметри, потім прокрутіть подання по дереву до розділу під назвою "Проекти та рішення", розгорніть його та натисніть на "Створити та запустити", праворуч - це спад, який визначає багатослівність виведення збірки. , встановивши це для діагностики, покаже, які інші макро значення ви можете використовувати.

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

Сподіваюся, це допоможе Ріхану


thx Rihan, але, мабуть, VS 2003, схоже, не підтримує цього! Я, звичайно, дуже задоволений подією події, що
склалася

Я не усвідомлював, що це vs2003, а отже, використання msbuild як можливого рішення, якщо я пригадую vs2003 був до епохи msbuild? Дякуємо за відповідь. Пощастило з VS 2003, я не озирнувся після переходу на VS2005
Rihan Meij
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.