Событие посткомпоновки Visual Studio - копирование в относительное местоположение каталога - PullRequest
208 голосов
/ 07 мая 2009

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

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

$ (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» необходимо извлечь из одного из вышеупомянутых макросов. Тем не менее, ни один из значений макросов только не является родительским местоположением.

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

Ответы [ 5 ]

262 голосов
/ 15 сентября 2010

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

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

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

copy /Y "$(TargetDir)$(TargetName).dll" "$(SolutionDir)lib\$(TargetName).dll"
173 голосов
/ 07 мая 2009

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

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


Список всех макросов см. Здесь:

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

39 голосов
/ 07 мая 2009

Вы можете попробовать:

$(SolutionDir)..\..\
10 голосов
/ 30 декабря 2013

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

4 голосов
/ 07 мая 2009

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

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

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

Надеюсь, это поможет Рихан

...