Hướng dẫn asdf-vm: Một trình quản lý phiên bản cho tất cả (Node, Python, Go và Ruby)

Linux tutorial - IT technology blog
Linux tutorial - IT technology blog

Sự mệt mỏi khi quản lý quá nhiều phiên bản

Các kỹ sư DevOps và nhà phát triển full-stack thường vô tình trở thành những “nhà sưu tầm” các trình quản lý phiên bản. Một dự án Node.js yêu cầu phiên bản 20, nhưng một script cũ lại bị lỗi trên bất kỳ bản nào thấp hơn 14. Hệ thống tự động hóa Python của bạn dựa trên 3.11, trong khi công cụ của khách hàng lại kẹt ở bản 3.8. Để đối phó, bạn có lẽ đang cài đặt nvm, pyenv, rbenvgvm cùng lúc, tất cả đều đang tranh giành không gian trong file cấu hình shell của bạn.

File .zshrc của tôi từng là “nghĩa địa” của các script khởi tạo. Mỗi khi mở tab terminal mới, tôi phải mất từ 1.5 đến 2 giây để tải vì mỗi trình quản lý lại thực hiện các bước bắt tay (handshake) chậm chạp riêng. Trên một server Ubuntu 22.04 chỉ có 4GB RAM, sự lãng phí này không chỉ gây khó chịu mà còn là một sự tiêu tốn tài nguyên vô ích. asdf-vm giải quyết vấn đề này bằng cách cung cấp một CLI duy nhất, có khả năng mở rộng để quản lý hầu hết mọi môi trường runtime.

Thay vì phải học năm cú pháp CLI khác nhau, bạn chỉ cần một công cụ duy nhất. Nó sử dụng hệ thống plugin để xử lý mọi thứ, từ các ngôn ngữ lập trình đến các công cụ CLI chuyên biệt như Terraform hay kubectl.

Cách asdf hoạt động (ngắn gọn và súc tích)

Điểm hấp dẫn cốt lõi của asdf là kiến trúc plugin. Nó không cố gắng trở thành một trình quản lý chuyên biệt cho Node hay Python. Thay vào đó, nó đóng vai trò như một lớp vỏ bọc (wrapper) tổng quát. Mỗi plugin là một script do cộng đồng duy trì, biết chính xác cách tải xuống và biên dịch một phiên bản ngôn ngữ cụ thể.

Có ba lớp định nghĩa quy trình làm việc với asdf:

  • Plugins: Các script cho những công cụ cụ thể (ví dụ: nodejs, python, ruby, golang).
  • Versions: Các bản phát hành cụ thể mà bạn chọn cài đặt trên máy của mình.
  • Scopes: Cấu hình Global (toàn cục) cho toàn bộ tài khoản người dùng và cấu hình Local (cục bộ) cho các thư mục dự án cụ thể thông qua file .tool-versions.

Cài đặt: Phương pháp sử dụng Git

Cài đặt qua Git là lựa chọn thông minh nhất vì nó giúp việc cập nhật trong tương lai chỉ gói gọn trong một câu lệnh. Đầu tiên, hãy cài đặt các công cụ build cơ bản. Trên các hệ thống dựa trên Debian như Ubuntu hoặc Mint, hãy chạy:

sudo apt update && sudo apt install curl git -y

Tiếp theo, clone repository của asdf vào thư mục home của bạn. Tôi khuyên dùng nhánh ổn định mới nhất (v0.14.1 tại thời điểm viết bài này):

git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.14.1

Cấu hình shell của bạn

Bạn cần chỉ cho shell biết nơi tìm các file thực thi của asdf. Đối với Bash, hãy thêm các dòng sau vào file ~/.bashrc:

. "$HOME/.asdf/asdf.sh"
. "$HOME/.asdf/completions/asdf.bash"

Người dùng Zsh nên thêm dòng này vào ~/.zshrc:

. "$HOME/.asdf/asdf.sh"

