Автоматические копии файлов для вывода при создании приложения
Свойство Copy to Output Directory для файлов в проектах С#. Но в проектах VС++ он отсутствует. Я знаю, что я могу использовать события Build в VС++ и писать там что-то вроде
xcopy /y /d %(FullPath) $(OutDir)
Есть ли способ избежать использования CMD (и других методов сценариев)? Может ли msbuild сделать что-то, чтобы помочь в этом случае?
Ответы
Ответ 1
Это зависит от того, какую версию Visual Studio вы используете. Формат файла проекта VС++ в Visual Studio 2008 не является MSBuild, поэтому использование xcopy в PostBuildStep является хорошим выбором.
Проект VС++ в Visual Studio 2010 имеет формат MSBuild. Таким образом, есть функция задачи MSBuild Copy.
Ниже приведен пример:
<Copy
SourceFiles="%(FullPath)"
DestinationFolder="$(OutDir)"
/>
Если каталог назначения не существует, он создается автоматически
Ссылка на задания копирования MSDN здесь
Ответ 2
Может ли MSBuild сделать что-то, чтобы помочь в этом случае?
Используя MSVC 2012, это сработало для меня:
Предположим, что у вас есть файл "Data/ThisIsData.txt" в вашем проекте С++.
Разгрузите проект (щелкните правой кнопкой мыши → Unload Project).
Изменить проект XML (щелкните правой кнопкой мыши → Изменить .vcxproj)
Теперь вы видите проекты MSBuild как XML в своем редакторе.
Найдите "ThisIsData.txt". Он должен выглядеть примерно так:
<ItemGroup>
<None Include="Data\ThisIsData.txt" />
...
</ItemGroup>
Теперь добавьте другую группу элементов, например:
<ItemGroup>
<Content Include="Data\ThisIsData.txt">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
...
</ItemGroup>
Перезагрузите проект и создайте.
Ваш файл "ThisIsData.txt" должен быть скопирован в $(OutDir)\Data\ThisIsData.txt.
Почему дублирование ItemGroup?
Хорошо, если вы просто измените None include на контент, IDE больше не похож на него и не отобразит его. Поэтому, чтобы сохранить возможность быстрого редактирования для моих файлов данных, я решил сохранить дублированные записи.
Ответ 3
В VS 2015 можно дать C-проектам функциональность, которая находится на С#.
(Идея от строительства jochen-ответа.)
Вместо добавления другой ItemGroup, измените данную группу элементов, добавив элемент CopyTo. I.E, используя его пример, просто увеличит исходную запись до:
<ItemGroup>
<None Include="Data\ThisIsData.txt" />
<DeploymentContent>true</DeploymentContent>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
...
</ItemGroup>
Никакой другой группы элементов не требуется. Добавляя элемент CopyTo, вы добавляете свойство "Включено в проект".
![VS 2015 C Свойство с включенным в проект добавлено]()
Ответ 4
Следуя henri-socha answer о VS2015 (и, вероятно, VS2013 и VS2012, или что-либо, используя проекты стиля MSBuild), важно тип элемента ItemGroup.
В частности, элементы <Text>
не копируются, а <Content>
- элементы.
Итак, для каталога проекта Данные, содержащие текстовый файл ThisIsData.txt, это создаст подкаталог Data в каталоге $(OutDir)
и скопирует файл ThisIsData.txt из проекта в него, если он будет более новым:
<ItemGroup>
<Content Include="Data\ThisIsData.txt">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
Это не будет, хотя это будет IDE Visual Studio, если вы добавите текстовый файл в свой проект и установите для свойства Content
значение True
.
<ItemGroup>
<Text Include="Data\ThisIsData.txt">
<DeploymentContent>true</DeploymentContent>
</Text>
</ItemGroup>
Итак, вам нужно добавить файл через IDE, чтобы он понял, что файл включен в проект (который добавляет тег <Text>
ItemGroup), а затем открывает проект в текстовом редакторе и добавляет <Content>
tag ItemGroup, чтобы заставить его делать то, что вы хотите.
Я не уверен, что делает тег <DeploymentContent>
. Это может быть остатком, поскольку единственная ссылка MSDN, которую я нашел, считает архивированной: https://msdn.microsoft.com/en-us/library/aa712517.aspx
Ответ 5
Вы можете указать копирование в файле проекта как Jeff G ответил в другом вопросе:
В файле *.vcxproj
измените:
<Text Include="Filename.txt" />
в
<Content Include="Filename.txt">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
Затем в файле *.vcxproj.filters
измените:
<Text Include="Filename.txt">
<Filter>Resource Files</Filter>
</Text>
в
<Content Include="Filename.txt">
<Filter>Resource Files</Filter>
</Content>
где тег <Text ...>
предназначен для определенных текстовых файлов (это будет <Image ...>
для файлов изображений и т.д.)
Ответ 6
В Visual Studio 2017 вы можете сделать это в IDE. Я не уверен насчет более ранних версий.
Просто добавьте файл как включенный файл проекта, чтобы он отображался в обозревателе решений. Затем щелкните правой кнопкой мыши файл и выберите меню "Свойства".
Измените Содержимое на "Да" и измените Тип элемента на "Копировать файл".
Если вы посмотрите на изменения, внесенные в файл проекта, то увидите, что он добавил следующее:
<ItemGroup>
<CopyFileToFolders Include="Filename.txt">
<DeploymentContent>true</DeploymentContent>
<FileType>Document</FileType>
</CopyFileToFolders>
</ItemGroup>
Ответ 7
Вы также можете изменить целевой каталог под Configuration Properties
→ General
→ Output directory
в каталог, который вы хотите использовать.
Ответ 8
В Visual Studio 2019 после установки файла как "Включить в проект" вы можете отредактировать свойства и выбрать пункт "Тип файла" "Копировать файл" (как показано в https://i.stack.imgur.com/vac2b.png). руководство vcxproj файл редакции.
Ответ 9
Если это dll COM, вы можете добавить его в корень вашего проекта, пометить его как "Контент" и установить для копирования в выходной каталог "Всегда". Я должен был сделать это для сборки сборки подписи подписи.