it-roy-ru.com

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

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

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

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

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

32
Synetech

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

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

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

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

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

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

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

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

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

33
Dmitry Pavlov

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

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

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

27
Dmitry Pavlov

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

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

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

1
Kieran Chandler

В случае, если это кому-нибудь поможет, мне нужно было скопировать 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.
0
vbp13

Улучшение Synetech Answer:

В VS 2013 проект C++ Командная строка: copy% (Identity) $ (OutDir) Описание: Копирование foobar ... Outputs:% (Identity) Работает, но приводит к циклической зависимости, то есть будет выполняться каждый раз Вы требуете инкрементной сборки, без метра она уже скопирована. 

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

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

0
user1837919

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

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

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