每當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. 在TFS中檢測文件更改
- 3. TFS註釋去除檢測的代碼
- 4. 在.NET中的代碼中更改UserAgent
- 5. 更改代碼以.NET 2.0
- 6. TFS源代碼管理 - 新文件不會自動檢測爲未決更改
- 7. .NET FileSystemWatcher的檢測NTFS安全更改
- 8. 使用.NET中的代碼更改桌面壁紙
- 9. 檢測在Django中更改的密碼
- 10. 如何檢測WSDL合同中的重大更改?
- 11. 使用DBContext檢測更改
- 12. 在.net dll中更改代碼
- 13. 在C#.Net中檢測到無法訪問的代碼.net
- 14. 檢測到獲取所有文件的TFS中的更改
- 15. 如何檢測TeamCity中當前代碼更改的標籤?
- 16. .NET中的代碼重複
- 17. .NET代理檢測
- 18. 通用代碼重複檢測工具
- 19. 域驅動開發:檢測更改(.NET)
- 20. 重寫基本的AngularJS(1.4)代碼以應對重大更改
- 21. 檢查在uninded代碼TFS
- 22. Wicket中的代碼更改重裝
- 23. 測試「用戶必須更改密碼」使用.NET領域3.5
- 24. 更改navigator.platform測試OS檢測碼
- 25. .Net 4.0和.Net 2.0中的異常代碼更改
- 26. 更改TFS 2012中的「我的代碼評論和請求」
- 27. MVC3中的可重用代碼C#.Net
- 28. 檢測重複代碼的工具(Java)
- 29. C#/ .net重用代碼塊
- 30. 檢測System.Windows.Forms.TabPage中的更改
通過代碼審查? – Mrchief
鏈接的問題:http://stackoverflow.com/questions/2377855/tool-for-backwards-compatibility-for-the-c-net-api – aponomarenko