3

最近、NuGet を介して PostSharp をアップグレードしましたが、機能しなくなりましたが、非常に限られたケースでのみです。私のビルド サーバー (TeamCity) では機能せず、私のプロジェクトの1 つだけでは機能しません。他のプロジェクトはすべて正しく変換されます。

自分のプロジェクトの 1 つだけで PostSharp 変換を失うには、何を変更すればよいでしょうか?

4

1 に答える 1

6

これが発生した場合は、次の 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.properties
  • PostSharp.targets
  • PostSharp.タスク

最後に、予防策として、PostSharp が期待するすべてを適切に変換したことを確認する実行時テスト (単体テストなど) を強くお勧めします。PostSharp アスペクトを使用するプロジェクトごとに、次のような単体テストを検討してください。

Assert.That(MyProject.IsTransformedByPostSharp, Is.True);

プロパティIsTransformedByPostSharpは単にプロパティをチェックしPost.IsTransformedます。

于 2013-02-20T23:21:17.297 に答える