2

XNAコンテンツパイプラインプロジェクトのコンパイル時に使用されるロケール/カルチャを変更し、コンパイルの終了後に元のファイルを復元するタスクを実行しようとしています。英語以外のマシンでフロートを適切に解析できるようにすることを目的としています。

これまでのところ、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は常に実行される(私の場合はそうではない)と言う人もいれば、ビルド後にターゲットが常に実行されるようにする方法がないと言う人もいます。私はグーグルの周りにこれに関する正確な情報を見つけていません。

PostBuildEvent常に実行するように使用および設定するオプションがあることは知っていますがExec、コマンドを実行するために使用し、別のスレッドで実行され、その目的を無効にする可能性があります(CurrentThread.CultureInfoロケールを変更するように設定しました)。

それで、ターゲットが常に実行されるようにする方法はありますか?または、特定のカルチャでコンパイルを実行するようにVS2010に指示する他の方法はありますか?

問題を明確に説明するドキュメントへのリンクをいただければ幸いです。

-セバの答えに従った最終的な解決策-

XNAのコンテンツパイプラインは宣言PreBuildEventも。もしませんPostBuildEvent。その他の必須プロパティ(、、RunPostBuildEventおよびPreBuildEventDependsOnPostBuildEventDependsOnも定義されていません。ただし、それらを定義すると、コンテンツパイプラインは他のプロジェクトと同様にそれらをうまく利用します。

したがって、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を再定義し、一方の定義が他方を上書きした場合に発生する可能性のある潜在的な問題です。

4

1 に答える 1

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ファイルを手動で編集することで実行できます。

于 2012-03-13T15:50:33.010 に答える