我最近通过 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 上,出于某种原因——即使未选中“在构建之前清除所有文件”——它从未加载这些目标。
将以下文件 checkin 源代码管理解决了问题:
- PostSharp.properties
- PostSharp.targets
- PostSharp.tasks
最后,作为预防措施,我绝对推荐一些运行时测试(例如单元测试),以确保 PostSharp 已正确转换您期望的一切。对于每个使用 PostSharp 方面的项目,考虑这样的单元测试:
Assert.That(MyProject.IsTransformedByPostSharp, Is.True);
其中属性 IsTransformedByPostSharp
只是检查 Post.IsTransformed
属性(property)。
关于.net - 为什么 PostSharp 会跳过我在构建服务器上的一个项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14991781/