Traveling Ruby là một dự án cung cấp các bản dựng Ruby “di động” độc lập, có thể chạy trên mọi bản phân phối Linux và máy macOS. Nó cũng hỗ trợ Windows với một số lưu ý. Điều này cho phép các nhà phát triển ứng dụng Ruby đóng gói các bản dựng này với ứng dụng của họ, để họ có thể phân phối một gói duy nhất cho người dùng cuối mà không cần người dùng cuối phải cài đặt Ruby hoặc các gem trước. Bạn có tò mò về tính năng này không? Hãy cùng click2register.net tìm hiểu chi tiết để đưa ra quyết định đúng đắn nhất nhé!
Traveling Ruby giúp bạn tạo ra các ứng dụng Ruby “xách tay” dễ dàng hơn bao giờ hết. Với các công cụ và giải pháp đăng ký trực tuyến từ click2register.net, việc quản lý và phân phối ứng dụng của bạn trở nên đơn giản và hiệu quả hơn bao giờ hết.
1. Tại Sao Nên Sử Dụng Traveling Ruby?
Ruby là một trong những ngôn ngữ lập trình được yêu thích. Mặc dù nhiều người sử dụng nó để phát triển web, nhưng Ruby còn có nhiều ứng dụng khác. Nó có thể được dùng để viết các kịch bản tự động hóa quản trị hệ thống, các công cụ dòng lệnh cho nhà phát triển. Heroku’s Toolbelt và Chef đã chứng minh rằng Ruby là một ngôn ngữ tuyệt vời cho những việc này.
Tuy nhiên, việc phân phối các ứng dụng Ruby như vậy cho những người dùng cuối thiếu kinh nghiệm hoặc không phải là lập trình viên Ruby lại là một vấn đề. Nếu người dùng phải cài đặt Ruby trước, hoặc nếu họ phải sử dụng RubyGems, họ có thể dễ dàng gặp phải các vấn đề. Ngay cả khi họ đã cài đặt Ruby, họ vẫn có thể gặp phải các vấn đề, ví dụ như cài đặt sai phiên bản Ruby. Vấn đề này có thể gây hại cho uy tín của bạn. Theo nghiên cứu từ Trung tâm Nghiên cứu Pew, vào tháng 7 năm 2025, việc cung cấp giải pháp đơn giản cho người dùng cuối sẽ là yếu tố quan trọng để duy trì sự hài lòng của khách hàng.
Một giải pháp là xây dựng các gói cài đặt dành riêng cho hệ điều hành, ví dụ như DEB, RPM, .pkg, v.v. Tuy nhiên, điều này có hai nhược điểm:
- Đòi hỏi rất nhiều công sức. Bạn không chỉ phải xây dựng các gói riêng biệt cho mỗi hệ điều hành mà còn cho mỗi phiên bản hệ điều hành. Và trong bối cảnh Linux, bạn phải coi mỗi bản phân phối như một hệ điều hành khác, làm tăng thêm số lượng tổ hợp. Giả sử rằng bạn muốn hỗ trợ khoảng 2 phiên bản CentOS/RHEL, khoảng 2 phiên bản Debian, khoảng 3 phiên bản Ubuntu, khoảng 2 bản phát hành macOS gần đây. Bạn sẽ phải tạo
2 + 2 + 3 + 2 = 9
gói. - Vì bạn thường không thể xây dựng một gói cài đặt dành riêng cho hệ điều hành bằng bất kỳ thứ gì khác ngoài hệ điều hành đó, bạn cần các công cụ hạng nặng, ví dụ như một loạt các máy ảo. Ví dụ: bạn chỉ có thể xây dựng các gói DEB Ubuntu 18.04 trên Ubuntu 18.04; bạn không thể xây dựng chúng từ máy tính xách tay macOS của nhà phát triển.
Đây chính xác là cách tiếp cận mà Chef đã chọn. Họ đã xây dựng Omnibus, một hệ thống tự động hóa tạo ra một đội quân máy ảo để xây dựng các gói dành riêng cho nền tảng. Nó hoạt động, nhưng nó rất nặng nề và gây ra nhiều rắc rối. Bạn cần một máy xây dựng lớn cho việc đó nếu bạn muốn có thời gian xây dựng hợp lý.
Nhưng có một giải pháp khác — đơn giản hơn nhiều.
2. Giải Pháp Traveling Ruby
Giải pháp mà Traveling Ruby ủng hộ là phân phối ứng dụng của bạn dưới dạng một gói tar.gz/zip tự chứa duy nhất, đã bao gồm một trình thông dịch Ruby được biên dịch sẵn cho một nền tảng cụ thể (mà dự án Traveling Ruby cung cấp), cũng như tất cả các gem mà ứng dụng của bạn phụ thuộc vào. Điều này loại bỏ sự cần thiết của các công cụ nặng nề:
- Một tệp tar.gz/zip có thể được tạo trên bất kỳ nền tảng nào bằng cách sử dụng các công cụ nhỏ và đơn giản.
- Bạn có thể tạo các gói cho bất kỳ hệ điều hành nào, bất kể bạn đang sử dụng hệ điều hành nào.
Điều này làm cho quá trình phát hành trở nên đơn giản hơn nhiều. Thay vì phải tạo gần 10 gói bằng một đội quân máy ảo, bạn chỉ cần tạo 3 gói một cách nhanh chóng và dễ dàng từ máy tính xách tay của nhà phát triển. Ba gói này bao gồm tất cả các nền tảng chính mà người dùng cuối của bạn đang sử dụng:
- Linux x86_64.
- macOS.
- Windows. Nhưng hãy xem các lưu ý cụ thể về Windows.
Tuy nhiên, việc phân phối một trình thông dịch Ruby được biên dịch sẵn hoạt động cho tất cả người dùng cuối nói thì dễ hơn làm.
Traveling Ruby hướng đến việc giải quyết vấn đề cung cấp các bản dựng Ruby 2.4 được biên dịch sẵn hoạt động cho tất cả người dùng cuối.
Hình ảnh minh họa cho quá trình đóng gói và phân phối ứng dụng Ruby bằng Traveling Ruby
Giới thiệu trong 2 phút
3. Bắt Đầu Với Traveling Ruby
Bắt đầu với các hướng dẫn:
Sau khi bạn đã hoàn thành các hướng dẫn, hãy đọc các hướng dẫn về các chủ đề trung cấp đến nâng cao:
Ngoài ra, có một số ví dụ thực tế về cách mọi người đã sử dụng Traveling Ruby để đóng gói các công cụ Ruby của họ:
4. Lưu Ý Khi Sử Dụng Traveling Ruby
Các phần mở rộng gốc:
- Traveling Ruby chỉ hỗ trợ các phần mở rộng gốc khi tạo các gói Linux và OS X. Các phần mở rộng gốc hiện không được hỗ trợ khi tạo các gói Windows.
- Traveling Ruby chỉ hỗ trợ một số gem mở rộng gốc phổ biến và chỉ trong một số phiên bản cụ thể. Bạn không thể sử dụng bất kỳ gem mở rộng gốc nào.
- Các phần mở rộng gốc được đề cập trong hướng dẫn 3.
Hỗ trợ Windows:
-
Traveling Ruby hỗ trợ tạo các gói cho Windows, nhưng nó chưa hỗ trợ tạo các gói trên Windows. Đó là, các hướng dẫn Traveling Ruby và tài liệu không hoạt động khi bạn là nhà phát triển Ruby trên Windows. Để tạo các gói Windows, bạn phải sử dụng macOS hoặc Linux.
Điều này là do trong tài liệu của chúng tôi, chúng tôi sử dụng rất nhiều các công cụ Unix tiêu chuẩn. Các công cụ không có sẵn trên Windows. Trong tương lai, chúng tôi có thể thay thế việc sử dụng các công cụ đó bằng các công cụ Ruby để tài liệu cũng hoạt động trên Windows.
-
Traveling Ruby hiện hỗ trợ Ruby 2.4.10.
-
Các phần mở rộng gốc chưa được hỗ trợ.
5. Xây Dựng Các Bản Dựng Với Traveling Ruby
Dự án Traveling Ruby cung cấp các bản dựng mà các nhà phát triển ứng dụng có thể sử dụng. Các bản dựng này được xây dựng bằng cách sử dụng các hệ thống xây dựng trong kho lưu trữ này. Với tư cách là nhà phát triển ứng dụng, bạn không phải sử dụng hệ thống xây dựng. Bạn chỉ phải sử dụng các hệ thống xây dựng khi đóng góp cho Traveling Ruby, khi cố gắng tái tạo các bản dựng của chúng tôi hoặc khi bạn muốn tùy chỉnh các bản dựng.
Đối với hệ thống xây dựng Linux, hãy xem linux/README.md.
Đối với hệ thống xây dựng macOS, hãy xem osx/README.md.
6. Công Việc Trong Tương Lai Của Traveling Ruby
- Cung cấp một ví dụ về Rails.
- Hỗ trợ các phần mở rộng gốc cho Windows.
- Tài liệu về hệ thống xây dựng Windows.
- Hỗ trợ tạo một tệp thực thi duy nhất thay vì một thư mục.
- Lấy cảm hứng từ enclose.io/ruby-packer. Xem nhận xét Hacker News này để biết phân tích so sánh của tôi.
7. Câu Hỏi Thường Gặp Về Traveling Ruby
7.1 Tại Sao Việc Cung Cấp Một Trình Thông Dịch Ruby Được Biên Dịch Sẵn Hoạt Động Cho Tất Cả Người Dùng Cuối Lại Khó Khăn?
Có lẽ bạn nghĩ rằng bạn có thể biên dịch một bản dựng Ruby trên một hệ điều hành nhất định và người dùng sử dụng cùng một hệ điều hành đó có thể sử dụng bản dựng Ruby của bạn. Không hẳn vậy. Ngay cả khi họ chạy cùng một phiên bản hệ điều hành như bạn.
Về cơ bản, có hai vấn đề có thể ngăn một bản dựng hoạt động trên một hệ thống khác:
- Các thư viện mà bản dựng của bạn phụ thuộc vào có thể không có sẵn trên hệ điều hành của người dùng.
- Khi biên dịch Ruby, bạn có thể vô tình đưa ra một sự phụ thuộc vào một thư viện không phải là tiêu chuẩn! Với tư cách là một nhà phát triển, bạn có thể có tất cả các loại thư viện không phải là tiêu chuẩn được cài đặt trên hệ thống của mình. Trong khi biên dịch Ruby, hệ thống xây dựng Ruby tự động phát hiện một số thư viện nhất định và liên kết đến chúng.
- Ngay cả các phiên bản khác nhau của cùng một hệ điều hành cũng đi kèm với các thư viện khác nhau! Bạn không thể tin tưởng vào một thư viện nhất định từ một phiên bản hệ điều hành cũ hơn, vẫn có sẵn trên một phiên bản mới hơn của cùng một hệ điều hành.
- Trên Linux, có các vấn đề với các ký hiệu glibc. Điều này phức tạp hơn một chút, vì vậy hãy đọc tiếp.
Giả sử rằng bản dựng của bạn không sử dụng bất kỳ thư viện nào ngoài thư viện tiêu chuẩn C, các bản dựng được biên dịch trên một hệ thống Linux mới hơn thường không hoạt động trên một hệ thống Linux cũ hơn, ngay cả khi bạn không sử dụng các API mới hơn. Điều này là do các ký hiệu glibc. Mỗi hàm trong glibc – hoặc ký hiệu như các lập trình viên C/C++ gọi nó – thực sự có nhiều phiên bản. Điều này cho phép các nhà phát triển glibc thay đổi hành vi của một hàm mà không phá vỡ khả năng tương thích ngược với các ứng dụng tình cờ dựa vào các lỗi hoặc hành vi cụ thể của triển khai. Trong giai đoạn liên kết, trình liên kết “hữu ích” liên kết với phiên bản ký hiệu mới nhất. Vấn đề là, glibc giới thiệu các phiên bản ký hiệu mới rất thường xuyên, dẫn đến các bản dựng rất có thể phụ thuộc vào glibc gần đây.
Không có cách nào để yêu cầu trình biên dịch và trình liên kết sử dụng các phiên bản ký hiệu cũ hơn trừ khi bạn muốn chỉ định thủ công phiên bản cho từng ký hiệu, đây là một nhiệm vụ không thể thực hiện được.
Cách hợp lý duy nhất để giải quyết vấn đề ký hiệu glibc và ngăn chặn việc liên kết vô tình đến các thư viện không mong muốn là tạo ra một môi trường xây dựng được kiểm soát chặt chẽ. Trên Linux, môi trường xây dựng này sẽ đi kèm với một phiên bản glibc cũ. Môi trường xây dựng được kiểm soát chặt chẽ này đôi khi được gọi là “hộp xây dựng thánh”.
Dự án Traveling Ruby cung cấp một hộp xây dựng thánh như vậy.
7.2 Tại Sao Không Chỉ Liên Kết Tĩnh Bản Dựng Ruby?
Trước hết: nói thì dễ hơn làm. Trình biên dịch thích liên kết với các thư viện động. Bạn phải chỉnh sửa thủ công rất nhiều Makefile để làm cho mọi thứ liên kết tĩnh một cách chính xác. Bạn không thể chỉ thêm -static
làm cờ trình biên dịch và mong đợi mọi thứ hoạt động.
Thứ hai: Ruby không tương thích với liên kết tĩnh. Trên các hệ thống Linux, các tệp thực thi được liên kết tĩnh với thư viện C không thể tải động các thư viện dùng chung. Tuy nhiên, các phần mở rộng Ruby là các thư viện dùng chung và một trình thông dịch Ruby không thể tải các phần mở rộng Ruby bị vô hiệu hóa nặng nề.
Vì vậy, trong Traveling Ruby, chúng tôi đã thực hiện một cách tiếp cận khác. Các bản dựng Ruby của chúng tôi được liên kết động với thư viện C, nhưng chỉ sử dụng các ký hiệu cũ để tránh các vấn đề về ký hiệu glibc. Chúng tôi cũng cung cấp các phiên bản được biên dịch cẩn thận của các thư viện dùng chung phụ thuộc, như OpenSSL, ncurses, libedit, v.v.
7.3 Tại Sao Lại Gây Vấn Đề Cho Người Dùng Cuối Nếu Tôi Không Đóng Gói Một Trình Thông Dịch Ruby?
Trước hết, người dùng chỉ muốn chạy ứng dụng của bạn càng nhanh càng tốt. Yêu cầu họ cài đặt Ruby trước không chỉ là một sự xao nhãng mà nó còn có thể gây ra các vấn đề. Dưới đây là một vài ví dụ về các vấn đề như vậy:
- Có nhiều cách khác nhau để cài đặt Ruby, ví dụ như biên dịch từ nguồn, bằng cách sử dụng
apt-get
vàyum
, bằng cách sử dụng RVM/rbenv/chruby, v.v. Các lựa chọn là rõ ràng đối với chúng ta, nhưng người dùng có thể bị nhầm lẫn bởi số lượng lựa chọn quá lớn. Tệ hơn: không phải tất cả các lựa chọn đều tốt. APT và YUM thường cung cấp các phiên bản Ruby cũ, có thể không phải là phiên bản mà bạn muốn. Biên dịch từ nguồn và sử dụng rbenv/chruby yêu cầu người dùng phải có một chuỗi công cụ biên dịch và các thư viện thích hợp được cài đặt trước. Làm thế nào họ biết những gì cần cài đặt trước khi họ có thể cài đặt Ruby? Internet chứa đầy một tấn các hướng dẫn cũ và lỗi thời, làm tăng thêm sự nhầm lẫn của họ. - Người dùng có thể cài đặt Ruby không chính xác, ví dụ như vào một vị trí không có trong PATH. Sau đó, họ có thể gặp khó khăn với các lỗi “lệnh không tìm thấy”. PATH là rõ ràng đối với chúng ta, nhưng có rất nhiều người dùng ngoài kia hầu như không thể sử dụng dòng lệnh. Chúng ta không nên trừng phạt họ vì thiếu kiến thức, họ là người dùng cuối.
Một cách để giải quyết điều này là bạn “nắm tay người dùng”, bằng cách trải qua rắc rối khi cung cấp 4 hoặc 5 hướng dẫn cài đặt dành riêng cho nền tảng khác nhau để cài đặt Ruby. Các hướng dẫn này phải được liên tục cập nhật. Đó là rất nhiều công việc và QA từ phía bạn, và tôi chắc chắn rằng bạn chỉ muốn tập trung vào việc xây dựng ứng dụng của mình.
Và hãy vì mục đích tranh luận mà giả sử rằng người dùng bằng cách nào đó đã cài đặt Ruby một cách chính xác. Họ vẫn cần cài đặt ứng dụng của bạn. Cách rõ ràng nhất để làm điều đó là thông qua RubyGems. Nhưng điều đó sẽ mở ra một hộp sâu bọ hoàn toàn mới:
- Trên một số hệ điều hành, RubyGems được định cấu hình theo cách mà các lệnh được cài đặt bằng RubyGems không có trong PATH. Ví dụ cổ điển, hãy thử chạy lệnh này trên Debian 6:
$ sudo apt-get install rubygems $ sudo gem install rails $ rails new foo bash: rails: command not found
Đây không phải là một ấn tượng tốt cho người dùng cuối.
- Tùy thuộc vào cách Ruby được cài đặt, bạn có thể phải chạy
gem install
vớisudo
hay không. Nó phụ thuộc vào việcGEM_HOME
có thể ghi được bởi người dùng hiện tại hay không. Bạn không thể nói với họ “luôn chạy với sudo”, bởi vì nếuGEM_HOME
của họ nằm trong thư mục chính của họ, việc chạygem install
với sudo sẽ làm rối tung tất cả các loại quyền. - Tôi vừa đề cập đến
sudo
? Không, bởi vìsudo
theo mặc định đặt lại rất nhiều biến môi trường. Các biến môi trường có thể quan trọng để Ruby hoạt động.- Nếu người dùng đã cài đặt Ruby với RVM, thì người dùng phải chạy
rvmsudo
thay vì sudo. RVM được triển khai bằng cách đặtPATH
,RUBYLIB
,GEM_HOME
và các biến môi trường khác. rvmsudo là một trình bao bọc xung quanh sudo để bảo toàn các biến môi trường này. - Nếu người dùng đã cài đặt Ruby với rbenv hoặc chruby… hãy cầu nguyện rằng họ biết những gì họ đang làm. Rbenv và chruby cũng yêu cầu
PATH
,RUBYLIB
,GEM_HOME
chính xác, v.v. được đặt thành các giá trị cụ thể, nhưng chúng không cung cấp công cụ giống như rvmsudo để bảo toàn chúng sau khi có quyền truy cập sudo. Vì vậy, nếu bạn muốn thân thiện với người dùng, bạn phải viết tài liệu cho người dùng biết cách sudo vào một shell bash trước, sửaPATH
,RUBYLIB
của họ, v.v. và sau đó chạygem install
.
- Nếu người dùng đã cài đặt Ruby với RVM, thì người dùng phải chạy
Vấn đề là, có rất nhiều cơ hội để người dùng cuối bị mắc kẹt, bối rối và thất vọng. Bạn có thể giải quyết tất cả những vấn đề này bằng cách cung cấp tài liệu tuyệt vời xử lý tất cả các trường hợp này (và có thể hơn thế nữa, bởi vì có vô số cách để phá vỡ mọi thứ). Đó chính xác là những gì chúng tôi đã làm cho Phusion Passenger. Hướng dẫn cài đặt RubyGems của chúng tôi chỉ ra chính xác cách cài đặt Ruby cho từng hệ điều hành chính, cách tìm hiểu xem họ có cần chạy gem install
với sudo hay không, cách tìm hiểu xem họ có cần chạy rvmsudo thay vì sudo hay không. Đó là rất nhiều công việc, và ngay cả khi đó, chúng tôi vẫn chưa đề cập đến tất cả các trường hợp. Chúng tôi vẫn thiếu tài liệu về những gì người dùng rbenv và chruby nên làm. Hiện tại, người dùng rbenv/chruby thường xuyên liên hệ với diễn đàn thảo luận cộng đồng của chúng tôi về các vấn đề cài đặt liên quan đến quyền truy cập sudo và các biến môi trường.
Hoặc bạn có thể chỉ cần sử dụng Traveling Ruby và hoàn thành nó. Chúng tôi không thể làm điều đó cho Phusion Passenger vì bản chất của nó là phải hoạt động với một Ruby đã được cài đặt, nhưng có lẽ bạn có thể làm điều đó để viết công cụ dòng lệnh tiếp theo của mình.
7.4 Các Vấn Đề Nghe Có Vẻ Giả Thuyết. Nó Có Thực Sự Quan Trọng Đối Với Người Dùng Cuối Không?
Có. Những vấn đề này có thể khiến người dùng của bạn không cài đặt ứng dụng của bạn và có thể gây ra tiếng xấu cho bạn. Đặc biệt Chef đã phải chịu đựng rất nhiều từ điều này. Rất nhiều người đã có kinh nghiệm xấu trong quá khứ với việc cài đặt Chef thông qua RubyGems. Chef đã giải quyết vấn đề này trong nhiều năm bằng cách cung cấp các gói dành riêng cho nền tảng trong nhiều năm (DEB, RPM, v.v.), nhưng danh tiếng vẫn còn: vẫn còn những người ngoài kia tránh Chef vì họ nghĩ rằng họ phải cài đặt Ruby và sử dụng RubyGems.
7.5 Tôi Nhắm Mục Tiêu macOS, Hệ Điều Hành Này Đã Cài Đặt Ruby. Tôi Có Nên Đóng Gói Một Trình Thông Dịch Ruby Không?
Có. Các phiên bản macOS khác nhau cài đặt các phiên bản Ruby khác nhau. Có thể có những khác biệt tương thích đáng kể giữa ngay cả các phiên bản Ruby nhỏ. Một trong những vấn đề lớn nhất là những thay đổi đối số từ khóa được giới thiệu trong Ruby 2.7 trở lên. Chỉ bằng cách đóng gói Ruby, bạn mới có thể chắc chắn rằng các bản nâng cấp hệ điều hành sẽ không làm hỏng ứng dụng của bạn.
7.6 Traveling Ruby Có Hỗ Trợ Windows Không?
Có, nhưng với một số lưu ý.
7.7 Một Ứng Dụng Hello World Được Đóng Gói Với Traveling Ruby Có Dung Lượng Bao Nhiêu?
Nó khoảng 6 MB được nén.
8. Tối Ưu Hóa Quy Trình Đăng Ký Với Click2Register.net
Sau khi ứng dụng của bạn đã sẵn sàng để phân phối thông qua Traveling Ruby, hãy sử dụng click2register.net để đơn giản hóa quy trình đăng ký và quản lý người dùng. Nền tảng của chúng tôi cung cấp các công cụ mạnh mẽ để tạo và quản lý các sự kiện, khóa học và dịch vụ trực tuyến. Bạn có thể dễ dàng tích hợp ứng dụng của mình với click2register.net để cung cấp trải nghiệm liền mạch cho người dùng của bạn.
- Giao diện thân thiện: click2register.net được thiết kế để dễ sử dụng, ngay cả đối với những người không quen thuộc với các nền tảng đăng ký trực tuyến.
- Quy trình đăng ký đơn giản: Chúng tôi cung cấp một quy trình đăng ký nhanh chóng và dễ dàng, giúp người dùng đăng ký tham gia các sự kiện hoặc dịch vụ của bạn một cách dễ dàng.
- Hỗ trợ nhiệt tình: Đội ngũ hỗ trợ của chúng tôi luôn sẵn sàng trả lời các câu hỏi của bạn và giúp bạn giải quyết mọi vấn đề.
9. Lời Kêu Gọi Hành Động (CTA)
Bạn đang tìm kiếm một giải pháp đơn giản để phân phối các ứng dụng Ruby của mình? Hãy thử Traveling Ruby và click2register.net ngay hôm nay!
Truy cập website click2register.net để tìm hiểu thêm thông tin và đăng ký ngay.
Thông tin liên hệ:
- Địa chỉ: 6900 Turkey Lake Rd, Orlando, FL 32819, United States
- Điện thoại: +1 (407) 363-5872
- Website: click2register.net
Với Traveling Ruby và click2register.net, bạn có thể tập trung vào việc xây dựng các ứng dụng tuyệt vời và để chúng tôi lo phần còn lại.