Chợ ứng dụng cho máy của bạn: cài đặt, cập nhật, và chốt phiên bản mọi công cụ và thư viện — không bao giờ phải build từ source.
← / → để chuyển slide · chuyển EN/VI bên dưới
Bạn hết phải đi tìm file cài đặt. Bạn gọi tên thứ mình cần; một danh mục đáng tin cậy giao hàng — kèm theo mọi thứ nó phụ thuộc.
Cùng ý tưởng chợ ứng dụng trên điện thoại, nhưng cho terminal: hàng nghìn chương trình có sẵn, đã kiểm tra và gắn phiên bản.
Một lệnh cài một chương trình; một lệnh cập nhật tất cả những gì bạn có. Không wizard cài đặt, không next-next-next.
Phần mềm thường cần phần mềm khác để chạy. Manager tự hiểu chuyện đó và cài phần thiếu giúp bạn.
Gói đến từ một registry được cộng đồng OS hay ngôn ngữ tuyển chọn và bảo trì — không phải file tải ngẫu nhiên trên mạng.
Build từ source nghĩa là tự tải code về và biên dịch — với một chương trình có 40 dependency, đó là dự án cả cuối tuần. Cài đặt chỉ là một lệnh.
Bạn tải code thô về, tự cài từng dependency theo đúng thứ tự, biên dịch, rồi sửa lỗi. Làm được — nhưng giờ không ai làm nữa.
Như tự chế một chiếc xe từ số không trong garage.
Người khác đã giải quyết mớ dependency và đóng gói kết quả. Bạn nhận một bản có sẵn ở phiên bản đã biết — vài giây, một lệnh.
Như mua xe từ đại lý.
Bốn nguyên liệu — và toàn bộ việc của manager là lo cả bốn cho bạn.
nginx, git, flask… đã biên dịch, sẵn sàng chạy.
Mọi thứ chương trình cần để chạy, đệ quy — manager tự giải quyết cả cái cây.
Không phải "bản mới nhất" mà là 3.0.2 — để bạn luôn biết chính xác mình nhận gì.
Nó đến từ một registry có tên (kho Ubuntu, PyPI, crates.io) — nên bạn có thể cài lại y hệt trên mọi máy.
Mọi manager trong bài này chơi cùng một trò — chỉ có tên các bước là khác nhau.
Một dòng: apt install nginx · pip install flask · cargo add serde.
Nó tra package trong index của registry và tính ra mọi thứ nó cùng dependency của nó cần.
Tải, kiểm tra, đặt vào đúng chỗ — cả chương trình lẫn cây dependency.
requirements.txt và Cargo.toml ghi lại đúng những gì bạn dùng, để setup y hệt có thể dựng lại ở bất cứ đâu.
Không ai còn build phần mềm từ source nữa. Bạn khai báo thứ mình cần — và package manager giao hàng, ở phiên bản đã chốt, trên mọi máy.
Manager của Debian/Ubuntu: đây là nơi các công cụ hệ thống của bạn — nginx, docker, git, curl — đến từ đó.
Nó không phải tool Python hay Rust — nó quản lý chính cái máy, cho mọi user và mọi ngôn ngữ.
Một apt duy nhất cho cả máy. Nếu một chương trình chạy được trên OS của bạn, apt cài được — nginx, docker, git, curl, htop… bộ công cụ tầng OS của khóa này.
Gói Debian: file .deb là một package bạn cũng có thể tự tải về. Lệnh apt chỉ tự động hóa chuyện đó — kèm luôn việc giải quyết dependency.
Gói OS được test với phân phối của bạn trước khi được đưa lên — nên chúng chậm hơn gói ngôn ngữ, nhưng hiếm khi làm hỏng máy.
Mô hình tư duy sau mọi workflow apt: máy bạn giữ một bản danh mục cục bộ; registry giữ bản thật.
Tải index về: những gì có sẵn, ở phiên bản nào. Không cài gì — chỉ làm mới "bản nhìn cửa hàng" của bạn.
Cài từ index cục bộ. Nếu nó cũ, bạn có thể nhận bản cũ — đúng vì thế nên update trước.
Đưa mọi package đã cài lên phiên bản mới nhất trong danh mục. Cả máy, một lệnh.
Đây là 90% những gì bạn sẽ gõ.
# refresh the catalog, then install nginx
sudo apt update
sudo apt install nginx
# remove / update everything / see what's installed
sudo apt remove nginx
sudo apt upgrade
apt list --installed | grep nginx
sudo = chạy với quyền quản trị — cần khi đụng file hệ thống. Dòng cuối chỉ lọc danh sách đã cài.
Làm mới danh mục, rồi mua. Xem manager làm bao nhiêu việc thay bạn.
Hàng triệu package Python trên PyPI — cùng hai siêu năng lực: venv để cách ly, chốt phiên bản để tái lập.
pip là client; PyPI là cửa hàng. Khi bạn pip install flask, bạn đang mua từ PyPI.
flask, requests, pandas, numpy… nếu là Python thì đã có ai đó đóng gói. pip install <tên> là nó nằm trên máy bạn trong vài giây.
Registry mặc định là PyPI — pip đã biết tìm ở đâu.
Mặc định pip cài vào Python hệ thống. Dự án A cần flask 2, dự án B cần flask 3 — chúng tranh nhau một kệ dùng chung.
Cách xử lý: một kệ riêng cho mỗi dự án — venv, slide tiếp.
Một file text nhỏ biến "chạy trên máy tôi" thành "chạy ở mọi nơi".
# the exact versions this project was built with
flask==3.0.2
requests==2.31.0
gunicorn==21.2.0
# rebuild this exact setup anywhere:
# pip install -r requirements.txt
== chốt đúng phiên bản. Máy mới + file này = cùng một môi trường, mỗi lần.
Tạo một môi trường riêng, làm việc trong đó, rồi ghi lại những gì đã dùng.
Hai siêu năng lực, mỗi thứ một việc: venv tách các dự án khỏi nhau; chốt phiên bản tách "hôm qua" khỏi "hôm nay".
venv là một môi trường Python riêng cho một dự án: thư mục riêng, package riêng. Kích hoạt nó, pip cài vào đó — không đụng hệ thống.
flask 2 ở dự án A và flask 3 ở dự án B cùng tồn tại trên một máy.
pip freeze ghi mọi package đã cài cùng phiên bản chính xác vào requirements.txt. Bất kỳ ai, máy nào: pip install -r là nhận đúng môi trường của bạn.
Đây là lý do requirements.txt nằm trong git.
Chocolatey mang ma thuật "một lệnh là cài" sang Windows — kèm winget, bản mới hơn được tích hợp sẵn trong Windows.
Cùng mô hình tư duy như apt — khác OS. Chocolatey là cửa hàng cộng đồng; winget là bản Microsoft tích hợp sẵn.
choco install git, choco install ffmpeg… cài cả tool CLI lẫn app GUI trọn vẹn từ kho Chocolatey cộng đồng.
Windows 10/11 đi kèm winget — package manager chính chủ của Microsoft, với danh mục chính thức: winget install Git.Git.
Gọi tên — nó cài cùng dependency; một lệnh cập nhật tất cả. OS đổi, ý tưởng thì không.
Trên Windows bạn sẽ gõ chủ yếu một trong hai — cùng một "trí nhớ vận động".
# Chocolatey (community) — CLI tools and GUI apps
choco install git -y
choco install ffmpeg -y
# winget (built into Windows 10/11)
winget install Git.Git
winget upgrade --all
-y = đồng ý mọi câu hỏi. winget upgrade --all cập nhật tất cả một lúc — apt upgrade của Windows.
Package manager của Rust đồng thời là build tool: một chương trình tải, biên dịch, chạy và test code cùng các crate của bạn.
Package Python có sẵn bản biên dịch, nên pip chỉ việc cài. Rust biên dịch từ source, nên cargo phải build — và đó là ưu điểm.
cargo add serde khai báo một dependency; cargo build tải nó từ crates.io — registry của Rust — cùng mọi thứ nó phụ thuộc.
crate = package của Rust; crates.io = PyPI của Rust.
cargo build biên dịch, cargo run build rồi chạy, cargo test chạy test. Một tool điều khiển cả vòng đời — bạn không bao giờ tự gọi trình biên dịch.
cargo new myapp thậm chí tạo sẵn một dự án — có kèm Cargo.toml.
File khai báo: dự án là ai, và phụ thuộc vào gì. Cargo đọc nó để vừa cài vừa build.
[package]
name = "myapp"
version = "0.1.0"
[dependencies]
serde = "1.0"
reqwest = "0.11"
Giống requirements.txt, nhưng phiên bản ở đây là tối thiểu — cargo tự chọn bản tương thích mới nhất và khóa vào Cargo.lock.
Từ thư mục trống đến một chương trình Rust đang chạy trong ba lệnh.
Manager tầng OS vận hành cái máy; manager tầng ngôn ngữ vận hành thế giới của một ngôn ngữ. Dự án thật dùng cả hai — chúng hợp tác, không cạnh tranh.
apt · choco · winget
Cài và cập nhật chính cái máy: công cụ hệ thống (git, curl, nginx), runtime ngôn ngữ (python, rust), app GUI. Mỗi máy một cái, mọi người dùng chung.
phạm vi: cả hệ điều hành
pip (PyPI) · cargo (crates.io)
Quản lý dependency của các chương trình viết bằng một ngôn ngữ: thư viện mà app của bạn import, ở phiên bản đã chốt. Thường mỗi dự án một cái — trong venv.
phạm vi: một registry ngôn ngữ
apt cài python3 · pip sau đó cài flask trong nó · choco làm tương tự trên Windows — khác tầng, một cái máy.
Cùng bốn bước ở khắp nơi: gọi tên, giải quyết, cài đặt, chốt phiên bản.
| Manager | Tầng | Registry | Lệnh cài | Chốt phiên bản |
|---|---|---|---|---|
| apt | OS · Debian/Ubuntu | Ubuntu / Debian repos | apt install nginx | phiên bản trong kho trên máy |
| pip | Ngôn ngữ · Python | PyPI | pip install flask | requirements.txt |
| choco | OS · Windows | Chocolatey | choco install git | — (theo máy) |
| cargo | Ngôn ngữ · Rust | crates.io | cargo build | Cargo.toml + Cargo.lock |
Không phải trùng lặp — mà là phạm vi.
apt/choco là chủ của cái máy (công cụ hệ thống, runtime, app); pip/cargo là chủ thế giới dependency của một ngôn ngữ. Một tool khó làm sạch cả hai.
Mỗi hệ sinh thái có danh mục, định dạng gói, quy tắc phiên bản riêng — .deb, .whl, .crate. Mỗi manager nói "ngôn ngữ" của registry nó.
Gói OS được test với phân phối của bạn và đi chậm; gói ngôn ngữ ra hàng ngày. Cả hai nhịp cùng tồn tại trên một máy.
Chênh lệch giữa "chạy ở đây" và "chạy ở mọi nơi" là một file text nhỏ trong git.
pip freeze ghi đúng phiên bản bạn đã test vào requirements.txt. Commit vào git; mọi đồng nghiệp hay server CI dựng lại môi trường của bạn bằng pip install -r.
Hết cảnh "chạy trên máy tôi".
Cargo.toml khai báo bạn muốn gì; Cargo.lock (tự sinh) ghi đúng phiên bản cargo đã chọn. Commit cả hai, mọi build dùng cùng các crate.
Cùng ý tưởng, khác file — chốt, commit, tái lập.
Setup app Flask của khóa này — mỗi manager trong "lane" của nó.
sudo apt install git python3 python3-venv curl — bộ công cụ tầng OS, mỗi máy một lần.
Cùng bộ công cụ trên máy Windows: choco install git python curl — để ai cũng xuất phát từ cùng một điểm.
python -m venv .venv, rồi pip install -r requirements.txt — đúng dependency Python của app, được cách ly.
Với service Rust trong cùng dự án: cargo build tải và biên dịch các crate — được chốt bởi Cargo.lock.
Package manager có hộp công cụ rất sâu. Những thứ sau là thật — nhưng không phải bước tiếp theo của bạn.
Tự biên dịch phần mềm từ code thô. Là phương án cuối cùng khi không có package — hoặc khi bạn cần rất cụ thể.
Cấu hình Ubuntu lấy package từ đâu (sources list, mirror, PPA). Bạn chỉ đụng vào đây khi truy tìm một package cụ thể.
Bộ dependency tùy chọn và profile build (chỉnh debug/release). Hữu ích sau này, hiện tại cứ để qua.
Cú pháp apt-get cũ và dist-upgrade nặng nề hơn. apt là cánh cửa trước hiện đại — cứ dùng nó.
Bạn không còn tải phần mềm nữa. Bạn khai báo thứ mình cần — và một manager giao hàng, ở phiên bản đã chốt, trên mọi máy.
Tiếp theo: dự án thật đầu tiên — nơi apt, pip và trình soạn thảo cuối cùng cùng làm việc.