Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 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 PropertiesGeneralOutput directory в каталог, который вы хотите использовать.

Ответ 8

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

Ответ 9

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