2012-03-13 1 views
2

Я пытаюсь выполнить задачу, которая изменяет язык/культуру, используемые во время компиляции для проекта конвейера контента 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, в результате одно из определений переопределяет другое.

ответ

0

Вы можете использовать PostBuildEvent, потому что вы можете настроить его выполнение после сборки. Однако, как вы правильно заметили, использование Exec-задачи здесь не сработает. Однако PostBuildEvent фактически расширяется через свойство $ (PostBuildEventDependsOn). Вам нужно будет определить это свойство:

<PropertyGroup> 
    <PostBuildEventDependsOn>RestoreOriginalLocale</PostBuildEventDependsOn> 
</PropertyGroup> 

Цель RestoreOriginalLocale является то, что вы имели в вашей цели AfterBuild:

<Target Name="RestoreOriginalLocale"> 
    <SetLocale Locale="@(OrigLocale)" /> 
</Target> 

Ваша цель BeforeBuild по-прежнему нужен, он остается таким же, что вы написали в своем вопросе ,

Чтобы обеспечить выполнение PostBuildEvent при сбое (и, следовательно, для выполнения RestoreOriginalLocale), вам необходимо установить свойство RunPostBuildEvent в Always. Вы можете сделать это через IDE или вручную отредактировать файл .csproj.

+0

Это решение работает отлично, но мне пришлось адаптировать его для работы с контентом контента XNA. Я подробно расскажу о конечном решении в вопросе, так как он содержит немного кода. – Elideb

Смежные вопросы