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

标签 .net teamcity postsharp

我最近通过 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/

相关文章:

c# - volatile 字段 : How can I actually get the latest written value to a field?

powershell - 使用 Powershell 打开或提取文件 nupkg

.net - 构建后删除 PostSharp 引用?

c# - 使用PostSharp如何获取原方法中的方法名?

c# - 使用ModernUI + Caliburn.Micro组合重新实现WindowManager

.net - 添加扩展方法我觉得应该在框架: bad idea?

tfs - Team Foundation Build 还是 TeamCity?

build - Teamcity - 参数化构建

c# - 如何在方法中使用多个返回语句在 PostSharp 中应用异常方面?

.net - 部署/构建工作 Orchard CMS 网站时出现问题