Tôi có một chương trình được xây dựng gồm 5 thành phần chính. Tôi thấy việc đánh số phiên bản tiêu chuẩn quá hạn chế vì tôi muốn xem mỗi phiên bản của mỗi thành phần.
Có ai tìm thấy một cách dễ dàng để làm điều này ngoài danh sách riêng biệt?
Tôi có một chương trình được xây dựng gồm 5 thành phần chính. Tôi thấy việc đánh số phiên bản tiêu chuẩn quá hạn chế vì tôi muốn xem mỗi phiên bản của mỗi thành phần.
Có ai tìm thấy một cách dễ dàng để làm điều này ngoài danh sách riêng biệt?
Câu trả lời:
Chúng tôi có cùng một vấn đề với sản phẩm của mình và chúng tôi đã quyết định tạo số phiên bản riêng cho từng thành phần và phiên bản sản phẩm chỉ là phiên bản tiếp thị bao gồm các thành phần khác nhau trong một phiên bản cụ thể.
Chúng tôi có "phiên bản phát hành hệ thống", là số phiên bản tiêu chuẩn mô tả một cấu hình cụ thể của các thành phần, sau đó một tệp riêng liệt kê các phiên bản thành phần riêng cho bản phát hành hệ thống cụ thể đó. Khách hàng nói 5.2.1 nhưng chúng tôi có thể tra cứu bản dựng riêng lẻ nếu cần thiết. Thông thường đối với một bản phát hành chính, chúng tôi đồng bộ hóa tất cả các phiên bản riêng lẻ để mọi thứ được xây dựng từ cùng một số chi nhánh.
Phiên bản là một vấn đề tách biệt với phát triển ứng dụng dựa trên thành phần. Bạn muốn phiên bản từng thành phần, hoặc bạn muốn phiên bản toàn bộ ứng dụng.
Một mô hình nổi tiếng để tạo phiên bản là từ Microsoft :
major version.minor version.build number.revision
Ví dụ: bạn có thể thấy các tệp DLL trong nền tảng .NET có các phiên bản như 2.0.3600.1 hoặc đại loại như thế.
Vì vậy, tôi khuyên bạn trước tiên nên xác định rằng bạn muốn phiên bản toàn bộ hệ thống hoặc các thành phần của nó. Nếu bạn muốn phiên bản toàn bộ hệ thống, sau mỗi lần tích hợp, hãy xây dựng toàn bộ dự án và tăng phần số bản dựng . Nếu không, thì chỉ cần phiên bản từng thành phần trên bản dựng.
Hãy cẩn thận với phiên bản, nó có thể giết chết bạn :-) Đừng cố làm mọi thứ quá phức tạp.
Tôi nghĩ rằng cách tiếp cận sau đây có thể giúp bạn:
Phiên bản từng thành phần riêng lẻ với bất kỳ lược đồ phiên bản nào bạn muốn. Từ ý kiến của bạn, tôi hiểu rằng bạn đã có một VCS. Tôi cũng giả sử rằng mỗi thành phần có một tệp mà phiên bản của nó được giữ (phải không?). Mỗi ngày một lần / tuần (tùy theo nhóm nào hoạt động tốt hơn) hãy thêm thẻ vào một trong những sửa đổi gần đây nhất trong VCS đánh dấu bản sửa đổi đó là bản sửa đổi chính thức mới nhất (và tùy chọn tăng số siêu sửa đổi). Bây giờ bạn có thể truy vấn VCS cho các sửa đổi với thẻ đó và sau đó tìm phiên bản của các thành phần trong bản dựng chính thức đó.
Nếu bạn chỉ muốn cục bộ, hãy viết một tập lệnh nhỏ sẽ tổng hợp phiên bản của từng thành phần từ nơi được lưu trữ trong mã.
Nếu bạn muốn làm cho nó thậm chí còn lạ hơn, khi bạn thực hiện gắn thẻ, bạn có thể xem các tệp thuộc từng thành phần, xem xét rằng bạn có thể xác định các tệp thuộc về một thành phần cụ thể. Nếu có thay đổi, hãy tăng phiên bản cho thành phần cụ thể đó. Thay thế là làm điều này bằng tay. Một cách khác là kết hợp phân nhánh và hợp nhất với theo dõi phiên bản.
Hầu hết các số phiên bản sử dụng một sửa đổi lớn và nhỏ được điều khiển bởi tiếp thị, vì vậy bạn không thể sử dụng các phiên bản để theo dõi các phiên bản thành phần riêng lẻ. Nói tóm lại, bạn cần tìm một số phần khác của phiên bản mà bạn có thể sử dụng để theo dõi các phiên bản của các thành phần riêng lẻ và dự trữ số phiên bản chính và phụ để theo dõi toàn bộ gói.
Nếu bạn đang theo dõi một cái gì đó giống với mẫu của Microsoft:
major-version.minor-version.build-number.revision
Bạn có thể sử dụng .revision để theo dõi từng phiên bản của từng thành phần và sử dụng các số sửa đổi nhỏ và chính để theo dõi thay đổi sản phẩm hoàn chỉnh, theo cách thông thường.
Nếu bạn đang theo một mô hình tương tự như thế này:
Major-Version.Minor-Version.Build-Number
Bạn sẽ phải sử dụng số bản dựng để theo dõi các phiên bản thành phần riêng lẻ.
Toàn bộ cuốn sách được viết về phần mềm phiên bản.
Đây là một cách tiếp cận mà tôi sử dụng.
Mỗi phần có một phiên bản dưới dạng:
Major.minor.developmental
Mỗi trong số này là một số, bắt đầu từ 0.
Đối với một bản phát hành chính thức (tức là cho khách hàng), phần phát triển phải luôn là 0 như một vấn đề của chính sách.
Chính được tăng lên bởi quyết định tiếp thị.
Nhỏ được tăng lên bởi các bộ tính năng được phát hành - ra thị trường.
Thí dụ:
Tôi bắt đầu phát triển trên một thành phần mới, vì vậy số phiên bản của tôi sẽ là 0.0.1. Khi tôi nhả bàn làm việc ra các đồng nghiệp của mình, ví dụ, để thử nghiệm nội bộ, số lượng phát triển lên tới 0.0.2, 0.0.3, v.v.
Tôi phát hành thứ mới này ra thị trường là 1.0.0, trong đó thay đổi được phép duy nhất từ khi kết thúc phát triển sang phát hành là thay đổi số phiên bản (ví dụ: 0,0.43 -> 1.0.0).
Một số tính năng mới sẽ được thêm vào. Tôi bắt đầu làm việc trên đường cơ sở 1.0.0, thêm các tính năng này, vì vậy các phiên bản tôi phát hành cho các đồng nghiệp của mình để thử nghiệm là 1.0.1, 1.0.2, v.v.
Các tính năng tiếp theo được phát hành ra thị trường là 1.1.0.
Tiếp thị quyết định rằng điều lớn tiếp theo sẽ thực sự lớn, vì vậy nó sẽ ra mắt là 2.0.0. Tôi bắt đầu làm việc trên 1.1.1, tiến tới 1.1.x và phát hành thành 2.0.0.
Và thế là chu kỳ lặp lại.
Cách tiếp cận này, đối với mỗi thành phần, cung cấp cho bạn truy xuất nguồn gốc của tổ tiên.
Nội bộ đối với hệ thống quản lý sửa đổi nguồn (và đối tượng) của bạn, sử dụng các nhánh và thẻ (nhãn, bất kể thuật ngữ của bạn trong ngày là gì) để quản lý sự phát triển.
Kiểm soát sửa đổi của bạn sau đó có thể quản lý từng thành phần hoàn toàn riêng biệt, với các nhánh phát triển và nhãn / thẻ cho từng thành phần. Hoặc bạn có thể kết hợp tất cả chúng lại với nhau, trong trường hợp đó bạn có thể muốn phân nhánh theo gói công việc - nhưng hãy chắc chắn gắn nhãn / thẻ bằng cách phát hành từng thành phần (và khi bạn thực hiện, gắn nhãn / gắn thẻ mọi thứ, không chỉ các bit cho thành phần này. Bằng cách này bạn có một ảnh chụp nhanh về trạng thái của mọi thứ tại thời điểm đó.)
Có khả năng quá trình phát hành của bạn sẽ đòi hỏi suy nghĩ cẩn thận. Sử dụng phương pháp này bao gồm một số bước thủ công và điều này có thể là không mong muốn - tất cả phụ thuộc vào cách hệ thống xây dựng của bạn chọc các số phiên bản vào đối tượng cuối cùng. Đối với nhiều mã nhúng trong đó số phiên bản chỉ là số được đặt tên (ví dụ #d xác định trong mã C), bạn có rất ít sự lựa chọn ngoài việc thực hiện tất cả bằng tay bằng mọi cách. Các nền tảng máy tính để bàn với GUI đẹp thường làm cho tất cả thân thiện hơn nhiều.
Đối với tôi, cách đáng tin cậy duy nhất cho phần mềm phiên bản là sử dụng mã định danh băm hoặc thay đổi từ hệ thống kiểm soát phiên bản của bạn.
Số phiên bản bản dựng tổng thể có thể hữu ích, nhưng nó chỉ thực sự được đảm bảo là duy nhất nếu bạn có máy chủ bản dựng và / hoặc bạn ký mỗi bản phát hành. Đối với nhiều người trong chúng ta, điều này chỉ đơn giản là không khả thi.
Nếu dự án của bạn được chia thành nhiều kho kiểm soát phiên bản, bạn cũng sẽ cần xây dựng một cơ chế theo đó giao diện người dùng của bạn có thể truy vấn từng kho lưu trữ phụ thuộc và báo cáo lại băm cho người dùng.
Trong một dự án tại một công ty trước đây, nơi chúng tôi gặp vấn đề với phần mềm sửa đổi khách hàng (nội bộ) của chúng tôi và biên dịch lại nó, tôi đã thiết lập một quy trình theo đó các giá trị băm được biên dịch vào mỗi ứng dụng và thư viện. Bất cứ khi nào phần mềm được khởi động, một chuỗi sửa đổi đã được xây dựng bằng cách truy vấn tất cả các thành phần phần mềm.
Chuỗi sửa đổi này được hiển thị khi bạn đi đến trang giới thiệu và được ghi vào tệp nhật ký mỗi khi ứng dụng được khởi động. Đó là hình thức:
Application name (6a72e7c61f54)
Library1 (b672a13a41e1)
Library2 (9cc35769b23a)
Library2 (9cc35769b23a)
Library3 (4e9f56a0186a+)
Library2 (9cc35769b23a)
Library4 (2e3b08c4ac76)
Library1 (b672a13a41e1)
Library2 (9cc35769b23a)
Từ điều này tôi có thể dễ dàng thấy rằng họ đã sửa đổi Library3 và đã không thực hiện những thay đổi đó đối với kho lưu trữ, vì vậy họ đang sử dụng mã không được kiểm soát. Tôi cũng có thể so sánh các giá trị băm với hệ thống kiểm tra hiện tại của mình, do đó tôi có thể xác định rằng chúng đã hoàn nguyên (giả sử) Library1 với phiên bản cũ hơn.
Điều này có nghĩa là bất cứ khi nào họ báo cáo lỗi, tôi luôn có thể xây dựng lại chính xác mã đang sử dụng tại thời điểm xảy ra sự cố hoặc ít nhất biết chắc chắn rằng tôi không thể sao chép thiết lập.
Để biết thêm chi tiết về hệ thống xây dựng mà tôi đã sử dụng, cách tôi hoàn thành việc này, tôi gặp phải vấn đề gì và những gì mọi người đề xuất để tránh chúng, hãy xem câu hỏi về Stack Overflow của tôi .
Lưu ý: Hệ thống này chỉ thực sự khả thi nếu bạn sử dụng hệ thống kiểm soát sửa đổi trong đó hàm băm nhất định được đảm bảo dẫn đến cùng một tập tin trong thư mục làm việc của bạn (ví dụ: git và mercurial) nếu một thư mục làm việc nhất định có thể chứa hỗn hợp các tệp và các thư mục từ một số sửa đổi (ví dụ: svn) sau đó tất cả các cược được tắt liên quan đến trạng thái của thư mục làm việc và phương pháp này hoàn toàn không hoạt động.