Ký hiệu ~> và >= trong Gemfile

1. Giới thiệu

Gemfile là file nằm ở thư mục root của một project Rails. Khi khởi tạo project với lệnh rails new <my-project> thì file này được tự động sinh ra. Nó được dùng để mô tả ngắn gọn về các gem dependency dùng cho project ấy và chứa các block code để chỉ ra địa chỉ cần tìm đến để cài đặt các gem này. Chúng ta có thể chỉ định nhiều block code như vậy trong một Gemfile, chẳng hạn:

source "https://rubygems.org"

git_source(:github) do |repo_name|
  repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/")
  "https://github.com/#{repo_name}.git"
end

2. Nội dung chính

Trong Gemfile chúng ta thường nhìn thấy sự xuất hiện của các ký hiệu ~>>=, ví dụ như:

gem "uglifier", ">= 1.3.2"
gem "i18n", "~> 0.7.5"

Đây là cách của Rails để chỉ ra những ràng buộc về phiên bản gem sẽ sử dụng trong project. Với ký hiệu >=, chúng ta sẽ nhanh chóng nghĩ rằng đó là lớn hơn hoặc bằng, vậy còn ~> nghĩa là gì? Hai ký hiệu này khác nhau như thế nào?

Trước hết, với ký tự~>, nó sẽ tương đương với việc viết:

gem "i18n", ">= 0.7.5", "< 0.8.0"

Điều này có nghĩa là khi cài đặt gem cho project, RubyGems sẽ chọn lựa phiên bản gem mà chữ số cuối cùng có thể nhận giá trị tùy ý lớn hơn hoặc bằng giá trị được chỉ ra sau dấu ~>, nhưng những giá trị đứng trước thì không được lớn hơn. Cụ thể trong trường hợp này, với ký hiệu ~> 0.7.5, mọi giá trị bằng hoặc lớn hơn 5 đều được chấp nhận cho chữ số thứ 3, nhưng với những chữ số đứng trước thì luôn là 0.7.

Khi nào chúng ta sử dụng ký hiệu này? Ví dụ như khi bạn chạy một project và có lỗi liên quan đến phiên bản gem của một gem nào đó, bạn có thể dự đoán rằng với phiên bản 0.9 đang cài đặt sẽ gây lỗi, nhưng với các phiên bản có dạng 0.8.x thì lỗi đó sẽ được vá thì bạn sẽ viết ~> 0.8.0 trong Gemfile.

Còn đối với ký hiệu >= 1.3.2, bạn đơn giản là đã chỉ rằng mọi phiên bản lớn hơn hoặc bằng 1.3.2 đều được chấp nhận, không có giới hạn chặn trên.

Câu chuyện có thể sẽ phức tạp hơn một chút và khiến bạn bối rối khi nhìn thấy sự xuất hiện của cả 2 ký hiệu này trong một câu lệnh khai báo phiên bản gem, chẳng hạn như:

gem "bootstrap-sass", "~> 3.3", ">= 3.3.7"

Tuy nhiên, nhìn kỹ lại câu lệnh trên, không quá khó để thấy rằng phiên bản gem có thể lớn hơn hoặc bằng 3.3.7, nhưng nhỏ hơn 4.0.

Link tham khảo: