Chuyển đến nội dung chính

Tất tần tật về định danh phiên bản phần mềm

·6 phút· loading · loading · ·
Lập Trình Software-Engineering Software-Manangement Semver Semantic-Versioning Calver Npm
Duy Trung
Tác giả
Duy Trung
Now I wanna dance, I wanna win, I want that trophy, so dance good.
Mục lục

Làm sao để họ biết tôi đã thay đổi rất nhiều, nhất là khi tên tôi vẫn vậy?

Dẫn nhập
#

Định danh phiên bản phần mềm (Software versioning) là một công đoạn trong công nghệ phần mềm mà ở đó một tên riêng và duy nhất được sử dụng để đánh dấu một trạng thái cụ thể của phần mềm.

Ở phase phát triển (development), các hệ thống quản lý phiên bản (revision control) như Git sẽ tự động sinh id, chẳng hạn 6ccda4c93c1fa3df8e02faf5382ddc86448ac878, mỗi khi người dùng commit các thay đổi.

Khi phát hành, tên cho phiên bản phần mềm thường thân thiện với con người hơn, có thể được gán dạng số tăng dần như 4.3.18, hoặc tên riêng như Dapper Drake, miễn là độc nhất.

Nghĩ ra một cái tên không khó, nhưng làm sao để tên đó phản ánh được mức độ thay đổi của trạng thái phần mềm, truyền tải ý nghĩa cho các bên liên quan có thể hiểu, thì không hề đơn giản. Bất kỳ ai cũng có thể sáng tạo ra cách định danh phiên bản cho riêng mình, thoả mãn được yêu cầu ở trên thì càng tốt. Tuy vậy trong thực tế có một số lược đồ định danh phiên bản hữu ích được cộng đồng đón nhận và áp dụng rộng rãi hơn cả.

Các lược đồ phổ biến
#

SemVer
#

Mô tả
#

Semantic Versioning hay SemVer là lược đồ định danh phiên bản được sử dụng rộng rãi nhất. Một cách ngắn gọn, mỗi phiên bản sẽ được đánh số theo cấu trúc MAJOR.MINOR.PATCH, trong đó nhà phát triển sẽ tăng:

  • MAJOR: khi phần mềm giới thiệu API mới hoàn toàn không tương thích với các bản trước đó
  • MINOR: khi phần mềm thêm các tính năng hoàn toàn tương thích với các API hiện có
  • PATCH: khi phần mềm được fix bug hoàn toàn tương thích với các API hiện có

Dễ thấy độ rủi ro khi thay đổi phiên bản tăng dần từ phải qua trái. Độ rủi ro của phiên bản còn có thể thể hiện chi tiết hơn nữa thông qua 2 phần không bắt buộc sau:

  • Hậu tố tiền xuất bản: (tiêu biểu như alpha, beta, rc, etc.) có thể được gắn sau PATCH, ngăn cách bởi dấu - để thể hiện thêm độ rủi ro của phiên bản, thường trong giai đoạn chuẩn bị phát hành (pre-release)
  • Mã bản build (build metadata): có thể được gắn sau cùng và được ngăn cách bởi dấu +
4 . 3 . 18 - beta +

Quy ước khi MAJOR bằng 0, phần mềm đang ở trạng thái bắt đầu phát triển. Mọi tính năng đang hình thành và thay đổi mạnh mẽ, nên rất thiếu ổn định để có thể sử dụng trong production.

Tất nhiên vẫn có những ngoại lệ như React Native. Thư viện phát triển app mobile bằng JS này chưa biết đến khi nào mới phát hành chính thức bản đầu tiên, song đã được sử dụng vô cùng rộng rãi trong thực tế (phiên bản React Native ở thời điểm viết bài này là 0.70.x).

Minh hoạ tiêu biểu
#

Hệ sinh thái Javascript npm sử dụng SemVer để quản lý phiên bản các gói phần mềm. Các gói cần nêu rõ phiên bản trong file package.json:

{
  "name": "mickey-mouse-boat",
  "version": "0.0.3"
  ...
}

Người dùng có thể sử dụng lệnh npm version để tự động thay đổi phiên bản trong package.json và commit.

npm version major   # 1.1.9 -> 2.0
npm version minor   # 1.1.9 -> 1.2
npm version patch   # 1.1.0 -> 1.1.10