Tải lại cấu hình bằng lệnh source ~/.zshrc (hoặc ~/.bashrc) và kiểm tra lại cài đặt bằng cách chạy asdf version.

Thực hành: Thiết lập môi trường của bạn

Một bản cài đặt asdf trống rỗng chỉ là một cái khung. Bạn cần cài thêm các ngôn ngữ mà bạn thực sự sử dụng. Dưới đây là một bộ công cụ (stack) điển hình cho môi trường phát triển hiện đại.

1. Node.js

Thêm plugin và cài đặt hai phiên bản khác nhau—có thể là bản LTS hiện tại và một bản cũ hơn cho một dự án di sản:

asdf plugin add nodejs
asdf install nodejs 20.11.1
asdf install nodejs 18.19.0

2. Python

Python thường cần được biên dịch từ mã nguồn để đảm bảo tích hợp hoàn hảo với nhân (kernel) Linux của bạn. Hãy cài đặt các phụ thuộc (dependencies) trước để tránh lỗi:

sudo apt install build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev curl libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev -y

asdf plugin add python
asdf install python 3.12.2
asdf install python 3.10.13

Chuyển đổi phiên bản một cách mượt mà

Đây là lúc asdf thay thế các thao tác thủ công bằng tự động hóa. Bạn định nghĩa các phiên bản ở hai cấp độ để giữ mọi thứ ngăn nắp.

Mặc định Toàn cục (Global Default)

Thiết lập các phiên bản chính để sử dụng chung khi bạn không ở trong một thư mục dự án cụ thể:

asdf global python 3.12.2
asdf global nodejs 20.11.1

Ghi đè cho từng dự án (Project-Specific Override)

Giả sử ~/projects/legacy-app cần Node 18. Hãy di chuyển đến đó và chốt phiên bản:

cd ~/projects/legacy-app
asdf local nodejs 18.19.0

Asdf sẽ ghi thông tin này vào file .tool-versions trong thư mục đó. Bây giờ, ngay khi bạn truy cập thư mục này, lệnh node -v sẽ tự động chuyển sang bản 18.19.0. Khi bạn thoát ra, nó sẽ quay lại bản mặc định toàn cục là 20.11.1. Không còn phải gõ lệnh nvm use thủ công mỗi khi đổi việc nữa.

Quản lý Go và Ruby

Quy trình thực hiện hoàn toàn tương tự cho mọi ngôn ngữ khác. Để thiết lập Go:

asdf plugin add golang
asdf install golang 1.22.0
asdf global golang 1.22.0

Đối với Ruby (yêu cầu libyaml-dev và các công cụ build khác):

asdf plugin add ruby
asdf install ruby 3.3.0
asdf local ruby 3.3.0

Cập nhật tất cả cùng lúc

Việc bảo trì thường là chi phí ẩn của các công cụ phát triển. Với asdf, bạn có thể làm mới công cụ cốt lõi và mọi plugin ngôn ngữ chỉ với hai lệnh nhanh chóng:

asdf update
asdf plugin update --all

Kiểu quản lý tập trung này giúp đơn giản hóa việc khôi phục sau sự cố. Nếu bạn đổi sang máy tính mới, chỉ cần sao chép file .tool-versions, chạy asdf install, và toàn bộ môi trường của bạn sẽ được xây dựng lại trong vài phút. Nó đảm bảo rằng thiết lập cục bộ của bạn khớp từng bit với các server production.

Lời kết

Chuyển sang asdf-vm có vẻ như là một việc cần làm thêm trong danh sách của bạn, nhưng đó là một khoản đầu tư xứng đáng hàng ngày. Bạn sẽ có một shell sạch sẽ hơn, bộ lệnh nhất quán và một cách đồng bộ môi trường hoàn hảo với nhóm của mình. Nếu bạn đã mệt mỏi với việc có quá nhiều trình quản lý phiên bản trên Linux, đây chính là giải pháp mà bạn đang tìm kiếm.

Share: