Thực hành / hướng dẫn tốt nhất để duy trì số phiên bản lắp ráp


154

Tôi đang tìm kiếm các gợi ý, gợi ý và thậm chí chính tả về cách quản lý ba số phiên bản lắp ráp khác nhau cho một cụm .NET. Phiên bản Sản phẩm là đơn giản nhất, vì điều này dường như thường được quyết định bởi doanh nghiệp. Sau đó, phiên bản tệp dường như dành cho phiên bản giữa các lần triển khai, trong đó phiên bản lắp ráp thực tế chỉ được sử dụng khi vận chuyển.

Ngay bây giờ tôi chỉ tìm kiếm một phương tiện đơn giản để dán nhãn các bản phát hành thử nghiệm và bảo trì của một bản lắp ráp mà không phụ thuộc, vì vậy tôi đang xem số bản sửa đổi và bản dựng tăng tự động trên phiên bản tệp và để phát hành cuối cùng, sao chép bản hiện tại phiên bản tập tin để phiên bản lắp ráp. Sản phẩm đang được sử dụng sản xuất, nhưng vẫn đang được phát triển - bạn biết đấy - một trong những công ty nhỏ đó, không có tình huống kiểm soát cơ sở hạ tầng thay đổi.


1
Hãy xem cái này ... mã hóa kinh dị.com / blog / 2007/02 / từ
Rahul Soni

Câu trả lời:


211

Phiên bản là thứ mà tôi rất đam mê và đã dành một thời gian dài để cố gắng đưa ra một hệ thống phiên bản dễ sử dụng. Từ những gì bạn đã nói trong câu hỏi của bạn, rõ ràng bạn đã hiểu một điểm quan trọng, số phiên bản lắp ráp không đồng nghĩa với phiên bản sản phẩm. Một cái được điều khiển bằng kỹ thuật, và cái kia được điều khiển bởi doanh nghiệp.

Sau đây giả định rằng bạn sử dụng một số hình thức kiểm soát nguồn và máy chủ xây dựng. Đối với bối cảnh, chúng tôi sử dụng TeamCity và Subversion / Git. TeamCity miễn phí cho một số lượng nhỏ (10) dự án và là một máy chủ xây dựng rất tốt nhưng có những dự án khác, một số trong đó hoàn toàn miễn phí.

Số phiên bản có nghĩa là gì

Những gì một phiên bản có nghĩa là một người có thể có ý nghĩa khác với một người khác, cấu trúc chung là chính, phụ, vĩ mô, vi mô. Cách tôi nhìn vào một số phiên bản là chia nó thành hai phần. Nửa đầu mô tả phiên bản chính (Chính) và mọi cập nhật chính (Nhỏ). Nửa thứ hai cho biết khi nào nó được xây dựng và phiên bản mã nguồn là gì. Số phiên bản cũng có nghĩa là những thứ khác nhau tùy thuộc vào ngữ cảnh, đó có phải là API, Ứng dụng web, v.v.

Major. Minor. Build.Revision

  • Revision Đây là con số được lấy từ kiểm soát nguồn để xác định những gì thực sự được xây dựng.
  • BuildĐây là một con số ngày càng tăng có thể được sử dụng để tìm một bản dựng cụ thể trên máy chủ bản dựng. Đây là một con số quan trọng vì máy chủ xây dựng có thể đã xây dựng cùng một nguồn hai lần với một bộ tham số khác nhau. Sử dụng số bản dựng kết hợp với số nguồn cho phép bạn xác định những gì đã được xây dựng và làm thế nào.
  • MinorĐiều này chỉ nên thay đổi khi có sự thay đổi đáng kể đối với giao diện công cộng. Chẳng hạn, nếu là API, liệu tiêu thụ mã vẫn có thể biên dịch? Số này phải được đặt lại về 0 khi số Major thay đổi.
  • Majorcho biết phiên bản của sản phẩm bạn đang sử dụng. Ví dụ: Major của tất cả các hội đồng VisualStudio 2008 là 9 và VisualStudio 2010 là 10.

