Копирование файлов проектов Visual Studio в выходной каталог во время сборки

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

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

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

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

7 ответов


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

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

    xcopy /y $(ProjectDir)my_file.ini  $(ProjectDir)$(OutDir)
    
  4. OK и построить!


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

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

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

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

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

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

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


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

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

Command Line : copy $(InputFileName) $(OutDir)
Description  : Copying foobar...
Outputs      : $(InputFileName)

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

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

Copying foobar...
        1 file(s) copied.
Compiling resources...
Linking...

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

xcopy /y "$(ProjectDir)my_file.ini"  "$(OutDir)"

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


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

CommandLine : copy "$(SolutionDir)last-script.js" "$(TargetDir)Debug"

Outputs  : $(TargetDir)Debug\last-script.js

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

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

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

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


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

xcopy /y "$(ProjectDir)$(OutDir)$(TargetName)$(TargetExt)" 
"C:\Application\MyApplicationName\bin\x86\Debug"

/y = overwrite file if already exists
$(ProjectDir) = location on your machine where the project lives
$(OutDir) = is where your current build setup outputs the build
$(TargetName) = What the project being built is set to be called. Ex: XXX of XXX.dll
$(TargetExt) = the extension of the build Ex: .dll of XXX.dll

"C:/..../x86/Debug" is the location to copy to.