2011-08-30 48 views
9

Tôi muốn phát hiện các thay đổi đột phá trong mã .NET (cụ thể là C#) bất cứ khi nào TFS xây dựng một giải pháp. Nếu có bất kỳ thay đổi đột phá nào (chẳng hạn như được nêu trong "A definite guide to API-breaking changes in .NET") giữa mã đang được đăng ký và phiên bản trong bản dựng thành công gần đây nhất, tôi muốn biết về nó. Một thay đổi phá vỡ không cần phải làm cho việc xây dựng thất bại. Viết ngắn một ứng dụng sử dụng sự phản chiếu để so sánh hai phiên bản của cùng một assembly, làm thế nào điều này có thể được thực hiện?Phát hiện các thay đổi đột ngột trong mã .NET bằng TFS?

+1

Qua rà soát mã? – Mrchief

+0

Câu hỏi được liên kết: http://stackoverflow.com/questions/2377855/tool-for-backwards-compatibility-for-the-c-net-api – aponomarenko

Trả lời

3

Có, tôi sẽ (và làm) sử dụng NDepend cho việc này. Tôi làm việc trên một sản phẩm cung cấp API mở rộng cho nhà phát triển. Vì vậy, chúng tôi cần đảm bảo rằng giữa các bản phát hành, chúng tôi không xóa chức năng mà những nhà phát triển đó có thể phụ thuộc. Mặt khác, là chúng ta cần sự linh hoạt để phát triển sản phẩm mà không có những hạn chế lớn xung quanh việc đảo chiều.

Một số điều bạn sẽ muốn cân nhắc.

  1. Thay đổi phiên bản của DLL được tham chiếu nên được coi là thay đổi đột phá.
  2. xóa/thay đổi thành viên vi phạm khả năng tương thích ngược.
  3. thêm thành viên vi phạm khả năng tương thích về phía trước (một số người chỉ xem xét 'các thành viên được thêm vào' an toàn, nhưng nó có rủi ro liên quan).
  4. Thay đổi phiên bản tệp với mọi bản dựng, bạn sẽ cần nó ở một số thời điểm.
  5. Cân nhắc viết các hợp đồng xác định 'API công khai' của bạn. Đây sẽ là những thành viên mà bạn cần hỗ trợ bên ngoài tổ chức. Hãy coi chúng là ranh giới khả năng tương tác. Sau đó, nó cho phép các lớp triển khai của bạn có các thành viên công khai, vốn không có trong API (do đó được coi là 'không được hỗ trợ'), vì vậy bạn có thể thay đổi chúng mà không phải lo lắng về việc phá vỡ API mở rộng. Mở rộng API bao gồm viết một giao diện mới (với số phiên bản trong tên giao diện) mà KHÔNG phát sinh từ phiên bản giao diện trước đó (dẫn xuất ngăn bạn khỏi các thành viên không dùng nữa và tạo ra địa ngục khi đến lúc triển khai nhiều phiên bản giao diện trong một lớp học duy nhất.
  6. Dont quên Thuộc tính, thay đổi để họ có thể không phá vỡ khả năng tương thích tĩnh, nhưng có thể ảnh hưởng đến thời gian chạy.
+0

Xây dựng trên # 1? Nếu Apple.dll của tôi phụ thuộc vào v1 của Bear.dll, và tôi nâng cấp lên v1.2 của Bear.dll, và xác minh rằng Bear.dll không lộ ra bất kỳ thay đổi đột phá nào theo # 2-6 khác? Người dùng Apple.dll không nên trải nghiệm bất kỳ sự cố nào do kết quả chính xác? Vì vậy, miễn là tôi đảm bảo tất cả các dll tham chiếu cũng đáp ứng các tiêu chí giống nhau tất cả các cách lên chuỗi bất cứ lúc nào tôi cập nhật một DLL tham chiếu, không nên có một vấn đề chính xác? – AaronLS

+0

Xin chào AaronLS. Đây là một câu hỏi hay, và tôi nên được xây dựng ban đầu trên # 1. Rủi ro phát sinh nếu chức năng công khai của các kiểu trả về 'của Apple.dll được khai báo trong Bear.dll. Nếu các assembly này được đánh máy mạnh, thì một sản phẩm tùy thuộc vào Apple sẽ mong đợi hàm call đó trả về (loại tên đầy đủ) "Type, Bear, v1.1". Nếu bạn có "cố định nóng" (thay đổi nhưng không đảo ngược) Apple.dll của bạn, nó sẽ trở lại "Type, Bear, v1.2" và thời gian chạy sẽ ném một ngoại lệ lớp diễn viên - bởi vì các loại mạnh mẽ có tên đủ điều kiện tên thành phần, bao gồm cả phiên bản. – Adam

3

Kiểm tra đơn vị. Họ cung cấp một cách để khẳng định 'đây là những gì mã khách hàng mong đợi'. Bạn có thể have TFS run unit tests khi bạn xây dựng.

+3

Hai mối quan tâm ở đây (và tôi là người đề xuất rất lớn về thử nghiệm đơn vị!) đầu tiên là bạn phải có bảo hiểm 100%, được thực thi theo quy ước. Điều thứ hai là trừ phi các xét nghiệm được duy trì bên ngoài giải pháp, bất kỳ nhà tái cấu trúc nào cũng sẽ thay đổi các xét nghiệm đơn vị, do đó bỏ qua vấn đề. – jalbert

2

Patrick Smacchia của danh tiếng NDepend được đăng về điều này ~ 3.5 năm trước.

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

Ông đề cập LibCheck và (rõ ràng) NDepend, và bình luận đề cập đến một hơn.

Kể từ khi được hơn 3,5 năm kể từ đó, có thể có các tùy chọn tốt hơn có sẵn trong những ngày này (LibCheck là tốt hơn 6 tuổi), nhưng những người nên là một sự khởi đầu.

5

để xây dựng một chút về JamesAdam câu trả lời, tôi d muốn cung cấp các chi tiết liên quan đến phát hiện thay đổi vi phạm s với NDepend và truy vấn mã của nó và khả năng quy tắc. Tuyên bố từ chối trách nhiệm: Tôi là một trong những nhà phát triển của công cụ

NDepend cũng đã phát triển và ngôn ngữ truy vấn của nó.Nếu bạn tải xuống bản dùng thử NDepend và phân tích hai phiên bản của cơ sở mã nơi bạn muốn tìm kiếm thay đổi đột phá, hãy xem trong các quy tắc mã mặc định nhóm Thay đổi đột phá API cho CQLinq rules sau.

Thực thi một trong các quy tắc mã trông giống như ví dụ (diff giữa NUnit v2.5.8 và v2.5.3):

API breaking changes

Các vấn đề liên quan