Ngoại lệ cho quy tắc

Luôn có ngoại lệ cho quy tắc và bạn sẽ phải thích nghi khi bạn bắt gặp chúng. Cách tiếp cận ban đầu của tôi dựa trên việc sử dụng lật đổ nhưng gần đây tôi đã chuyển sang Git. Kiểm soát nguồn như lật đổ và an toàn nguồn sử dụng kho lưu trữ trung tâm có một số có thể được sử dụng để xác định một tập hợp nguồn cụ thể trong một thời gian nhất định. Đây không phải là trường hợp đối với một điều khiển nguồn phân tán như Git. Bởi vì Git sử dụng kho lưu trữ phân tán trên mỗi máy phát triển, không có số tăng tự động mà bạn có thể sử dụng, có một bản hack sử dụng số lượng đăng ký nhưng nó rất xấu. Vì điều này tôi đã phải phát triển cách tiếp cận của tôi.

Major. Minor. Macro.Build

Số sửa đổi đã biến mất, bản dựng đã được chuyển sang vị trí sửa đổi được sử dụng và Macro đã được chèn. Bạn có thể sử dụng macro như thế nào bạn thấy phù hợp nhưng hầu hết thời gian tôi để nó một mình. Vì chúng tôi sử dụng TeamCity, thông tin bị mất từ ​​số sửa đổi có thể được tìm thấy trong bản dựng, điều đó có nghĩa là có một quy trình gồm hai bước nhưng chúng tôi không mất gì cả và là một sự thỏa hiệp chấp nhận được.

Đặt gì

Điều đầu tiên cần hiểu là Phiên bản hội, Phiên bản tệp và Phiên bản sản phẩm không phải khớp. Tôi không ủng hộ việc có các bộ số khác nhau nhưng nó giúp cuộc sống dễ dàng hơn rất nhiều khi thực hiện các thay đổi nhỏ đối với một tổ hợp không ảnh hưởng đến bất kỳ giao diện công cộng nào mà bạn không bị buộc phải biên dịch lại các cụm phụ thuộc. Cách tôi giải quyết vấn đề này là chỉ đặt các số Chính và Số phụ trong Phiên bản hội nhưng để đặt tất cả các giá trị trong Phiên bản tệp. Ví dụ:

  • 1.2.0.0 (Lắp ráp)
  • 1.2.3.4 (Phân phối tệp)

Điều này cung cấp cho bạn khả năng tung ra các bản sửa lỗi nóng sẽ không phá vỡ mã hiện có vì các phiên bản lắp ráp không khớp nhưng cho phép bạn xem bản sửa đổi / bản dựng của một bản lắp ráp bằng cách xem số phiên bản tệp của nó. Đây là một cách tiếp cận phổ biến và có thể được nhìn thấy trên một số tập hợp nguồn mở khi bạn xem chi tiết lắp ráp.

Bạn với tư cách là Trưởng nhóm sẽ cần có trách nhiệm tăng số phụ khi có yêu cầu thay đổi đột phá. Một giải pháp để đưa ra một thay đổi cần thiết cho một giao diện nhưng không phá vỡ mã trước đó là đánh dấu giao diện hiện tại là lỗi thời và tạo giao diện mới. Điều đó có nghĩa là mã hiện có được cảnh báo rằng phương thức này đã lỗi thời và có thể bị xóa bất cứ lúc nào nhưng không yêu cầu bạn phải phá vỡ mọi thứ ngay lập tức. Sau đó, bạn có thể xóa phương thức lỗi thời khi mọi thứ đã được di chuyển.

Làm thế nào để nối nó với nhau

