Я работаю над игровым движком, который хранит контент (аудиофайлы, файлы конфигурации, текстуры и т. Д.) В подпапке «Контент» в проекте. Основные файлы хранятся в $ (ProjectDir) / Content и должны копироваться в отдельные целевые каталоги («Debug / Content» и «Release / Content») при каждом изменении основных файлов.
Я использую событие после сборки, которое работает довольно хорошо:
XCOPY «Содержимое $ (ProjectDir)» «Содержимое $ (TargetDir)» / I / D / E / C / Y
К сожалению, это работает только если сборка & происходит соединение, т. е. мне нужно «прикоснуться» к некоторому файлу .cpp, чтобы запустить его, иначе VS никогда не выполнит команду XCOPY после сборки.
Есть ли способ заставить его всегда запускать команды в Build (F6) или Run (F5)? Или, может быть, лучший способ обработки файлов содержимого в проекте? Надеясь быстро настроить файлы содержимого, а затем запустить игру для предварительного просмотра.
Это в Visual Studio 2012 Professional.
Изменить: Предыдущая версия моего ответа была технически правильной, но не так легко настроить, как этот.
Откройте файл .vcxproj и включите эти строки в нижней части:
<Target Name="CopyContent" AfterTargets="Build">
<ItemGroup>
<ContentFiles Include="ContentFiles/*.png" />
</ItemGroup>
<Copy DestinationFolder="Debug/Content/"SkipUnchangedFiles="True"SourceFiles="@(ContentFiles)"UseHardlinksIfPossible="True" />
</Target>
Это скопирует все измененные файлы, независимо от состояния других ваших исходных файлов (т. Е. Даже если вам не нужно компилировать какой-либо код, MSBuild все равно будет следить за тем, чтобы ваши файлы содержимого были обновлены).
ХОРОШО! Нашел решение этой проблемы — используя какой-то неясный синтаксис MSBuild. Основано на ответе Моссвальда и некоторых исследованиях онлайн.
<Target Name="CopyContent" AfterTargets="Build">
<ItemGroup>
<DeployFileGroup
Include="**\*.json;**\*.png;**\*.wav;**\*.mp3;" />
</ItemGroup>
<Copy SourceFiles="@(DeployFileGroup)"DestinationFiles="@(DeployFileGroup->'$(TargetDir)%(RecursiveDir)\%(Filename)%(Extension)')"SkipUnchangedFiles="True" UseHardlinksIfPossible="True"/>
</Target>