→ From Coder to Shipper
From Coder to Shipper · DevOps

Package managers — apt, pip, choco, cargo

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

Toàn cảnh

Package manager là chợ ứng dụng của phần mềm

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.

Chợ ứng dụng cho phần mềm

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.

Cài đặt và cập nhật

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.

Lo luôn cả dependency

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.

Từ registry đáng tin

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.

Vì sao

Cài đặt, đừng build từ source

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.

Build từ source

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.

Cài từ registry

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ý.

Ý tưởng cốt lõi

Một package thực sự là gì

Bốn nguyên liệu — và toàn bộ việc của manager là lo cả bốn cho bạn.

Chính chương trình

nginx, git, flask… đã biên dịch, sẵn sàng chạy.

Đủ dependency

Mọi thứ chương trình cần để chạy, đệ quy — manager tự giải quyết cả cái cây.

Một phiên bản chính xác

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ì.

Nguồn gốc rõ ràng

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.

Ý tưởng cốt lõi

Vòng lặp cốt lõi, bốn bước

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.

  1. 1

    Bạn gọi tên một package

    Một dòng: apt install nginx · pip install flask · cargo add serde.

  2. 2

    Manager giải quyết dependency

    Nó tra package trong index của registry và tính ra mọi thứ nó cùng dependency của nó cần.

  3. 3

    Nó cài đúng phiên bản

    Tải, kiểm tra, đặt vào đúng chỗ — cả chương trình lẫn cây dependency.

  4. 4

    Bạn chốt phiên bản, để tái lập

    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.
toàn bộ chủ đề trong một câu
01
Phần 1

apt — manager ở tầng OS

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ừ đó.

apt · phạm vi

apt quản lý cả hệ điều hành

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ữ.

Cả hệ thống, một manager

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.

File .deb

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.

Chậm mà chắc

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.

apt · danh mục

Vì sao apt update trước apt install

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.

apt update — làm mới danh mục

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.

apt install — mua theo danh mục

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.

apt upgrade — cập nhật những gì đang 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.

apt · lệnh hằng ngày

Năm lệnh phủ apt hằng ngày

Đây là 90% những gì bạn sẽ gõ.

bash
# 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.

apt · trong terminal

Cài nginx, thật

Làm mới danh mục, rồi mua. Xem manager làm bao nhiêu việc thay bạn.

ops@vps — zsh
$ sudo apt update
Reading package lists... Done
All package lists are up to date.
$ sudo apt install nginx
The following NEW packages will be installed:
nginx
Setting up nginx (1.24.0-2) ...
$ apt list --installed | grep nginx
nginx/jammy,now 1.24.0-2 amd64 [installed]
the catalog knew exactly what to fetch
02
Phần 2

pip — package manager của Python

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 · cánh cửa trước

PyPI: chợ ứng dụng của Python

pip là client; PyPI là cửa hàng. Khi bạn pip install flask, bạn đang mua từ PyPI.

Hàng triệu package

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.

Vấn đề hỗn loạn toàn cục

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.

pip · chốt phiên bản

requirements.txt — danh sách mua của dự án

Một file text nhỏ biến "chạy trên máy tôi" thành "chạy ở mọi nơi".

requirements.txt
# 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.

pip · workflow venv

Mỗi dự án một môi trường cách ly

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.

ops@vps — zsh
$ python -m venv .venv
$ source .venv/bin/activate
(.venv) $ pip install -r requirements.txt
Collecting flask==3.0.2
Successfully installed flask-3.0.2 gunicorn-21.2.0
(.venv) $ pip freeze > requirements.txt
every project gets its own shelf — no more fights
pip · hai siêu năng lực

venv và chốt phiên bản — cách ly và tái lập

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 — cách ly

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.

Chốt phiên bản — tái lập

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.

03
Phần 3

choco — package manager của Windows

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.

choco · phạm vi

Chợ ứng dụng cho máy 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 — cửa hàng cộng đồng

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.

winget — tích hợp sẵn trong Windows

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.

Cùng mô hình tư duy

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.

choco · lệnh hằng ngày

Hai lệnh, hai manager

Trên Windows bạn sẽ gõ chủ yếu một trong hai — cùng một "trí nhớ vận động".

bash
# 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.

04
Phần 4

cargo — manager và build tool của Rust

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.

cargo · vai trò kép

pip chỉ cài; cargo còn build

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.

Package manager

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.

Build tool

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.

cargo · file khai báo

Cargo.toml — lời khai báo của dự án

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.

Cargo.toml
[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.

cargo · trong terminal

Tạo, build, chạy

Từ thư mục trống đến một chương trình Rust đang chạy trong ba lệnh.

ops@vps — zsh
$ cargo new myapp && cd myapp
$ cargo run
Compiling myapp v0.1.0
Finished dev [unoptimized + debuginfo] in 1.02s
Running `target/debug/myapp`
Hello, world!
the first build compiles everything; later builds are fast
Toàn cảnh · phạm vi

Hai tầng package manager

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.

🖥 Tầng OS — cái máy

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

🐍🦀 Tầng ngôn ngữ — thế giới một ngôn ngữ

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.

Toàn cảnh · bốn manager

Bốn manager trong một thoáng

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.

ManagerTầngRegistryLệnh càiChốt phiên bản
aptOS · Debian/UbuntuUbuntu / Debian reposapt install nginxphiên bản trong kho trên máy
pipNgôn ngữ · PythonPyPIpip install flaskrequirements.txt
chocoOS · WindowsChocolateychoco install git— (theo máy)
cargoNgôn ngữ · Rustcrates.iocargo buildCargo.toml + Cargo.lock
Toàn cảnh · vì sao nhiều manager

Vì sao nhiều manager, không phải một

Không phải trùng lặp — mà là phạm vi.

Phạm vi khác nhau

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.

Registry khác nhau

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ó.

Nhịp cập nhật khác nhau

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.

Toàn cảnh · tái lập

Chốt phiên bản là thứ khiến setup tái lập được

Chênh lệch giữa "chạy ở đây" và "chạy ở mọi nơi" là một file text nhỏ trong git.

requirements.txt — Python

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 + Cargo.lock — Rust

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.

Toàn cảnh · cùng nhau làm việc

Một dự án, cả bốn manager

Setup app Flask của khóa này — mỗi manager trong "lane" của nó.

  1. 1

    apt — cái máy

    sudo apt install git python3 python3-venv curl — bộ công cụ tầng OS, mỗi máy một lần.

  2. 2

    choco / winget — đồng nghiệp Windows

    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.

  3. 3

    pip — dự án

    python -m venv .venv, rồi pip install -r requirements.txt — đúng dependency Python của app, được cách ly.

  4. 4

    cargo — phần Rust

    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.

Toàn cảnh · ngoài phạm vi

Những gì cố tình bỏ qua

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.

Build từ source

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ể.

apt sources & mirror

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ể.

cargo features & profiles

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.

apt-get, dist-upgrade & bạn bè

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.
thói quen mua sắm của người shipper

Gọi tên. Cài đặt. Chốt phiên bản.

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.