为什么PostSharp会在构建服务器上跳过我的一个项目?

lad*_*dge 3 .net teamcity postsharp

我最近通过NuGet升级了PostSharp并且它已停止工作,但仅限于非常精选的情况.它在我的构建服务器(TeamCity)上不起作用,并且它不仅适用于我的一个项目.其他项目都正确转换.

我可以改变什么才能在我的一个项目中失去PostSharp转换?

lad*_*dge 6

如果发生这种情况,有两件事需要检查:

首先,确保您的调试和发布配置都不包含以下XML:

<SkipPostSharp>True</SkipPostSharp>
Run Code Online (Sandbox Code Playgroud)

该指令可以存在于一个或两个配置中,如果您像我一样,您只能通过构建服务器测试后者.


其次,最近的PostSharp版本(至少2.1.7.28+)改变了MSBuild目标导入项目的方式,特别是NuGet.过去,PS只是导入目标,如果PostSharp目标文件不存在,则项目无法加载.这是一个麻烦,因为在NuGet可以自动下载目标文件之前必须加载项目.

现在,import指令如下所示:

<Import Project="..\packages\PostSharp.2.1.7.28\tools\PostSharp.targets"
        Condition="Exists('..\packages\PostSharp.2.1.7.28\tools\PostSharp.targets')" />
Run Code Online (Sandbox Code Playgroud)

这非常方便,因为这意味着在NuGet完成它之前项目仍然可以加载.

不幸的是,这也意味着当您第一次加载项目时,将不会加载PostSharp目标.而在TeamCity上,出于某种原因 - 即使在"未构建清除所有文件"之前 - 它也从未加载过这些目标.

将以下文件检入源代码控制可以解决问题:

  • PostSharp.properties
  • PostSharp.targets
  • PostSharp.tasks

最后,作为预防措施,我绝对推荐一些运行时测试(例如单元测试),以确保PostSharp正确转换了您期望的所有内容.对于使用PostSharp方面的每个项目,请考虑以下单元测试:

Assert.That(MyProject.IsTransformedByPostSharp, Is.True);
Run Code Online (Sandbox Code Playgroud)

酒店IsTransformedByPostSharp只是检查Post.IsTransformed财产.