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