Tuỳ thuộc vào nhu cầu sử dụng, npm hỗ trợ nhiều toán tử để khai báo phiên bản cho các gói/thư viện phụ thuộc trong package.json:

  • 1.2.3: khớp chính xác phiên bản 1.2.3
  • >=1.2.7 <1.3.0: khớp 1.2.8, 1.2.99, không khớp 1.3.0 hay 1.2.5
  • 1.2.7 || >=1.2.9 <2.0.0: khớp 1.2.7 hoặc 1.2.10, không khớp 1.2.8
  • 1.2.3 - 2.3.4: khớp phiên bản theo khoảng, tương đương >=1.2.3 <2.4.0
  • 1.2.X, 1.2.x, 1.2.*: khớp mọi PATCH của bản 1.2. X, x hay * tất nhiên có thể sử dụng với cả MAJOR hay MINOR
  • ~1.2.3: tương tự >=1.2.3 <1.3.0
  • ~1.2: tương tự >=1.2.0 <1.3.0
  • ~1: tương tự >=1.0.0 <2.0.0 hay 1.x
  • ^1.2.3: tương tự >=1.2.3 <2.0.0
  • ^0.x: tương tự >=0.0.0 <1.0.0

Đọc thêm hướng dẫn sử dụng npm semver, hay vọc ngay npm semver calculator.

CalVer
#

Mô tả
#

Calendar Versioning hay CalVer là lược đồ định danh phiên bản dựa trên thời gian phát hành phiên bản đó. Tên của phiên bản bao gồm những phần sau:

  • MAJOR: Số đầu tiên trong phiên bản
  • MINOR: Số thứ 2 trong phiên bản
  • MICRO/PATCH: Số thứ 3, thường là số cuối cùng, trong phiên bản
  • MODIFIER: tag tuỳ ý, không bắt buộc: alpha, beta, rc, etc.

Không khó để thấy các thành phần này rất tương đồng với lược đồ SemVer. Tuy nhiên trong khi SemVer chỉ rõ ý nghĩa và cách tính cho từng thành phần thì CalVer không giới hạn một quy chuẩn chung nào. Mỗi dự án có thể lựa chọn cách tính cho từng thành phần theo yêu cầu của mình, từ những giá trị sau:

YYYYFull year2006, 2016, 2106
YYShort year6, 16, 106
0YZero-padded year06, 16, 106
MMShort month1, 2 … 11, 12
0MZero-padded month01, 02 … 11, 12
WWShort week (since start of year)1, 2, 33, 52
0WZero-padded week01, 02, 33, 52
DDShort day1, 2 … 30, 31
0DZero-padded day01, 02 … 30, 31

Minh hoạ tiêu biểu
#

Ubuntu, 1 distro Linux nổi tiếng, sử dụng tên CalVer theo định dạng YY.MM, với phiên bản đầu tiên 4.10 được phát hành vào tháng 10/2004.

youtube-dl sử dụng CalVer theo định dạng YYYY.MM.DD. Ở thời điểm viết bài, bản mới nhất là 2021.12.17 phát hành vào ngày, hmm, có lẽ bạn đã biết rồi đó.

C, ngôn ngữ lập trình của Chúa, định danh theo YY, chẳng hạn các phiên bản 89, 99, 11.

CockcroachDB đang ở bản 22.2.0-beta.2, định dạng YYYY.MINOR.MICRO-MODIFIER. Dự án này từng dùng SemVer, và họ có lý giải vì sao họ chuyển qua CalVer.

Xem thêm các dự án khác dùng CalVer tại đây.

Một số lược đồ khác
#

Python có lược đồ định dang phiên bản riêng, được xuất bản với mã PEP 0440.

Debian đặt tên theo cấu trúc MAJOR.MINOR + một nhân vật trong loạt phim Toy Story: 1.1 Buzz, 1.2 Rex, 2.2 Potato, etc.

TEX, dừng thêm tính năng mới từ bản số 3, sau mỗi lần cập nhật fix bug sẽ thêm một chữ số sau dấu phẩy theo số pi π. Phiên bản hiện tại của TEX là 3.141592653.

Chọn lược đồ nào?
#

Theo hướng dẫn từ trang chủ CalVer cũng như tham khảo thực tiễn từ CockcroachDB, nếu bạn thực sự biết dự án của bạn sẽ:

  • Quy mô lớn, thường xuyên thay đổi
  • Lĩnh vực phục vụ nhạy cảm với thời gian, múi giờ
  • Phát triển đến mức độ mà SemVer không còn phù hợp (như CockroachDB)

thì hãy chọn CalVer. Các trường hợp còn lại (là đa số), SemVer sẽ là chân ái.

Tham khảo
#

Bài liên quan

Vỡ lòng về mô tả dữ liệu - Phần 2: JSON Type Definition
·5 phút· loading · loading
Lập Trình Javascript Json-Schema Jtd
Để lái xe giỏi thì cần tập lái nhiều hay trở thành kỹ sư kỹ thuật ô tô?
Sử dụng bare repository trong Git
·3 phút· loading · loading
Lập Trình Version-Control Git

Chưa rõ Github lưu trữ code như thế nào? Khởi đầu trần trụi tại đây, sát nghĩa là vậy.

Vỡ lòng về mô tả dữ liệu - Phần 1: JSON Schema
·4 phút· loading · loading
Lập Trình Javascript Json-Schema
Để lái xe giỏi thì cần tập lái nhiều hay trở thành kỹ sư kỹ thuật ô tô?