最近、NuGet を介して PostSharp をアップグレードしましたが、機能しなくなりましたが、非常に限られたケースでのみです。私のビルド サーバー (TeamCity) では機能せず、私のプロジェクトの1 つだけでは機能しません。他のプロジェクトはすべて正しく変換されます。
自分のプロジェクトの 1 つだけで PostSharp 変換を失うには、何を変更すればよいでしょうか?
これが発生した場合は、次の 2 つの点を確認してください。
まず、デバッグ構成とリリース構成の両方に次の XML が含まれていないことを確認します。
<SkipPostSharp>True</SkipPostSharp>
このディレクティブは、一方または両方の構成に存在する可能性があり、私のような場合は、ビルド サーバーを介して後者のみをテストします。
2 つ目は、最近の PostSharp バージョン (少なくとも 2.1.7.28 以降) では、MSBuild ターゲットをプロジェクトにインポートする方法 (具体的には NuGet を使用) が変更されています。以前は、PS が単にターゲットをインポートしただけで、PostSharp ターゲット ファイルが存在しない場合、プロジェクトは読み込まれませんでした。NuGet がターゲット ファイルを自動的にダウンロードする前にプロジェクトを読み込む必要があったため、これは面倒でした。
これで、インポート ディレクティブは次のようになります。
<Import Project="..\packages\PostSharp.2.1.7.28\tools\PostSharp.targets"
Condition="Exists('..\packages\PostSharp.2.1.7.28\tools\PostSharp.targets')" />
これは、NuGet が処理を完了する前にプロジェクトをロードできることを意味するため、非常に便利です。
残念ながら、プロジェクトを最初にロードするときに、PostSharp ターゲットがロードされないことも意味します。そして、TeamCity では、何らかの理由で、「ビルド前にすべてのファイルを消去する」をオフにしても、それらのターゲットがロードされませんでした。
次のファイルをソース管理にチェックインすると、問題が解決しました。
最後に、予防策として、PostSharp が期待するすべてを適切に変換したことを確認する実行時テスト (単体テストなど) を強くお勧めします。PostSharp アスペクトを使用するプロジェクトごとに、次のような単体テストを検討してください。
Assert.That(MyProject.IsTransformedByPostSharp, Is.True);
プロパティIsTransformedByPostSharp
は単にプロパティをチェックしPost.IsTransformed
ます。