使用TFS检测.NET代码中的重大变化?

Detecting breaking changes in .NET code using TFS?

每当TFS构建解决方案时,我想检测.NET代码(特别是C)中的中断更改。如果在正在签入的代码和最近成功生成的版本之间有任何中断更改(如在.NET中的"API中断更改的明确指南"中所述),我想知道这一点。突破性的改变不需要导致构建失败。除了编写一个使用反射来比较同一程序集的两个版本的应用程序外,如何才能做到这一点?


为了详细介绍一下James和Adam的答案,我想提供有关使用ndepend检测破坏性更改及其代码查询和规则功能的详细信息。免责声明:我是该工具的开发人员之一

ndepend已经发展,它的查询语言也在发展。如果您下载ndepend试用版并分析要在其中搜索中断更改的代码库的两个版本,请查看以下cqlinq规则的默认代码规则组api中断更改。

  • API中断更改:类型
  • API中断更改:方法
  • API中断更改:字段
  • 破坏API的更改:接口和抽象类
  • 损坏的可序列化类型
  • API:新的公共可见类型
  • API:新的公开可见方法
  • API:新的公开可见字段

例如,执行其中一个代码规则(nunit v2.5.8和v2.5.3之间的差异):

API breaking changes


是的,我会用ndepend来做这个。我在一个为开发人员提供可扩展API的产品上工作。因此,我们需要确保在发布之间,不会删除那些开发人员可能依赖的功能。另一方面,我们需要的是灵活性来增长产品,而不需要对逆转进行大量限制。

有些事情你会考虑。

  • 更改引用的dll的版本应被视为破坏性更改。
  • 删除/更改成员会破坏向后兼容性。
  • 添加成员会破坏兼容性(有些人只是认为"添加的成员"是安全的,但它确实有相关的风险)。
  • 每次生成时都要更改文件版本,在某个时刻您将需要它。
  • 考虑编写定义"公共API"的合同。这些将是您需要在组织外部支持的成员。把它们看作互操作性的边界。然后,它允许实现类具有不在API中的公共成员(因此被认为是"不受支持的"),因此您可以更改它们,而不必担心破坏扩展性API。扩展API包括编写一个新的接口(接口名称中带有版本号),该接口不是从以前版本的接口派生的(派生会阻止您完全弃用成员,并在一个类中实现多个接口版本时创建地狱)。
  • 不要忘记属性,对它们的更改可能不会破坏静态兼容性,但会影响运行时。

  • 单元测试。它们提供了一种断言"这是客户机代码所期望的"。生成时,可以让tfs运行单元测试。


    帕特里克·斯马奇(PatrickSmacchia)在3.5年前发表了这篇文章。

    http://codebetter.com/patricksmacchia/2008/01/20/avoint-api-breaking-changes/

    他提到了libcheck和(显然)ndepend,而评论又提到了一个。

    既然已经3.5年多了,现在可能有更好的选择(libcheck已经有6年多的历史了),但这应该是一个开始。