我最近通过 NuGet 升级了 PostSharp,但它已停止工作,但仅在极少数情况下。它不适用于我的构建服务器(TeamCity),也不适用于我的一个项目。其他项目都正确转换。
仅在我的一个项目中丢失 PostSharp 转换可能会发生什么变化?
如果发生这种情况,有两件事需要检查:
首先,确保您的调试和发布配置不包含以下 XML:
<SkipPostSharp>True</SkipPostSharp>
该指令可以出现在一种或两种配置中,如果你像我一样,你只能通过你的构建服务器测试后者。
其次,最近的 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
属性。