Bạn có thể thực hiện tất cả các cách trên một cách thủ công nhưng sẽ rất tốn thời gian, sau đây là cách chúng tôi tự động hóa quy trình. Mỗi bước là runnable.

  • Xóa AssemblyVersionAssemblyFileVersioncác thuộc tính khỏi tất cả các tệp của ProjectInfo.cs.
  • Tạo một tệp thông tin lắp ráp chung (gọi nó là VersionInfo.cs) và thêm nó dưới dạng một mục được liên kết vào tất cả các dự án của bạn.
  • Thêm AssemblyVersionAssemblyFileVersioncác thuộc tính cho phiên bản có giá trị "0.0.0.0".
  • Tạo một dự án MsBuild xây dựng tệp giải pháp của bạn.
  • Thêm vào một tác vụ trước khi bản dựng cập nhật VersionInfo.cs. Có một số thư viện MsBuild mã nguồn mở bao gồm một tác vụ AssociationInfo có thể đặt số phiên bản. Chỉ cần đặt nó thành một số tùy ý và kiểm tra.
  • Thêm một nhóm thuộc tính chứa một thuộc tính cho mỗi phân đoạn của số bản dựng. Đây là nơi bạn thiết lập chính và phụ. Số bản dựng và sửa đổi phải được chuyển qua dưới dạng đối số.

Với lật đổ:

<PropertyGroup>
    <Version-Major>0</Version-Major>
    <Version-Minor>0</Version-Minor>
    <Version-Build Condition=" '$(build_number)' == '' ">0</Version-Build>
    <Version-Build Condition=" '$(build_number)' != '' ">$(build_number)</Version-Build>
    <Version-Revision Condition=" '$(revision_number)' == '' ">0</Version-Revision>
    <Version-Revision Condition=" '$(revision_number)' != '' ">$(revision_number)</Version-Revision>
</PropertyGroup>

Hy vọng tôi đã rõ ràng nhưng có rất nhiều liên quan. Hãy hỏi bất kỳ câu hỏi. Tôi sẽ sử dụng bất kỳ thông tin phản hồi để đặt một bài viết blog ngắn gọn hơn cùng nhau.


Bạn đã cân nhắc sử dụng thẻ phiên bản từ GitHub chưa? Tôi rất tò mò về cách nó sẽ phù hợp với câu đố.
raRaRa

1
@raRaRa - Đây là một bài viết khá cũ. Trong khi hầu hết tôi vẫn đứng bên cạnh có một số điều mà tôi sẽ làm khác đi. Phiên bản NuGet đã thay đổi cách tôi thực hiện và tôi sử dụng thẻ Git để xây dựng thành công nhưng vào cuối ngày, số phiên bản trên cụm sẽ gắn lại với phiên bản xây dựng trên máy chủ bản dựng và phiên bản thẻ trong kiểm soát nguồn.
Bronumski

57

[Hội đồng] là một vấn đề rất lớn trong .NET. Một triết lý, được Microsoft khuyến khích là bạn để nó tự động tăng, buộc tất cả các dự án phụ thuộc vào lắp ráp phải được biên dịch lại. Hoạt động ổn nếu bạn sử dụng một máy chủ xây dựng. Nó không bao giờ là điều sai trái để làm nhưng hãy cẩn thận với những người mang gươm.

Một cái khác, liên quan chặt chẽ hơn với ý nghĩa thực tế của nó là số là đại diện cho phiên bản giao diện công cộng của lắp ráp. Nói cách khác, bạn chỉ thay đổi nó khi bạn thay đổi giao diện công cộng hoặc lớp. Vì chỉ một thay đổi như vậy đòi hỏi khách hàng của lắp ráp phải được biên dịch lại. Điều này cần phải được thực hiện thủ công, hệ thống xây dựng không đủ thông minh để tự động phát hiện sự thay đổi đó.

Bạn có thể mở rộng hơn nữa phương pháp này bằng cách chỉ tăng phiên bản khi lắp ráp được triển khai trên các máy ngoài tầm với của bạn. Đây là cách tiếp cận mà Microsoft sử dụng, số phiên bản lắp ráp .NET của họ rất hiếm khi thay đổi. Chủ yếu là vì những nỗi đau rất đáng kể mà nó gây ra cho khách hàng của họ.

