3


1

フォントを埋め込むと、Silverlightプロジェクトは常に再構築されます

私のSilverlight 4プロジェクトには奇妙な問題がありますが、それは私が以前に見たものです。 基本的に、フォントを埋め込むと、すべてが最新であっても、Silverlightアプリは常に再構築を強制されます。 フォントの埋め込みタスクは多くのメモリを必要とし、最終的にはVSをクラッシュさせるため、この種の問題はありません。 コマンドラインからプロジェクトをビルドできるようにしたいのですが、ローカルプロジェクトが古くなっていても、「実行」コマンドは別のリビルドを強制します。 msbuildログから、関連するログ情報の一部を切り取ろうとしました。

Project "D:\Projects\Test\Test.Web\Test.Web.csproj" (10) is building "D:\Projects\Test\Test.SL\Test.SL.csproj" (2:4) on node 1 (default targets).
Building with tools version "4.0".
// Build operation starts normally (well, the dependency set on the server project is forcing the SL application to build).
...
Target "ResolveReferences" skipped. Previously built successfully.
// A bunch of tasks are skipped (like this one)
...
Target "SubsetFontsSilverlight" in file "C:\Program Files\MSBuild\Microsoft\Expression\Blend\Silverlight\v4.0\SubsetFontSilverlight.targets" from project "D:\Projects\Test\Test.SL\Test.SL.csproj" (target "PrepareResources" depends on it):
Using "SubsetFontsSilverlight" task from assembly "C:\Program Files\MSBuild\Microsoft\Expression\Blend\Silverlight\v4.0\SubsetFontTask.dll".
Task "SubsetFontsSilverlight"
Done executing task "SubsetFontsSilverlight".
Done building target "SubsetFontsSilverlight" in project "Test.SL.csproj".
// this task never gets skipped
...
Target "MainResourcesGeneration" in file "C:\Program Files\MSBuild\Microsoft\Silverlight\v4.0\Microsoft.Silverlight.Common.targets" from project "D:\Projects\Test\Test.SL\Test.SL.csproj" (target "PrepareResources" depends on it):
Building target "MainResourcesGeneration" completely.
Input file "obj\Debug\Fonts\Fonts.zip" is newer than output file "obj\Debug\Test.SL.g.resources".
// note that the Fonts.zip file now makes the resources file out of date
...
Target "CoreCompile" in file "C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\Microsoft.CSharp.Targets" from project "D:\Projects\Test\Test.SL\Test.SL.csproj" (target "Compile" depends on it):
Building target "CoreCompile" completely.
Input file "obj\Debug\Test.SL.g.resources" is newer than output file "obj\Debug\Test.SL.pdb".
// and the full recompile begins...

とにかく、フォントファイルが変更されていない場合、フォントタスクの実行を停止する方法はありますか? 継続的な再構築は本当に面倒だからです。

更新:プロジェクトファイルのサンプルフォント。

  True
  True
  True


  True
  True
  True
  True

更新2:

ちょっとした再現プロジェクトを投稿したいのですが、zipファイルをどこに投げればいいのかわかりません。 いずれにせよ、数秒でフラットにホイップできます。 手順は次のとおりです。

  1. Sillverlightアプリケーションを作成します(BlendまたはVS、Blendが必要ですが これがとにかく動作するように)

  2. Blendでフォントマネージャー([ツール]→ [フォントマネージャー])を使用します。 MainPage.xamlを開いて有効にします。 「Tahoma」フォントを埋め込みます。

これで、「再構築」を押すたびに、何かが変更されたかどうかに関係なく、csc.exeが毎回実行されることを確認できます。

2 Answer


2


SubsetFontSilverlight.targetファイルを少しハックして、この問題を回避しました。 それは完全な修正ではなく、必ずしもすべての人にとってうまくいくわけではありませんが、私にとってはうまくいきます。

ターゲットファイルは、少なくとも私のマシンでは、C:\ Program Files \ MSBuild \ Microsoft \ Expression \ Blend \ Silverlight \ v4.0にあります。

ここでの主なアイデアは、MSBUILDターゲットのInput / Ouputプロパティを使用して、中間のFont.zipファイルを更新する必要があるかどうかを確認することです。 常にデフォルトのBlendフォントの場所を使用するため、単に出力ファイルパスをハードコーディングしましたが、個々のフォントファイルから構築することは可能です。

私が設定した条件は、Font.zipファイルが埋め込みフォントファイルとプロジェクトファイルよりも新しい場合、タスクをスキップすることです。 そうすれば、フォントを追加/減算したり、フォントの1つを置き換えたりすると、フォントは再埋め込みされますが、変更がない場合(またはコードを変更する場合)、font.zipはそのまま残されます。

フォントが埋め込まれていない場合は、fonts.zipをリソースコレクションに手動で追加することが重要です。コードを再コンパイルする必要があるが、フォントをそのままにしておく場合、msbuildはフォントファイルをリソースに含めることを覚えています。 これが、メインの埋め込みタスクの後に実行する新しいタスクを追加した理由です。

            SubsetFontsSilverlight;
            $(PrepareResourcesDependsOn);





            $(CleanDependsOn);
            CleanSubsetFonts;

Visual Studioは、プロジェクトが最新のものであることを認識するのにまだ優れていませんが、ビルドすると、corecompileタスクが毎回実行されず、dllファイルが不必要に上書きされることはありません。 これは、コマンドラインでコンパイラを実行し、デバッグ時にVSを「Never Build」に設定しても、正しいデバッグシンボルをロードできることを意味します。

私は考えることができるほとんどの状況でこれをテストしました(クリーンの前/後、ファイルの欠落、コードの変更のみ、プロジェクトの変更など)、それはうまくいくようです-フォントがそこにあり、すべてが常にではないことを意味します再コンパイルされます。


1


私はEgorの答えを使用してきましたが、それは特に再構築時にビルド時間を短縮するのに非常に役立ちました。 ただし、最近の変更により問題が発生しました - プロジェクトフォルダーの\ Fontsから\ Assets \ Fontsにフォントを移動しました。 ターゲットファイルはobj \ Debug \ Fonts \ Fonts.zipの最新のチェックを試みていましたが、タスクはobj \ Debug \ Assets \ Fonts \ Fonts.zipを作成していました。

中間出力パスの適切な相対ディレクトリでFonts.zipファイルをチェックするようにターゲットファイルを修正しました。 このターゲットファイルは、異なるフォルダに含まれる複数のフォントで動作します。