Событие пост-сборки Visual Studio - копирование в относительное местоположение каталога

228

При успешной сборке я хочу скопировать содержимое выходного каталога в другое место в той же «базовой» папке. Эта родительская папка является относительной частью и может варьироваться в зависимости от настроек контроля источника.

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

$ (SolutionDir) = D: \ GlobalDir \ Version \ AppName \ Solution1 \ build

$ (ProjectDir) = D: \ GlobalDir \ Version \ AppName \ Solution1 \ Version \ ProjectA \

Я хочу скопировать содержимое Output Dir в следующую папку:

D: \ GlobalDir \ Version \ AppName \ Solution2 \ Project \ Dependency

Базовое расположение «D: \ GlobalDir \ Version \ AppName» необходимо извлечь из одного из вышеупомянутых макросов. Однако ни одно из значений макроса не содержит только родительское расположение.

Как извлечь только базовое местоположение для команды копирования после сборки?

Preets
источник

Ответы:

188

Если ни один из TargetDir или других макросов не указывает на правильное место, используйте каталог "..", чтобы перейти вверх по иерархии папок.

то есть. Используйте, $(SolutionDir)\..\..чтобы получить базовый каталог.


Список всех макросов смотрите здесь:

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

gbjbaanb
источник
Спасибо!! Хороший совет
Merlyn007
293

Вот что вы хотите поместить в командную строку события Post-build проекта:

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

РЕДАКТИРОВАТЬ: Или, если ваше целевое имя отличается от названия проекта.

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)..\..\
Ichiban
источник
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)..\Вместо этого использование макроса , который является одним и тем же, работал нормально и сохранял полный путь в обоих сценариях сборки.

drzaus
источник
1
перекрестная ссылка на тот же хак, если я забыл отдать должное ...
drzaus
Startработал для меня (для xcopyобщей папки).
AgentFire
4

Не имеет ли смысла использовать msbuild напрямую? Если вы делаете это с каждой сборкой, то вы можете добавить задачу msbuild в конце? Если вы просто хотите посмотреть, не можете ли вы найти другое значение макроса, которое не отображается в Visual Studio IDE, вы можете включить опции msbuild для диагностики, и это покажет вам все переменные, которые вы можете использовать, как а также их текущая стоимость.

Чтобы включить это в Visual Studio, перейдите в Инструменты / Параметры, затем прокрутите вниз древовидное представление до раздела «Проекты и решения», разверните его и нажмите «Построить и запустить», справа - это раскрывающийся список, в котором указывается подробность выходных данных сборки. , установив это на диагностику, покажет вам, какие другие значения макросов вы можете использовать.

Поскольку я не совсем знаю, на какой уровень вы хотели бы перейти и насколько сложным вы хотите, чтобы ваша сборка была, это может дать вам некоторое представление. Недавно я делал сценарии сборки, которые даже исполняют код SQL как часть сборки. Если вам нужна дополнительная помощь или даже примеры сценариев сборки, дайте мне знать, но если это просто небольшой процесс, который вы хотите запустить в конце сборки, возможно, полноценный сценарий msbuild будет слишком сложным. ,

Надеюсь, это поможет Rihan

Рихан Мейдж
источник
спасибо Rihan, но, видимо, VS 2003, кажется, не поддерживает это! Я, конечно, вполне доволен событием пост-сборки ;-)
Preets
Я не осознавал, что это был vs2003, и, следовательно, использование msbuild в качестве возможного решения, если я не забуду, что vs2003 было до эры msbuild? Спасибо за ответ. Удачи с VS 2003, я не оглядывался назад после перехода на VS2005
Rihan Meij