Vì vậy, những gì Microsoft giảng không phải là những gì nó thực hành. Tuy nhiên, quá trình xây dựng và kiểm soát phiên bản của nó là vô song, họ thậm chí còn có một kỹ sư phần mềm chuyên dụng theo dõi quá trình. Không hoạt động tốt lắm, đặc biệt là quá tải WaitHandle.WaitOne (int) gây ra một nỗi đau khá lớn . Đã sửa lỗi trong .NET 4.0 với một cách tiếp cận rất khác, nhưng điều đó vượt quá phạm vi.

Điều này tùy thuộc vào bạn và sự tự tin của bạn về mức độ bạn có thể kiểm soát quá trình xây dựng và chu kỳ phát hành để đưa ra lựa chọn của riêng mình. Ngoài ra, việc tự động tăng [BangFileVersion] là rất phù hợp. Tuy nhiên, sự bất tiện là điều này không được hỗ trợ.


11

Bạn có thể sử dụng phần Xây dựng của số phiên bản để tăng tự động.

[assembly: AssemblyVersion("1.0.*")]

Trong môi trường của bạn, phiên bản thử nghiệm là phiên bản có phiên bản xây dựng! = 0. Khi phát hành, bạn tăng phần phụ và đặt phần xây dựng thành 0, đây là cách bạn sẽ xác định các bản phát hành được phát hành.

Nếu bạn cài đặt các hội đồng của mình trong GAC, GAC của bạn sẽ tràn ngập rất nhiều phiên bản khác nhau theo thời gian, vì vậy hãy ghi nhớ điều đó. Nhưng nếu bạn chỉ sử dụng các dlls cục bộ, tôi nghĩ rằng đây là một thực hành tốt.


Tôi thích số bản dựng 0 cho các phiên bản phát hành.
ProfK

1
Tất nhiên, điều này có nghĩa là tên mạnh của hội đồng của bạn sẽ thay đổi theo từng bản dựng, cho dù bạn có muốn hay không.
Richard

9

Thêm vào câu trả lời của Bronumskis , tôi muốn chỉ ra rằng sau tiêu chuẩn Semantic Versioning 2.0 tại semver.org , Major.Minor.Build.Revisionsẽ là bất hợp pháp do quy tắc rằng sau khi tăng một số, tất cả các giá trị thông thường ở bên phải sẽ phải được đặt lại về 0.

Một cách tốt hơn theo tiêu chuẩn sẽ được sử dụng Major.Minor+Build.Revision. Điều này rõ ràng không phải để sử dụng AssemblyVersionAttribute, nhưng một thuộc tính tùy chỉnh hoặc lớp tĩnh có thể được sử dụng thay thế.

Semver trong TeamCity nên có sẵn bằng cách sử dụng Gói năng lượng Meta-runner. Đối với git với git-Flow (đặc biệt là trong thế giới .NET), tôi thấy GitVersion rất hữu ích.


2
Thú vị, tôi sẽ kiểm tra này. Định dạng số phiên bản mà bạn đề cập có thể được sử dụng trong thuộc tính AssociationInformalVersion.
Bronumski

1

Không có quy tắc cứng và nhanh khi nói đến các phiên bản lắp ráp, vì vậy hãy thử xem cái nào sẽ phù hợp với bạn, nhưng tôi khuyên bạn nên sử dụng phương pháp 4 phần vì bạn sẽ có sự linh hoạt khi bạn muốn thực hiện một số thay đổi trong tương lai.

... ví dụ: 1.0.0. *

Dành riêng - Điều này bổ sung thêm tính linh hoạt, trong trường hợp bạn muốn thực hiện bất kỳ thay đổi nào trong tương lai. Nhưng như một mặc định, giữ nó là 0.

Ngoài ra, xem xét ký kết lắp ráp với chìa khóa mạnh. Điều này sẽ giải quyết vấn đề xung đột lắp ráp trong trường hợp bạn có nhiều phiên bản lắp ráp được đăng ký trong GAC. Liên kết MSDN

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.