Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用TFS检测.NET代码中的破坏性更改?_.net_Tfs_Versioning - Fatal编程技术网

使用TFS检测.NET代码中的破坏性更改?

使用TFS检测.NET代码中的破坏性更改?,.net,tfs,versioning,.net,Tfs,Versioning,每当TFS构建解决方案时,我想检测.NET代码(特别是C#)中的破坏性更改。如果签入的代码与最近成功构建的版本之间存在任何中断性更改(如“”中所述),我想了解一下。突破性的更改不一定会导致构建失败。除了编写一个使用反射来比较同一程序集的两个版本的应用程序外,如何才能做到这一点?单元测试。它们提供了一种断言“这是客户端代码所期望的”的方法。你可以在建造的时候就开始建造。独立学院的帕特里克·斯马奇亚(Patrick Smacchia)在大约3.5年前发布了这篇文章 他提到了LibCheck和(显然

每当TFS构建解决方案时,我想检测.NET代码(特别是C#)中的破坏性更改。如果签入的代码与最近成功构建的版本之间存在任何中断性更改(如“”中所述),我想了解一下。突破性的更改不一定会导致构建失败。除了编写一个使用反射来比较同一程序集的两个版本的应用程序外,如何才能做到这一点?

单元测试。它们提供了一种断言“这是客户端代码所期望的”的方法。你可以在建造的时候就开始建造。

独立学院的帕特里克·斯马奇亚(Patrick Smacchia)在大约3.5年前发布了这篇文章

他提到了LibCheck和(显然)NDepend,一条评论又提到了一个

因为已经3.5年多了,现在可能有更好的选择(LibCheck已经超过6年了),但这应该是一个开始。

是的,我会(并且确实)使用NDepend。 我正在开发一个为开发人员提供可扩展API的产品。因此,我们需要确保在不同版本之间,我们不会删除那些开发人员可能依赖的功能。 另一方面,我们需要灵活性来扩展产品,而无需对反向进行大量限制

<>你想考虑的一些事情。

  • 更改引用DLL的版本应视为破坏性更改
  • 删除/更改成员会破坏向后兼容性
  • 添加成员打破向前兼容性(有些人只是把“添加成员”看作是安全的,但它确实有风险)。
  • 在每次构建时更改文件版本,您将在某个时候需要它
  • 考虑编写定义“公共API”的合同。这些将是您需要在组织外支持的成员。将它们视为互操作性边界。然后,它允许您的实现类具有公共成员,这些成员不在API中(因此被认为是“不受支持的”),因此您可以更改它们,而无需担心破坏可扩展性API。扩展API包括编写一个新接口(接口名称中有一个版本号),该接口不是从先前版本的接口派生而来的(派生可防止您完全弃用成员,并在单个类中实现多个接口版本时造成地狱)
  • 不要忘记属性,对属性的更改可能不会破坏静态兼容性,但可能会影响运行时
  • 为了详细介绍James和Adam的答案,我想提供有关使用NDepend及其代码查询和规则功能检测破坏性更改的详细信息。免责声明:我是该工具的开发人员之一

    NDepend及其查询语言也在不断发展。如果您下载了NDepend试用版并分析了两个版本的代码库,希望在其中搜索突破性更改,请查看默认代码规则组API突破性更改,了解以下内容

    执行其中一条代码规则如下所示(NUnit v2.5.8和v2.5.3之间的差异):


    这里有两个问题(我是单元测试的坚定支持者!)第一个是你必须有100%的覆盖率,按照惯例执行。第二个是,除非测试在解决方案之外进行维护,否则任何破坏性重构也会改变单元测试,从而忽略问题。不幸的是,单元测试只发现破坏源代码的更改,而不是破坏二进制代码的更改(例如向方法签名添加可选参数).链接问题:详细说明#1?如果我的Apple.dll依赖于Bear.dll的v1,我升级到Bear.dll的v1.2,并验证Bear.dll没有按照其他#2-6暴露任何破坏性的更改,那么Apple.dll的用户不应该因此而经历任何破坏?只要我确保所有引用的dll也满足相同的标准aI’在链的上游,每当我更新引用的DLL时,不应该有问题,对吗?嗨,AaronLS。这是一个好问题,我本来应该详细说明#1。如果Apple.DLL的公共功能
    返回在Bear.DLL中声明的类型,则会产生风险。如果这些程序集是强类型的,则产品部门以Apple结尾的函数调用将返回(完全限定的类型名)“type,Bear,v1.1”。如果您已“热修复”(已更改但未反转)您的Apple.dll,它现在将返回“type,Bear,v1.2”运行时将抛出类强制转换异常,因为强名称类型由所有名称组件限定,包括版本。