每当TFS构建解决方案时,我都希望检测到.NET代码(特别是C#)的重大更改。如果在检入的代码和最近成功构建的版本之间有任何重大更改(如“A definite guide to API-breaking changes in .NET”中所述),我想知道它。重大更改不一定会导致构建失败。编写一个使用反射来比较同一程序集的两个版本的应用程序,这怎么能做到呢?使用TFS检测.NET代码中的重大更改?
回答
是的,我会(并且)为此使用NDepend。 我致力于为开发人员提供可扩展API的产品。因此,我们需要确保在发布之间,我们不会删除那些开发人员可能依赖的功能。另一方面,我们需要灵活性来扩大产品的范围,而不会对版本造成大的限制。
有些事情你会想要考虑。
- 更改被引用的DLL的版本应被视为重大更改。
- 删除/更改成员可以降低向后兼容性。
- 添加成员打破了兼容性(有些人认为“添加成员”是安全的,但它确实有风险相关)。
- 更改每个版本的文件版本,您将在某个时候需要它。
- 考虑编写定义您的'公共API'的合同。这些将是您需要在组织外部提供支持的成员。将它们视为互操作性边界。然后它允许您的实现类拥有公共成员,这些公共成员不在API中(因此被认为是“不受支持”),因此您可以更改它们而不必担心打破扩展性API。扩展API包括编写一个新的接口(带有接口名称中的版本号),它不会从接口的先前版本派生(派生阻止您完全弃用成员,并且在实现多个接口版本时创建地狱在一个类中。
- 不要忘记属性,改变他们可能不会打破静态的兼容性,但可能会影响运行。
详细说明#1?如果我的Apple.dll依赖于Bear.dll的v1版,并且我升级到了Bear.dll的v1.2版本,并验证Bear.dll不会按照其他#2-6公开任何重大更改? Apple.dll用户不应该因为正确的结果而遭受任何破坏?只要我确保所有引用的dll都符合相同的标准,无论何时我更新引用的DLL,那么应该没有问题是正确的? – AaronLS
嗨AaronLS。这是一个很好的问题,我原本应该详细阐述#1。 如果Apple.dll的公共功能返回在Bear.dll中声明的类型,则会出现风险。如果这些程序集是强类型的,那么依赖于Apple的产品将期望该函数调用返回(完全限定类型名称)“Type,Bear,v1.1”。如果你的Apple.dll有“hot fixed”(已更改但未被反编译),它现在将返回“Type,Bear,v1.2”,并且运行时会抛出类抛出异常 - 因为强命名类型被所有名称组件,包括版本。 – Adam
单元测试。他们提供了一种方法来断言“这是客户端代码期望的”。当你建立时你可以have TFS run unit tests。
这里有两个问题(我是单元测试的一个巨大支持者!)首先是你必须有100%的覆盖率,按惯例强制执行。第二个原因是,除非在解决方案之外维护测试,否则任何破坏重构也会改变单元测试,从而忽略问题。 – jalbert
NDepend的Patrick Smacchia的名声发布在约3.5年前。
http://codebetter.com/patricksmacchia/2008/01/20/avoid-api-breaking-changes/
他提到LibCheck和(显然)NDepend的,并且评论提到一个。
由于距今已有3.5年以上,现在可能会有更好的选择(LibCheck已经超过6岁),但这应该是一个开始。
要详细一点上詹姆斯和亚当答案,我d想提供有关的详细信息,其中包含NDepend及其代码查询,并检测到突破变化规则功能。 免责声明:我是该工具的开发人员之一
NDepend已经发展成为它的查询语言。如果您下载NDepend试用版并分析您想要搜索重大更改的代码库的两个版本,请查看默认代码规则组针对以下CQLinq rules的API重大更改。
- API Breaking Changes: Types
- API Breaking Changes: Methods
- API Breaking Changes: Fields
- API Breaking Changes: Interfaces and Abstract Classes
- Broken serializable types
- API: New publicly visible types
- API: New publicly visible methods
- API: New publicly visible fields
执行这些代码规则的一个貌似例如(NUnit的v2.5.8和v2.5.3之间的差异):
- 1. 在TFS中检测文件更改
- 2. 在.NET中的代码中更改UserAgent
- 3. 更改代码以.NET 2.0
- 4. 如何检测WSDL合同中的重大更改?
- 5. 检测在Django中更改的密码
- 6. 使用.NET中的代码更改桌面壁纸
- 7. 在.net dll中更改代码
- 8. 检测到获取所有文件的TFS中的更改
- 9. 在C#.Net中检测到无法访问的代码.net
- 10. 如何检测TeamCity中当前代码更改的标签?
- 11. .NET代理检测
- 12. 域驱动开发:检测更改(.NET)
- 13. Wicket中的代码更改重装
- 14. 检查在uninded代码TFS
- 15. 检测重复代码的工具(Java)
- 16. .Net 4.0和.Net 2.0中的异常代码更改
- 17. 检测System.Windows.Forms.TabPage中的更改
- 18. 检测EntityFrameWork中的更改
- 19. 检测Wifi中的更改
- 20. 重大配置更改会阻止用户部署代码吗?
- 21. 使用suiteName检测NSUserDefaults上的更改
- 22. 后台搜索TFS源代码管理中的更改
- 23. 如何更改TFS中源代码管理的默认设置?
- 24. 如何查看TFS中的代码审阅更改
- 25. 用代码更改重启SuperVisor
- 26. 使用tfvc从大型tfs代码库迁移到仍然使用tfs后端
- 27. 从.net代码更改音量
- 28. 测试对代码更改的影响
- 29. 重构.NET代码
- 30. 检测.NET中的DNS重定向
通过代码审查? – Mrchief
链接的问题:http://stackoverflow.com/questions/2377855/tool-for-backwards-compatibility-for-the-c-net-api – aponomarenko