it-roy-ru.com

Автоматическое копирование файлов для вывода при сборке приложения

Существует Копировать в выходной каталог свойство для файлов в проектах C #. Но в проектах VC++ его нет. Я знаю, что я могу использовать Создать события в VC++ и написать там что-то вроде

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

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

50
Loom

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

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

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

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

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

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

11
Anton K

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

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

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

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

87
jochen

В VS 2015 можно дать проектам C функциональность, которая есть в C # . (Идея состоит в построении ответа jochen.) Вместо добавления другой 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

17
Henri Socha

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

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

Так, для каталога проекта Data, содержащего текстовый файл ThisIsData.txt, это создаст подкаталог Data в каталоге $(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

5
WaffleSouffle

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

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