Автоматическое копирование файлов для вывода при сборке приложения - PullRequest
55 голосов
/ 25 апреля 2011

Существует Свойство Copy to Output Directory для файлов в проектах C #. Но в проектах VC ++ это отсутствует. Я знаю, что я могу использовать Build events в VC ++ и писать там что-то вроде

xcopy /y /d %(FullPath) $(OutDir)

Есть ли способ избежать использования CMD (и других методов сценариев)? Может ли msbuild что-то сделать, чтобы помочь в этом случае?

Ответы [ 8 ]

91 голосов
/ 05 ноября 2012

Может ли MSBuild чем-то помочь в этом случае?

Используя MSVC 2012, это сработало для меня:

Предполагается, что у вас есть файл "Data / ThisIsData.txt "в вашем проекте c ++.

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

17 голосов
/ 12 января 2017

В VS 2015 можно дать проектам C функциональность, которая есть в C #. (Идея построения ответа Йохена.) Вместо добавления другой ItemGroup, измените данную группу элементов, добавив элемент CopyTo. И.Е., используя свой пример, просто улучшите исходную запись до:

<ItemGroup>
  <None Include="Data\ThisIsData.txt" />
    <DeploymentContent>true</DeploymentContent>
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
...
</ItemGroup>

Никакая другая ItemGroup не требуется. Добавляя элемент CopyTo, вы добавляете свойство «Включено в проект».

VS 2015 C Property with Included In Project added

13 голосов
/ 26 апреля 2011

Это зависит от того, какую версию Visual Studio вы используете. Формат файла проекта VC ++ в Visual Studio 2008 отличается от MSBuild, поэтому использование xcopy в PostBuildStep является хорошим выбором.

Проект VC ++ в Visual Studio 2010 имеет формат MSBuild. Таким образом, есть функциональность задачи MSBuild Copy.

Ниже приведен образец:

<Copy
    SourceFiles="%(FullPath)"
    DestinationFolder="$(OutDir)"
/>

Если каталог назначения не существует, он создается автоматически

Ссылка на задачу копирования MSDN здесь

5 голосов
/ 16 марта 2017

После ответа Генри Соча о VS2015 (и, вероятно, VS2013 и VS2012 или что-либо, использующее проекты в стиле MSBuild), важен тип элемента ItemGroup.

В частности <Text> элементы делаюткажется, что не копируются, тогда как <Content> элементы делают.

Итак, для каталога проекта Данные , содержащего текстовый файл ThisIsData.txt , это создастПодкаталог Данные в каталоге $(OutDir) и скопировать в него файл ThisIsData.txt из проекта, если он более новый:

<ItemGroup>
  <Content Include="Data\ThisIsData.txt">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </Content>
</ItemGroup>

Это не будет,хотя это то, что Visual Studio IDE будет вставлять, если вы добавите текстовый файл в свой проект и установите для свойства Content значение True.

<ItemGroup>
  <Text Include="Data\ThisIsData.txt">
    <DeploymentContent>true</DeploymentContent>
  </Text>
</ItemGroup>

Другими словами, вам нужно добавитьфайл через IDE, чтобы он понял, что файл включен в проект (который добавляет <Text> тег ItemGroup), а затем откройте проект в текстовом редакторе и добавьте тег <Content> ItemGroup, чтобы заставить его делать то, что вы хотите.

Я не уверен, чтотег <DeploymentContent> на самом деле делает.Это может быть остаток, так как единственная ссылка на MSDN, которую я смог найти, считает ее заархивированной: https://msdn.microsoft.com/en-us/library/aa712517.aspx

1 голос
/ 17 июня 2019

В Visual Studio 2017 вы можете сделать это в IDE.Я не уверен насчет более ранних версий.

Просто добавьте файл как включенный файл проекта, чтобы он отображался в обозревателе решений.Затем щелкните файл правой кнопкой мыши и выберите меню «Свойства».

Измените содержимое на «Да» и измените тип элемента на «Копировать файл»

Если вы посмотрите на изменения, внесенные вфайл проекта, который вы видите, добавил это:

<ItemGroup>
  <CopyFileToFolders Include="Filename.txt">
    <DeploymentContent>true</DeploymentContent>
    <FileType>Document</FileType>
  </CopyFileToFolders>
</ItemGroup>
1 голос
/ 12 декабря 2017

Вы можете указать копирование в файле проекта как Джефф Г ответил в другом вопросе:

В файле *.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 ...>)

0 голосов
/ 11 июля 2019

В Visual Studio 2019 после установки файла как «Включить в проект» вы можете отредактировать свойства и выбрать в качестве Типа элемента «Копировать файл» (как показано в https://i.stack.imgur.com/vac2b.png) Это позволяет избежать ручного редактирования файла vcxproj.

0 голосов
/ 11 декабря 2013

Если это COM dll, вы можете добавить его в корень вашего проекта, пометить его как «Содержимое» и установить для копии в выходной каталог значение «Всегда».Я должен был сделать это для сборки COM захвата подписи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...