Я пытаюсь выполнить задачу, которая изменяет язык/культуру, используемые во время компиляции для проекта конвейера контента XNA, и восстанавливает оригинал после завершения компиляции. Цель состоит в том, чтобы разрешить корректный анализ поплавков на неанглийских машинах.Настройка CultureInfo перед компиляцией и всегда сбрасывается после
До сих пор я использую BeforeBuild и AfterBuild так:
<UsingTask TaskName="PressPlay.FFWD.BuildTasks.SetLocale" AssemblyFile="PressPlay.FFWD.BuildTasks.dll" />
<Target Name="BeforeBuild">
<SetLocale> <!-- By default, set to 'en-US' -->
<Output TaskParameter="PrevLocale" ItemName="OrigLocale" />
</SetLocale>
</Target>
<Target Name="AfterBuild">
<SetLocale Locale="@(OrigLocale)" />
</Target>
Он работает должным образом, за исключением того, когда происходит ошибка во время компиляции (недопустимый XML или ошибки ContentSerializer), после чего локали не будет сброшен , Ответы в SO противоречивы, так как некоторые говорят AfterBuild always executes (не в моем случае), а другие говорят, что после сборки есть no way to ensure a target is always ran. Я не нашел точной информации об этом в Google.
Я знаю, что есть возможность использования PostBuildEvent
и его установка всегда работает, но было бы использовать Exec
запустить команду, и я подозреваю, что он будет работать в отдельном потоке, победив свою цель (я устанавливаю CurrentThread.CultureInfo
изменить языковой стандарт).
Итак, есть ли способ обеспечить, чтобы цель всегда бежала? В качестве альтернативы, есть ли другой способ сказать VS2010 для запуска компиляции с определенной культурой?
Ссылки на документацию, в явном виде разъясняющие проблему, будут очень оценены.
- Окончательное решение после ответа Сева - трубопровод содержание
XNA в не декларирует PreBuildEvent
ни PostBuildEvent
. Другие необходимые свойства (RunPostBuildEvent
, PreBuildEventDependsOn
и PostBuildEventDependsOn
) не определены, либо. Однако, если вы их определяете, конвейер контента будет эффективно использовать их, как в любом другом проекте.
Таким образом, изменения, которые я должен был сделать в файл contentcsproj были:
<!-- Added to ensure the locale is always restored -->
<PropertyGroup>
<RunPostBuildEvent>Always</RunPostBuildEvent>
</PropertyGroup>
<!-- Reference includes, project references and other stuff -->
<!-- ... -->
<Import Project="$(MSBuildExtensionsPath)\Microsoft\XNA Game Studio\$(XnaFrameworkVersion)\Microsoft.Xna.GameStudio.ContentPipeline.targets" />
<!-- Customizations to change locale before compilation and restore it after -->
<!-- Needed to properly treat dots in the XMLs as decimal separators -->
<UsingTask TaskName="PressPlay.FFWD.BuildTasks.SetLocale" AssemblyFile="PressPlay.FFWD.BuildTasks.dll" />
<!-- Apparently ContentPipeline.targets does not define PreBuildEvent and PostBuildEvent -->
<!-- However, they are still used if defined -->
<Target Name="PreBuildEvent" DependsOnTargets="$(PreBuildEventDependsOn)"/>
<Target Name="PostBuildEvent" DependsOnTargets="$(PostBuildEventDependsOn)"/>
<PropertyGroup>
<PreBuildEventDependsOn>
$(PreBuildEventDependsOn);
EstablishUSLocale
</PreBuildEventDependsOn>
</PropertyGroup>
<PropertyGroup>
<PostBuildEventDependsOn>
$(PostBuildEventDependsOn);
RestoreOriginalLocale
</PostBuildEventDependsOn>
</PropertyGroup>
<Target Name="EstablishUSLocale">
<SetLocale Locale="en-US">
<Output TaskParameter="PrevLocale" ItemName="OrigLocale" />
</SetLocale>
</Target>
<Target Name="RestoreOriginalLocale">
<SetLocale Locale="@(OrigLocale)" />
</Target>
С помощью этого решения еще одна проблема косвенно позаботилась о, что потенциальные проблемы, которые могут возникнуть, если другой проект переопределены BeforeBuild или AfterBuild, в результате одно из определений переопределяет другое.
Это решение работает отлично, но мне пришлось адаптировать его для работы с контентом контента XNA. Я подробно расскажу о конечном решении в вопросе, так как он содержит немного кода. – Elideb