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

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

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

Ответ 1

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

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


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

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

Ответ 2

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

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

EDIT: Или, если ваше целевое имя отличается от имени проекта.

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

Ответ 3

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

$(SolutionDir)\..\..\

Ответ 4

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

Ответ 5

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

Чтобы включить это в визуальной студии, откройте "Инструменты/Параметры", затем прокрутите вниз по древовидной структуре в раздел "Проекты и решения", разверните его и нажмите "Построить и запустить", справа - это раскрывающийся список, который указывает build output verbosity, установив это для диагностики, покажет вам, какие другие значения макросов вы могли бы использовать.

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

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