Visual studio копировать после сборки

Обновлено: 04.07.2024

Когда я создаю проект Visual Studio, исполняемый файл записывается в выходной каталог, указанный на странице свойств проектов.

У меня есть проект, который имеет некоторые дополнительные файлы (например, файл .ini ), которые используются программой.

Как я могу настроить проект для копирования файла в выходной каталог, чтобы при запуске программы в его CWD была копия другого файла?

Я проверил страницу свойств файла, и не было ничего полезного, кроме возможности исключить ее из сборки (которая отключена), а команда custom-build-tool пуста (плюс это простой текстовый файл, который делает не нужно никакой обработки).

Пока я искал страницу свойств файла для поля действия при сборке, у меня возникла мысль: установить для пользовательского шага сборки значение копировать файл (вручную). Это оказалось проще, чем я думал. Я подумал, что это потребует использования cmd или другого внешнего исполняемого файла ( xcopy , robocopy и т.д.), Но это не обязательно.

Я настроил шаг пользовательской сборки следующим образом:

Установка поля выходных данных (правильно) имела решающее значение для предотвращения того, чтобы VS всегда считал, что проект устарел и требует перестройки (я не уверен, нужно ли добавлять префикс $(OutDir)\ ).

Это отражается в окне вывода как таковое:

Для копирования файлов в выходной каталог в Visual Studio 2003 вы можете использовать событие Post-Build:

  1. Щелкните правой кнопкой мыши на проекте-> Свойства
  2. Общие свойства-> События сборки

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

Пожалуйста, попробуйте выбрать файл в обозревателе решений. Тогда вы сможете увидеть его свойства в окне свойств (нажмите F4 если не видно). Вы найдете там два свойства:

  • "Build Action" и
  • "Копировать в выходной каталог"

Установите "Build Action" на "Content", а затем - выберите соответствующее значение для параметра "Copy to Output Directory".

Окно свойств файла с настройками "Build Action" и "Copy to Output Directory"

File properties window with "Build Action" and "Copy to Output Directory" settings

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

Для VS 2017 команда Дмитрия Павлова будет выглядеть следующим образом:

Кавычки важны, если в пути к каталогу проекта есть пробелы.

В случае, если это кому-нибудь поможет, мне нужно было скопировать dll проекта, который я строил, в другой проект.

когда я создаю проект Visual Studio, исполняемый файл записывается в выходной каталог, указанный на странице свойств проектов.

У меня есть проект, который имеет некоторые дополнительные файлы (например, .ini file), которые используются программой.

Как я могу настроить проект для копирования файла в выходной каталог, чтобы при запуске программы в его CWD была копия другого файла?

Я проверил страницу свойств файла и ничего не было полезно, кроме опции, чтобы исключить его из сборки (которая отключена), и команда custom-build-tool пуста (плюс это простой текстовый файл, который не требует никакой обработки).

для копирования файлов в выходной каталог в Visual Studio 2003 можно использовать событие после сборки:

  1. щелкните правой кнопкой мыши на проекте - > свойства
  2. Общие Свойства->События Построения

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

попробуйте выбрать файл в обозревателе решений. Затем вы сможете увидеть его свойства в окне свойств (нажмите Ф4 если он не виден). Вы найдете там два свойства:

  • "действие при построении" и
  • "копировать в выходной каталог"

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

окно свойств файла с " действием сборки" и" копировать в выходной каталог " настройки

File properties window with

Если выше способ не работает для Вас, пожалуйста, прочитайте этот пост "копировать в выходной каталог с выпуска .inf-файл". И взгляните-ка на это!--20-->Visual Studio: действие сборки по умолчанию для нестандартных типов файлов"

надеюсь, что это поможет

пока я искал на странице свойств файла поле build-action, у меня возникла мысль: установите шаг пользовательской сборки в скопировать файл (вручную). Это оказалось проще, чем я думал. Я полагал, что это потребует использования cmd или другой внешний исполняемый файл ( xcopy , robocopy , etc.), но в этом нет необходимости.

Я установил шаг пользовательской сборки следующим образом:

установка поля выходов (правильно) была критической для того, чтобы не позволяйте VS всегда думать, что проект устарел и требует перестройки (я не уверен, что он должен быть префиксом $(OutDir)\ ).

это отражается в окне "вывод", как например:

для VS 2017 команда Дмитрий Павлов опубликовал бы следующее:

кавычки важны, если в пути к каталогу проекта есть пробелы.

вам нужен дополнительный $(OutDir). В противном случае на шаге rebuild/clean он выбросит ваш источник.

Улучшение Synetech ответ :

в командной строке VS 2013 C++ project: copy %(Identity) $(OutDir) описание : копирование foobar. Выходные Данные: %(Identity) Он работает , но это приводит к круговой зависимости, т. е. он будет выполняться каждый раз, когда вы требуете инкрементной сборки, ни один метр уже не был скопирован.

чтобы решить эту проблему, вы можете добавить этот элемент в целевую папку, изменить путь на $(OutDir) и использовать его в первом добавленном элементе в качестве вывода. Недостаток-два пункта с похожие названия есть в решении.

также полезно xcopy с параметрами /d /y в postbuild - копировать, только если дата целевого файла старше.

если это кому-то поможет, мне нужно было скопировать выходную dll проекта, который я строил в другой проект.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Используя что-то вроде следующего:

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

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

Использование вместо этого макроса $(ProjectDir)..\ , который представляет собой одно и то же, работает нормально и сохраняет полный путь в обоих сценариях сборки.

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

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

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

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

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

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

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

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

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

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

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

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

Это не сработало для меня, потому что я забыл /Y . Спасибо за показ всей команды. Можно использовать xcopy с подстановочными знаками и соответствующими переключателями для достижения аналогичного результата, сохраняя при этом структуру (дерево) исходной папки, например: xcopy /i /e /s /y /f "<source>\MyFolder\*" "<destination>\MyFolder" Я бы предложил использовать $ (TargetName) вместо $ (ProjectName) в исходной части. обновить до моего пред. Комментарий: copy /Y "$(TargetPath)" "$(SolutionDir)somewhere\" без дополнительной обратной косой черты, так как $ (SolutionDir) включает в себя обратную косую черту (по крайней мере в VS2012)

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

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

Используя что-то вроде следующего:

(примечание: start XCOPY вместо того, XCOPY чтобы обойти проблему с разрешениями, которая помешала копированию)

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

$(ProjectDir)..\ Вместо этого использование макроса , который является одним и тем же, работал нормально и сохранял полный путь в обоих сценариях сборки.

перекрестная ссылка на тот же хак, если я забыл отдать должное .

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

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

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

Читайте также: