我最近通过 NuGet 升级了 PostSharp,但它已停止工作,但仅限于极少数情况下。它在我的构建服务器 (TeamCity) 上不起作用,也不适用于我的一个项目。其他项目都正确转换。

我可能会更改哪些内容以仅在我的一个项目中丢失 PostSharp 转换?

最佳答案

如果您遇到这种情况,有两件事需要检查:

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

<SkipPostSharp>True</SkipPostSharp>

该指令可以出现在一个或两个配置中,如果你像我一样,你只能通过你的构建服务器测试后者。

其次,最近的 PostSharp 版本(至少 2.1.7.28+)改变了 MSBuild 目标导入项目的方式,特别是 NuGet。以前PS只是简单的导入targets,如果PostSharp的targets文件不存在,项目就加载不出来。这很麻烦,因为必须先加载项目,然后 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 属性。

    关于.net - 为什么 PostSharp 在构建服务器上跳过我的一个项目?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14991781/

    10-12 14:04