diff --git a/vitepress-docs/lessons/ops/git-github.md b/vitepress-docs/lessons/ops/git-github.md index 1a39c8b..9386a1f 100644 --- a/vitepress-docs/lessons/ops/git-github.md +++ b/vitepress-docs/lessons/ops/git-github.md @@ -1,5 +1,5 @@ --- -description: 学生包、Pages 建站和开源软件这些内容都默认你有 GitHub 账号、会基本的 Git 操作。本文只讲最常用的部分:Git 的安装与初始配置、第一次提交、把本地仓库连到 GitHub,以及之后往哪个方向继续学。 +description: 学生包、Pages 建站和开源软件这些内容都默认你有 GitHub 账号、会基本的 Git 操作。本文按难度分级(入门 → 进阶 → 挑战),带你逐步掌握现代代码版本控制与开源协作流程。 tags: - Git - GitHub @@ -8,126 +8,279 @@ authors: - HaoxiangXia --- -# Git 与 GitHub 入门 +# Git 与 GitHub 实战教程 -> 本板块的很多内容(学生包、Pages 建站、开源软件)都默认你有 GitHub 账号、会基本的 Git 操作。这页只写最常用的部分。 +> 本板块的很多内容(学生包、Pages 建站、开源软件)都默认你有 GitHub 账号、会基本的 Git 操作。本文按任务难度分级(**入门 → 进阶 → 挑战**),带你从本地基础操作起步,逐步掌握代码上云、分支合并与开源协作。 -## 为什么要学 +--- + +## 入门难度:本地版本控制与基础操作 -- 不知道每次修改了什么——代码版本管理,避免**大作业_v1.zip、大作业_v2_最终版.zip、"最终版_v2_真最终版.zip"、大作业_v3_真·打死不改版.zip** -- 多人同时修改同一个文件 -- 恢复到之前的版本/误删的内容 -- 申请 [GitHub 学生包](../../tech-student-pack.md)的前提是有 GitHub 账号 -- 对部分技术岗位,整理良好的公开仓库可以作为作品展示;课程代码和含敏感信息的项目不要为了求职全部公开 -- 用 [Cloudflare Pages](../../tech-cloudflare.md) / GitHub Pages 部署网站都从 Git 仓库开始 +### 为什么要用版本控制? -## 安装与初始配置 +- **杜绝混乱**:代码版本管理,彻底告别 **`大作业_v1.zip`、`大作业_v2_最终版.zip`、`"最终版_v2_真最终版.zip"`、`大作业_v3_真·打死不改版.zip`** 的繁琐命名。 +- **版本回溯**:随时恢复到历史版本,找回误删或修改前的内容。 +- **多人协作**:允许多人同时修改同一个工程而不互相覆盖。 +- **账号权益**:拥有 GitHub 账号是申请 [GitHub 学生包](../../tech-student-pack.md) 的前置条件。 +- **成果展示**:整理良好的公开仓库可以作为个人技术作品集展示(注意:敏感信息与课程专属代码切勿公开)。 +- **云端部署**:使用 [Cloudflare Pages](../../tech-cloudflare.md) 或 GitHub Pages 部署网站,均从 Git 仓库开始。 + +--- -本教程使用 [VS Code](https://code.visualstudio.com/) 作为 Git 图形化界面,安装时全部点 Next 保持默认即可。 +### 任务 1:注册 GitHub 账号 -### 安装Git -[https://git-scm.com/downloads](https://git-scm.com/downloads)(在安装过程中勾选“使用VSCode作为Git的默认编辑器”,其他默认) -### 配置git身份:(唯一需要敲终端的一步) +> 建议在开始编写代码前提前完成注册,以便后续顺利连接云端。 + +1. **访问官网**:打开 [https://github.com/join](https://github.com/join)。 +2. **用户名规范**:个人主页地址为 `github.com/你的用户名`,建议使用简短规范的英文名或拼音缩写,避免随意输入的无意义字符。 +3. **邮箱选择**: + - 优先使用常用个人邮箱(如 QQ、163、Gmail)完成初始注册,确保能正常接收激活邮件。 + - 如已有学校认证邮箱(`@edu.cn`),注册后可在 Settings → Emails 中追加绑定,后续用于免审核领取 [GitHub 学生包](../../tech-student-pack.md)。 +4. **注意事项**: + - 注册时的人机验证对网络质量有一定要求,若图片加载较慢可尝试切换手机热点。 + - 提交注册后,需前往邮箱点击验证链接激活账号。 + +--- + +### 任务 2:安装 VS Code 与 Git + +本教程使用 [VS Code](https://code.visualstudio.com/) 作为 Git 图形化操作界面,安装时保持默认选项即可。 + +#### 1. 安装 Git +访问 [https://git-scm.com/downloads](https://git-scm.com/downloads) 下载并安装(安装过程中建议勾选“Use Visual Studio Code as Git's default editor”,其余设置保持默认)。 + +#### 2. 配置 Git 身份(唯一需要终端命令的初始步骤) +打开系统终端(Windows 可按 `Win+X` 打开终端/PowerShell,macOS 打开 Terminal),执行以下命令配置用户名与邮箱: ```bash git config --global user.name "你的名字" git config --global user.email "你的GitHub邮箱" ``` -## Git核心概念 -- 工作区(Working Directory):你正在编辑的项目文件 -- 暂存区(Staging Area):临时存放改动的地方 -- 版本库(Repository):存放所有版本信息的历史快照 -``` -[你编辑的文件] -- 点击文件旁的 (+) --> [暂存的更改] -- 输入信息点 Commit --> [生成不可篡改的存档点] - (工作区) (暂存区) (版本库) +--- +### 任务 3:理解核心概念——快照与哈希值 + +#### 1. 什么是快照(Snapshot)? +Git 不记录琐碎的行级差量补丁,而是把工程作为一个整体管理:**每次提交(Commit),都相当于为整个目录拍摄一张完整的“快照”**。 +- **改动过的文件**:完整保存改动后的新版本。 +- **未改动的文件**:仅保留指向已有快照的链接,不浪费额外磁盘空间。 +- **优势**:回溯历史时无需像倒带一样逐行计算累加差异,而是直接切换到对应快照的完整状态。 + +#### 2. 为什么每次提交都有哈希值(如 `7f3a8b2`)? +每次执行 Commit 时,Git 会把该次提交的文件内容、元数据及上一次提交的引用打包,通过哈希算法(SHA-1)计算出一串 40 位的十六进制字符串(通常简写为前 7 位,如 `3b1a7d6`)。 + +哈希值的核心作用: +- **内容一致则哈希必相同**:文件内容只要未变,计算出的哈希完全一致。 +- **内容微变则哈希剧变**:哪怕仅改动一个字符或空格,哈希值都会完全不同。 +- **秒级比对匹配**:在比对本地代码与远程代码是否一致时,Git 无需逐行扫描海量文件,只需比对两端哈希值即可在毫秒级内确认是否匹配,同时也保障了历史记录不可被篡改。 + +#### 3. 三大区域与流转关系 +```text +[编辑的文件] -- 点击文件旁 (+) --> [挑选好的变更] -- 输入说明并点 Commit --> [生成带唯一哈希的快照] + (工作区) (暂存区) (版本库) ``` +- **工作区(Working Directory)**:当前在电脑磁盘和 VS Code 编辑器中直接读写的文件。 +- **暂存区(Staging Area)**:快照的预备区。在真正存盘前,选择本次需要提交的具体改动。 +- **版本库(Repository)**:本地 `.git` 目录维护的快照数据库,保存不可篡改的历史快照与哈希索引。 -## Git工作流程 -- 流程:工作区 → 暂存区 → 版本库 -- 核心操作(通过VSCode图形化界面完成): - - `git init`:初始化一个新的Git仓库 - - `git clone`:克隆远程仓库到本地 - - `git status`:查看当前工作区和暂存区状态 - - `git add`:将工作区的改动添加到暂存区 - - `git commit`:将暂存区的内容提交到版本库 - - `git push`:将本地版本库的内容推送到远程仓库 +--- -> tip:中国大陆访问 GitHub 可能出现连接或下载不稳定。不要在来源不明的“镜像加速”网站输入 GitHub 凭据,也不要默认镜像内容与原仓库同步。只需要最新代码时,可用 `git clone --depth 1 <官方仓库地址>` 减少下载量。 +### 任务 4:完成本地首次提交 -## 第一次提交 +在终端或 VS Code 集成终端中执行基础提交流程: ```bash -git init # 把当前文件夹变成 Git 仓库 -git status # 查看哪些文件发生了变化 -git add README.md src/main.py # 只暂存准备提交的文件 +git init # 初始化当前目录为 Git 仓库 +git status # 查看当前工作区与暂存区状态 +git add README.md src/main.py # 将指定文件加入暂存区 git diff --staged # 提交前检查暂存区内容 -git commit -m "添加课程作业框架" -git log --oneline # 查看提交历史 +git commit -m "添加课程作业框架" # 提交生成版本快照 +git log --oneline # 查看单行历史提交记录 ``` -日常循环是“修改 → `git status` → 选择性 `git add` → `git diff --staged` → `git commit`”。`git add .` 会暂存当前目录下的全部改动,新手先不要把它当默认操作。 +> **日常建议**:标准循环为 `修改 → git status → 选择性 git add → git diff --staged → git commit`。`git add .` 会暂存当前目录下的全部改动,初学阶段建议按需暂存指定文件。 +> +> 查验旧版本建议使用 `git show <提交号>`。`git checkout <提交号>` 会进入 detached HEAD 状态,并不等同于安全的历史回退。如需撤销已推送的提交,推荐使用 `git revert <提交号>` 生成反向提交。 + +--- + +## 进阶难度:代码上云与 SSH 连接 + +### 任务 5:配置 .gitignore(严禁提交的三类文件) + +在实际项目中,以下三类内容不应提交至版本库: + +1. **凭据与敏感密钥**:`.env`、API Key、Token、私钥证书。 +2. **本地环境与第三方依赖**:Python 虚拟环境(`.venv/`)、Node 依赖包(`node_modules/`)。 +3. **临时编译与日志文件**:`__pycache__/`、`.exe`、`.log`。 + +> **处理方式**:在项目根目录新建 `.gitignore` 文件,将需忽略的文件或目录名称写入其中(例如写入一行 `.env`),VS Code 会自动将其置灰并忽略跟踪。 +> +> **安全警告**:若密钥已误提交并推送至公开仓库,仅在后续提交中删除文件并不能消除安全隐患(历史快照中仍存留原文件)。需立即在对应服务平台吊销更换密钥,再处理 Git 提交历史。 -如果只是查看旧提交,用 `git show <提交号>`。`git checkout <提交号>` 会进入 detached HEAD 状态,不等于安全地“回到历史版本”。已经提交并推送的错误通常用 `git revert <提交号>` 生成反向提交;未提交的改动在删除前先复制、提交或暂存,不要直接照抄 `git restore .`。 +--- -### 进阶使用说明:这三种东西严禁提交! +### 任务 6:将本地仓库推送到 GitHub -1. **密码与密钥**:`.env`、API Key、Token、服务器私钥。 -2. **本地环境与庞大依赖**:Python 的虚拟环境文件夹(`.venv/`)、Node 的依赖包(`node_modules/`)。 -3. **临时编译产物**:`__pycache__/`、`.exe`、`.log`。 +通过 VS Code 图形界面一键推送到远程仓库: -> **解法**:在项目根目录新建一个 `.gitignore` 文件,把不需要上传的文件夹名字写进去(例如在里面写一行 `.env`),VS Code 会自动将它变灰忽略。 +1. **打开源代码管理面板**:点击 VS Code 左侧活动栏的**第 3 个图标**(分叉分支形状图标,快捷键 `Ctrl+Shift+G`),确认左侧面板当前分支为 `main`。 +2. **发布分支**:点击醒目的蓝色按钮 **“Publish Branch(发布分支到 GitHub)”**。 +3. **完成授权**:浏览器弹出 GitHub 授权窗口后,点击 **Authorize** 允许 VS Code 访问账号。 +4. **选择仓库属性**:在 VS Code 顶部提示栏中选择 **Publish to GitHub public repository**(公开仓库)。 +5. **查验上线**:推送完成后,点击右下角提示中的 **“Open on GitHub”** 即可在浏览器中查验代码。 -> 如果密钥或访问令牌已经提交,即使随后删除文件也不够。应立即到对应平台撤销并更换密钥,再处理 Git 历史。 +> **后续日常同步**:后续本地写完代码后,点击“暂存(+) → 提交(Commit)”,再点击 VS Code 状态栏左下角的 **“同步更改(↻ 环形箭头)”**,即可将修改推送到云端。 +--- +### 任务 7:配置 SSH 密钥连接(推荐) -## 连接 GitHub:零命令一键推送到云端(5 min) +#### 1. 什么是 SSH? +**SSH(Secure Shell)** 是一种网络加密协议,类似于一套非对称验证机制: +- **公钥(Public Key)**:文件名为 `id_ed25519.pub`,可公开上传并配置在 GitHub 网页后台。 +- **私钥(Private Key)**:文件名为 `id_ed25519`,妥善存放在本地电脑的 `~/.ssh/` 目录,绝对不可外传。 -- 注册GitHub账号[(https://github.com/join)](https://github.com/join)(注册一个简短的英文用户名) +推送代码时,GitHub 会利用公钥发起校验,本地私钥在后台完成静默解密对齐,无需每次输入密码。 -### 回到VS Code: +#### 2. 主流使用 SSH 的原因 +- **密码推送已被官方废弃**:GitHub 不再支持直接通过账号密码执行 `git push`;使用 HTTPS 若凭据失效需重新配置 Personal Access Token(PAT),流程繁琐。 +- **免密静默体验**:单台设备配置一次 SSH 公钥后,后续无论在 VS Code 还是终端操作均无需重复验证。 +- **生产与服务器环境标配**:云服务器与容器多为无图形界面环境,SSH 密钥是通用的标准方案。 +- **网络稳定性更佳**:避开部分网络环境下 HTTPS 端口的证书波动,配合 443 端口连接更顺畅。 -1. 确保左侧源代码管理面板显示当前分支为 `main`。 -2. 点击醒目的蓝色按钮 **“Publish Branch(发布分支到 GitHub)”**。 -3. 浏览器会自动弹出 GitHub 网页授权窗口,点击 **Authorize** 允许 VS Code 访问。 -4. 随后在 VS Code 顶部弹出的选择框中: -* 选择 **Publish to GitHub public repository**(公开仓库,方便展示)。 +#### 3. 配置步骤 +##### 第一步:生成密钥对(单台电脑配置一次即可) +在终端中执行以下命令(将邮箱替换为你自己的 GitHub 注册邮箱): -5. 推送完成后,右下角弹窗点击 **“Open on GitHub”**,即可在浏览器中看到自己的代码仓库已成功上线! +```bash +ssh-keygen -t ed25519 -C "你的GitHub邮箱@example.com" +``` +提示输入保存路径与密码时,**连续回车 3 次** 保持默认(不设置 passphrase)。 + +##### 第二步:复制公钥文本 +- **Windows(PowerShell)**: + ```powershell + Get-Content ~/.ssh/id_ed25519.pub + ``` +- **macOS / Linux**: + ```bash + cat ~/.ssh/id_ed25519.pub + ``` +复制输出中以 `ssh-ed25519` 开头整行字符。 + +##### 第三步:将公钥添加至 GitHub +1. 打开 GitHub,点击右上角头像 → **Settings**。 +2. 左侧导航进入 **SSH and GPG keys**。 +3. 点击 **New SSH key**,填写 Title(如 `Laptop`),将复制的文本粘贴进 Key 输入框后保存。 + +##### 第四步:切换本地仓库为 SSH 地址 +在 VS Code 终端中执行: -> 💡 **后续同步日常**: -> 以后在本地每次写完代码,只要点击“暂存(+) → 提交(Commit)”,然后点击编辑器左下角的 **“同步更改(↻ 环形箭头)”**,修改就会一键同步上云。 +```bash +git remote set-url origin git@github.com:你的GitHub用户名/你的仓库名.git +git remote -v # 确认地址变更为 git@github.com:... +ssh -T git@github.com # 首次连通性校验,提示输入 yes 并回车 +``` +若终端返回 `Hi 你的用户名! You've successfully authenticated...`,即说明 SSH 配置成功。 --- +## 挑战难度:分支管理与开源协作 + +### 挑战 1:分支管理与合并冲突(Branch & Merge) + +单人简单任务通常可在 `main` 分支完成,但在团队协作或尝试大型重构时,分支是隔离风险的关键工具。 + +#### 1. 为什么要使用分支? +- **痛点**:若直接在 `main` 主干上编写尚未测试完成的新功能,代码中途损坏会导致无法交作业或阻断他人。 +- **解法**:从主干拉出独立**分支(Branch)**。在分支上尽情改动,即便出现错误也不会影响 `main` 主线的稳定性。 +- **本质**:在 Git 的快照模型中,分支并非对所有文件进行物理拷贝,而是一个极其轻量的**可移动引用指针**,指向当前最新的一张快照,创建和切换成本极低。 + +#### 2. 合并操作(Merge) +新功能开发并验证无误后,将分支改动合并入主干: + +```text +[main 分支] C1 ─── C2 ─────────── C4 ─────── C5 (合并后的新快照) + \ / +[feature 分支] ─── C3 (开发新特性) ─── +``` + +#### 3. 解决合并冲突(Conflict) +当两个分支同时修改了**同一个文件的相同行**时,Git 无法自动合并,会产生冲突标记。 -### 进阶:网络与连接方式 -#### 什么是 SSH? -连接 GitHub 主要有两种方式:HTTPS 和 SSH。 +VS Code 提供了直观的冲突解决方案,在冲突代码块上方可直接点击选择: +- **Accept Current Change**(保留当前分支改动) +- **Accept Incoming Change**(保留并入分支改动) +- **Accept Both Changes**(同时保留双方改动) -- HTTPS(钥匙串认证):每次通信像用账号密码登录(VS Code 会借助系统凭据管理器自动帮你记住,体验也很顺畅,但偶发凭据失效)。 +挑选确认后保存文件,重新将文件暂存(+)并提交(Commit),即可完成冲突化解。 -- SSH(门禁卡认证):它会生成一对密钥——私钥(保存在你的电脑里,绝对不能给别人)和公钥(上传贴到 GitHub 网页上)。两边像“对暗号”一样直接验证,安全、稳定,且一劳永逸无需反复输入凭据,还能有效避开国内部分运营商对 HTTPS 网页端口的干扰。 +#### 4. 分支常用操作 + +##### 方式 A:VS Code 图形界面操作 +1. **新建与切换**:点击 VS Code 左下角当前分支名(`main`),在顶部弹出框输入新分支名(如 `dev`),按回车自动创建并切换。 +2. **代码提交**:在当前分支下正常修改并提交。 +3. **分支合并**: + - 点击左下角切回 `main` 分支。 + - 点击左侧源代码管理面板右上角 `...` → **分支 (Branch)** → **合并分支... (Merge Branch...)**。 + - 选择要并入的分支名称即可完成合并。 + +##### 方式 B:终端命令 +```bash +git switch -c feature-test # 创建并切换到新分支(等价于旧命令 git checkout -b) +# ... 修改文件并执行提交 ... +git switch main # 切回主分支 +git merge feature-test # 将 feature-test 分支合并到当前 main 分支 +git branch -d feature-test # 合并完成后清理临时分支 +``` --- +### 挑战 2:开源协作标准流程(Issue 与 PR) + +在开源社区(或向本知识库[投稿](/CONTRIBUTING))协作时,核心机制为 **Issue** 与 **Pull Request(PR)**。 + +#### 1. 什么是 Issue? +Issue 是开源项目的公开工单与讨论区: +- **Bug 报告**:运行项目时遇到异常(如“在 Windows 11 下启动报 404”)。 +- **功能建议**:向作者提议新特性支持。 +- **任务管理**:项目作者拆分需求并分配责任人。 + +> **规范**:提 Issue 时应包含基础三要素:**运行环境**(系统、语言版本)、**复现步骤**与**完整错误日志/截图**。 + +#### 2. 什么是 Pull Request(PR)? +外部开发者不具备直接向他人仓库推代码的权限。你在自己名下完成修改后,向原作者发起正式申请:**“请求(Request)项目作者拉取(Pull)我的代码合并入主干”**。 + +#### 规范贡献 5 步流程: +1. **Fork**:在目标仓库主页点击右上角 **Fork**,在自己账号下生成完整独立的副本仓库。 +2. **克隆并建分支**:将自己名下的 Fork 仓库克隆到本地,新建功能分支: + ```bash + git switch -c fix-typo + ``` +3. **修改与推送**:本地完成修改与测试后,正常 Commit 并推送到自己的 GitHub 仓库。 +4. **发起 PR**:访问原项目页面,点击醒目的 **“Compare & pull request”** 按钮,填写改动说明并提交。 +5. **代码评审(Code Review)与合入**:原作者在线审查差异后点击 **Merge**,你的改动即正式并入项目主干,个人头像将永久进入贡献者列表。 + +> **提示**:在 PR 描述中写入 `Fixes #12`,当 PR 合并时,GitHub 会自动关联关闭对应的第 12 号 Issue。 + +--- -## 进阶路线 +### 挑战 3:持续学习路线 -- **分支与合并**:`git branch` / `git merge`,多人协作或试验性改动时用 -- **Pull Request**:参与开源项目(包括给本知识库[投稿](/CONTRIBUTING))的标准流程 -- **GitHub Pages**:仓库设置里开启,免费托管个人主页 -- **GitHub Actions**:自动跑测试、自动部署 +- **分支保护规则(Branch Protection)**:团队协作中锁定 `main` 分支,强制要求通过 PR 和至少一人代码审查后方可合入。 +- **GitHub Pages**:在仓库设置中开启,免费托管静态个人主页与技术文档。 +- **GitHub Actions**:自动化 CI/CD 工作流,实现提交代码后自动执行测试与站点构建。 --- ## 推荐学习资源 -- [Pro Git 中文版](https://git-scm.com/book/zh/v2):官方书,免费在线阅读 -- [Learn Git Branching](https://learngitbranching.js.org/?locale=zh_CN):可视化交互练习,分支概念一玩就懂 +- [Pro Git 中文版](https://git-scm.com/book/zh/v2):官方权威指南,免费在线阅读 +- [Learn Git Branching](https://learngitbranching.js.org/?locale=zh_CN):可视化交互式分支练习网站 - [GitHub Skills](https://skills.github.com/):官方互动教程 - [GitHub 身份验证说明](https://docs.github.com/en/authentication) -- [GitHub SSH over 443](https://docs.github.com/en/authentication/troubleshooting-ssh/using-ssh-over-the-https-port) \ No newline at end of file +- [GitHub SSH over 443](https://docs.github.com/en/authentication/troubleshooting-ssh/using-ssh-over-the-https-port) +- [Missing Semester:版本控制与 Git 数据模型](https://missing-semester-tw.github.io/2026/version-control/):MIT 经典公开课,适合希望深入理解底层 DAG 图结构与对象存储的同学课后选读。 diff --git a/vitepress-docs/lessons/ops/package-manager.md b/vitepress-docs/lessons/ops/package-manager.md index cc891f7..9e8334f 100644 --- a/vitepress-docs/lessons/ops/package-manager.md +++ b/vitepress-docs/lessons/ops/package-manager.md @@ -1,5 +1,5 @@ --- -description: 从 pip、npm 到 uv、pnpm,介绍项目依赖清单、版本锁定、虚拟环境与 Docker 的基本概念和实践方法,帮助初学者建立可复现、易协作的项目环境,减少环境冲突与“在我电脑上能跑”的问题。 +description: 从 pip、npm 到 uv、pnpm,按难度分级(入门 → 进阶 → 挑战),介绍项目依赖、虚拟环境隔离、传递依赖树与跨机交付复现,帮助初学者彻底解决“在我电脑上能跑”的问题。 tags: - Python - JavaScript @@ -10,286 +10,284 @@ authors: # 项目依赖与环境管理:从零告别“环境崩溃” -> 在[Git 与 GitHub 入门](./git-github.md)中,我们掌握了 Git 的基础操作,并在 `.gitignore` 规则里将 `.venv/` 与 `node_modules/` 彻底排除在版本库之外。 +> 在[Git 与 GitHub 入门](./git-github.md)中,我们在 `.gitignore` 规则里将 `.venv/` 与 `node_modules/` 彻底排除在版本库之外。 > 很多初学的同学都会产生疑问: > **这些名字古怪的文件夹到底装了什么?** > **为什么别人总说“千万不要全局 pip install / npm install”?** -> **为什么换一台电脑,甚至换个学期,原先能跑的代码就疯狂报错?** +> **为什么换一台电脑或换个学期,原先能跑的代码就疯狂报错?** > -> 本篇将从最基础的认知讲起,彻底为你理清现代软件开发中的核心环节——**依赖管理**与**环境隔离**。 +> 本篇按任务难度分级(**入门 → 进阶 → 挑战**),从最基础的概念讲起,彻底为你理清现代软件开发中的核心环节——**依赖管理**、**虚拟环境隔离**与**跨机协作交付**。 --- -## 0. 基础铺垫 +## 入门难度:认识依赖与环境隔离 -### 什么是“库(Library / Package)”? +### 1. 基础铺垫:什么是库与依赖? + +#### 什么是“库(Library / Package)”? 假设你的期末大作业题目是:**“抓取教务处通知,分析关键词并画出一张词云图”**。 -如果你坚持从零造轮子,你必须自己编写底层网络通信协议、手动解析 HTML 网页标签、自己计算每个汉字的字模与像素坐标……这可能需要耗费你半个学期。 +如果你坚持从零编写底层网络通信协议、手动解析 HTML 网页标签、自己计算每个汉字的字模与像素坐标……这可能需要耗费你半个学期。 但在现代软件开发中,你通常只需要写 **10 行核心逻辑**: -* 联网抓网页:直接借用现成的 `requests` 库; -* 中文分词:直接借用现成的 `jieba` 库; -* 绘制词云:直接借用现成的 `wordcloud` 库。 +- 联网抓网页:直接借用现成的 `requests` 库; +- 中文分词:直接借用现成的 `jieba` 库; +- 绘制词云:直接借用现成的 `wordcloud` 库。 -这些**由全球开发者开源贡献、封装好特定功能的代码集合**,在编程界通常被称为: -* **模块(Module)/ 库(Library)/ 软件包(Package)**。 +这些**由全球开发者开源贡献、封装好特定功能的代码集合**,在编程界通常被称为**模块(Module)/ 库(Library)/ 软件包(Package)**。 -### 什么是“依赖(Dependency)”? -因为你的代码站在了这些巨人的肩膀上,**你的程序想要成功运行,就必须“依赖”这些外部工具包的存在**。 -如果运行环境中缺少了其中任何一个,你的程序就会瞬间瘫痪。 +#### 什么是“依赖(Dependency)”? +因为你的代码站在了这些开源工具的肩膀上,**你的程序想要成功运行,就必须“依赖”这些外部工具包的存在**。如果运行环境中缺少了其中任何一个,你的程序就会报错瘫痪。 --- -## 1. 什么是包管理器? - -全球有数百万个开源软件包,你显然不可能每次都去百度搜索、下载 `.zip` 压缩包、解压后手动扔进代码文件夹里。 +### 2. 什么是包管理器? -为了解决下载、安装和更新的问题,各个编程语言官方都推出了专属的“**在线应用商店 + 自动化命令行客户端**”,这就是**包管理器(Package Manager)**。 +全球有数百万个开源软件包,我们不可能每次都去搜索引擎手动下载 `.zip` 压缩包并解压扔进代码目录。 +为了解决下载、安装和更新的问题,各编程语言官方推出了专属的“**在线应用商店 + 自动化命令行客户端**”,这就是**包管理器(Package Manager)**。 -``` - +```text +---------------------------------------------------------------------------------+ | 云端官方仓库(应用商店) | | Python: PyPI (pypi.org) | JavaScript: npm registry | +---------------------------------------------------------------------------------+ -│ -│ 自动联网搜索、下载对应系统架构的包 -▼ + │ + │ 自动联网搜索、下载对应系统架构的包 + ▼ +---------------------------------------------------------------------------------+ | 本地包管理命令行工具 | | Python 官方自带: pip | Node.js 官方自带: npm | +---------------------------------------------------------------------------------+ - ``` -* **Python 的官方工具:`pip`** - * 在终端敲入:`pip install requests` - * `pip` 就会自动连上 Python 官方仓库(PyPI),把 `requests` 的代码下载到你的电脑里。 -* **JavaScript / Node.js 的官方工具:`npm`** - * 在终端敲入:`npm install axios` - * `npm` 就会自动连上 npm 官方仓库,把 `axios` 下载到本地。 +- **Python 官方工具:`pip`** + - 在终端执行:`pip install requests` + - `pip` 会自动连接 Python 官方仓库(PyPI),将 `requests` 下载安装到本地。 +- **JavaScript / Node.js 官方工具:`npm`** + - 在终端执行:`npm install axios` + - `npm` 会自动连接 npm 官方仓库,将 `axios` 下载安装到本地。 --- -## 2. 为什么千万不能“全局乱装”? +### 3. 为什么千万不能“全局乱装”? -很多刚接触编程的同学,电脑里只有一个全局默认环境:不管写什么代码,只要报错缺了库,就在终端里直接敲 `pip install xxx` 或 `npm install -g xxx`。 +很多刚接触编程的同学,电脑里只有一个全局默认环境:不管写什么项目,只要报错缺了库,就在终端里直接敲 `pip install xxx` 或 `npm install -g xxx`。 **前两周很省事,一个月后你的电脑就会演变成一场灾难。** -### 灾难一:环境污染 -这就像你每次买回来的鞋子、书籍、生肉、机械零件,**通通堆在进门的客厅地板正中央**。 -一年之后,客厅堆满了几百件物品。你根本不知道哪个零件属于大一的作业,哪双鞋是准备扔掉的。此时你想清理电脑,却发现只要删错一个文件,其他软件也跟着报废。 +#### 灾难一:环境污染 +这就像每次买回来的鞋子、书籍、食材、机械零件,**通通堆在客厅地板正中央**。 +一年之后,客厅堆满了几百件物品。你根本不知道哪个零件属于大一的作业,哪双鞋是准备扔掉的。此时你想清理电脑,却发现只要删错一个文件,其他原本正常的软件也跟着报废。 -### 灾难二:版本打架 +#### 灾难二:版本打架 这是所有程序员都会经历的噩梦: +- **大一第 1 学期**:你写了一个爬虫项目,依赖 `库A` 的 **1.0 版本**(该版本有一个关键函数叫 `download_data()`)。 +- **大一第 2 学期**:你选修了人工智能课,老师要求使用 `库B`,而 `库B` 必须绑定 `库A` 的 **2.0 版本**(在 2.0 中,开发者重构了代码,彻底删除了旧的 `download_data()` 函数)。 +- **结果**:你全局运行了 `pip install --upgrade 库A`。新课作业跑通了,但你上学期辛苦写的期末大作业由于找不到旧函数,**直接彻底报错报废**。两个项目在一个系统里无法共存。 -* **大一第 1 学期**:你跟着教材写了一个爬虫项目,依赖 `库A` 的 **1.0 版本**(该版本有一个关键函数叫 `download_data()`)。 -* **大一第 2 学期**:你选修了人工智能课,老师要求使用 `库B`,而 `库B` 必须绑定 `库A` 的 **2.0 版本**(在 2.0 中,开发者重构了代码,彻底**删除了**旧的 `download_data()` 函数)。 -* **结果**:你全局运行了 `pip install --upgrade 库A`。新课作业跑通了,但你上学期辛辛苦苦写的期末大作业由于找不到旧函数,**直接彻底报错报废**。两个项目在一个系统里,无法共存。 - -### 灾难三:“在我电脑上明明能跑!” -你把写好的 Python 脚本打成压缩包发给老师或搭档,对方双击运行,终端瞬间被刺眼的红字淹没: +#### 灾难三:“在我电脑上明明能跑!” +你把写好的 Python 脚本打成压缩包发给老师或搭档,对方双击运行,终端瞬间报红: ```text Traceback (most recent call last): File "main.py", line 2, in import requests ModuleNotFoundError: No module named 'requests' - ``` 因为这些库只躺在你个人电脑的全局系统目录里,对方的电脑是完全干净的,根本没有安装你用到的这堆依赖。 --- -## 3. 核心解药——虚拟环境与沙盒化思想 +### 4. 核心解药——虚拟环境与沙盒化思想 -解决上述所有问题的方案是:**给每个项目配一个独立的“一次性纸箱”——虚拟环境(Virtual Environment)。** +解决上述所有问题的标准方案是:**给每个项目配一个独立的“一次性纸箱”——虚拟环境(Virtual Environment)。** -``` +```text 你的物理电脑 (System OS) ├── 📦 项目 A 的纸箱 (.venv / node_modules) ---> 仅装 Python 3.8 + Pandas 1.0 ├── 📦 项目 B 的纸箱 (.venv / node_modules) ---> 仅装 Python 3.12 + PyTorch 2.0 └── 📦 项目 C 的纸箱 (.venv / node_modules) ---> 仅装 Node.js 20 + Vue 3 - ``` -### 1. 物理隔离 - -* 项目 A 的所有依赖,只安装在项目 A 根目录下的专属文件夹内; -* 项目 B 需要升级库,只影响项目 B 的纸箱,绝对波及不到项目 A; -* 项目做完结项了?直接在文件管理器里把这个文件夹**右键删除**,电脑立刻恢复干干净净,不留任何残留。 - -### 2. 配方表与装箱实体的分离(为什么忽略 .venv 和 node_modules) +#### (1)物理隔离 +- 项目 A 的所有依赖只安装在项目 A 根目录下的专属文件夹内; +- 项目 B 升级库只影响项目 B 的纸箱,绝对波及不到项目 A; +- 项目结项做完了?直接在文件管理器里把这个文件夹**右键删除**,电脑立刻恢复干净,不留任何残留。 +#### (2)配方表与装箱实体的分离(为什么忽略 .venv 和 node_modules) 在[Git 与 GitHub 入门](./git-github.md)中,我们强调过**千万不要把依赖文件夹推到 GitHub**: - -* **装箱实体(体积巨大)**:Python 的 `.venv/` 或前端的 `node_modules/` 里面充斥着成千上万个编译好的动态链接库与脚本,动辄占用 **500MB 到几 GB** 的磁盘空间。 -* **清单配方表(极度轻量)**:我们只需要在项目里放一份几 KB 的**依赖清单文件**。 +- **装箱实体(体积巨大)**:Python 的 `.venv/` 或前端的 `node_modules/` 里面充斥着成千上万个编译好的动态链接库与脚本,动辄占用 **500MB 到数 GB** 的磁盘空间。 +- **清单配方表(极度轻量)**:我们只需要在项目里放一份几 KB 的**依赖清单文件**。 | 概念对应 | Python 规范(现代标准) | JavaScript / Node 规范 | 作用与含义 | -| --- | --- | --- | --- | +| :--- | :--- | :--- | :--- | | **项目依赖清单(配方表)** | `pyproject.toml` | `package.json` | 声明项目基本信息、用到了哪些库(如 `pandas>=2.0`) | -| **版本锁定文件(安全锁)** | `uv.lock` | `package-lock.json` / `pnpm-lock.yaml` | 精确记录每个库及其孙子辈依赖的**唯一哈希值与精确版本**,防止换电脑安装时因版本漂移报错 | +| **版本锁定文件(安全锁)** | `uv.lock` | `package-lock.json` / `pnpm-lock.yaml` | 精确记录每个库及其间接依赖的**唯一哈希值与精确版本**,防止换电脑安装时因版本漂移报错 | | **本地依赖实体(严禁提交)** | `.venv/` | `node_modules/` | 实际下载并解压在本地硬盘的代码文件,必须写入 `.gitignore` | -任何人只要从 GitHub 克隆了你的仓库,在本地敲一行恢复命令,系统就会按着配方表把整个纸箱一比一原样复刻出来! - ---- - -## 4. 现代主流工具横向对比 - -既然官方已经有了 `pip` 和 `npm`,为什么近几年全网都在强推 **Conda、uv、pnpm 和 bun**? - -因为官方工具在面对**重度工业级计算**与**大规模工程**时,暴露出了两大严重短板:**速度奇慢无比** 以及 **重复浪费磁盘空间**。 +#### (3)传递依赖(Transitive Dependencies)与依赖树 +很多同学在刚接触包管理时会有疑问:*“我明明只安装了一个 `requests`,为什么依赖文件夹里凭空多出了 `urllib3`、`idna`、`certifi`、`charset_normalizer` 四个包?”* -### Python 生态工具 +这是因为**库本身也是由其他库构建而来的**。这四个包是 `requests` 所必需的底座,被称为**传递依赖(间接依赖)**。 -#### 1. Conda(Miniconda / Anaconda):AI 与深度学习的“重装挖掘机” +在现代包管理工具中,你可以直接在终端执行: -* **为什么深度学习离不开它?** -* `pip` 主要是针对 Python 纯源码包的管理; -* 但诸如 PyTorch、TensorFlow、OpenCV 等科学计算库,底层大量依赖于 C++ 动态链接库和 NVIDIA 显卡的 **CUDA / cuDNN 驱动**。纯靠 `pip` 常常因为系统底层缺少 C++ 运行库而频繁报错。 -* Conda 不仅能管 Python 包,**它甚至能管 C++ 编译器、跨平台的二进制库和显卡驱动**。 - - -* **缺点**:体积臃肿动辄十几 GB,依赖解析时经常卡在 `"Solving environment..."` 半天不动。 - -#### 2. uv:极速飞跃的现代全能管家(Rust 编写) +```bash +uv tree +``` -* **优势**: -* **快到不可思议**:比传统 `pip` 快 **10 到 100 倍**,利用多线程与底层缓存秒级完成安装。 -* **自动托管 Python 解释器**:电脑没装 Python?敲一行 `uv python install 3.11`,它自动帮你下载配置好,再也不用去官网下安装包配系统环境变量。 -* **三合一极简体验**:将 Python 版本管理、虚拟环境管理、依赖锁定集成到一个单文件工具里。 +终端会立即打印出一棵清晰的依赖拓扑树: +```text +my-project v0.1.0 +└── requests v2.32.3 + ├── certifi v2024.8.30 + ├── charset-normalizer v3.4.0 + ├── idna v3.10 + └── urllib3 v2.2.3 +``` +这也是版本锁定文件(如 `uv.lock`)的核心价值所在:**它不仅锁定了你直接引用的顶层库,更将背后整棵依赖树的所有间接依赖版本与内容哈希完全定格。** --- -### JavaScript / 前端生态工具 - -#### 1. npm:基础标配但磁盘吞噬者 - -* Node.js 安装自带,生态兼容性最好,但重复下载慢,且每个项目都会完整复制一份庞大的 `node_modules`。 - -#### 2. pnpm:现代大厂与主流开源项目的标准选择 - -* **核心黑科技:全局硬链接(Hard Link)** -* 如果你有 10 个项目都用到了 Vue 库,传统的 `npm` 会在你的硬盘里复制 10 份一模一样的代码(吃掉几个 GB)。 -* **`pnpm` 在你的电脑里永远只存一份**!其他项目里只是创建了一个指向该文件的“快捷方式(硬链接)”。瞬间为你的 C 盘省下几十 GB 空间,是目前前端工程化规范的首选。 +## 进阶难度:现代工具与实操工作流 +### 5. 现代主流工具横向对比 +既然官方已经有了 `pip` 和 `npm`,为什么近几年全网都在推荐 **uv、Conda、pnpm 和 bun**?因为官方老工具在大规模工程面前暴露出了两大瓶颈:**解析下载慢** 与 **重复浪费磁盘空间**。 -#### 3. bun:Zig 语言编写的“一体化小钢炮” +#### Python 生态工具 +- **Conda(Miniconda / Anaconda):AI 与科学计算的重型武器** + - `pip` 主要管理 Python 纯源码包;而 PyTorch、TensorFlow、OpenCV 底层大量依赖 C++ 动态链接库与 NVIDIA 的 **CUDA / cuDNN 显卡驱动**。Conda 不仅能管理 Python 包,还能直接托管 C++ 编译器和显卡底层库。 + - 缺点:体积臃肿动辄十几个 GB,依赖解析时经常卡在 `"Solving environment..."`。 +- **uv:极速飞跃的现代全能管家(Rust 编写,强烈推荐)** + - **安装速度极快**:比传统 `pip` 快 **10 到 100 倍**,利用多线程与全局缓存秒级完成安装。 + - **自动托管 Python 解释器**:电脑没装 Python?执行 `uv python install 3.11`,它自动下载配置好,无需去官网找安装包配系统环境变量。 + - **开箱即用**:将 Python 版本管理、虚拟环境隔离、依赖锁定全部集成在单个极小二进制文件中。 -* 把包管理器与代码运行时合二为一,安装速度甚至超越 pnpm;且原生支持直接运行 TypeScript 代码(无需配置转译工具)。 +#### JavaScript / 前端生态工具 +- **npm**:Node.js 安装自带,生态兼容性最好,但重复下载慢,每个项目完整复制一份沉重的 `node_modules`。 +- **pnpm:现代大厂与主流开源项目的标准选择** + - **全局硬链接机制**:如果有 10 个项目都用到了同一个框架,传统 `npm` 会在硬盘里重复复制 10 份;而 `pnpm` 在全局只存一份,各个项目里仅建立指向该文件的轻量硬链接,为磁盘省下海量空间。 +- **bun**:Zig 语言编写的一体化运行时与包管理器,安装速度极快,且原生支持直接执行 TypeScript 代码。 --- -## 5. 课前极简安装指引(建议提前配置) +### 6. 课前安装指引(uv) -在下半节课的实操互动中,我们将重点使用 **uv** 与 **bun** 带大家体验极速安装与开箱即用的工作流。请在课前根据操作系统安装好: +打开 VS Code 内置终端(快捷键 `Ctrl + ` ` / macOS: `Cmd + ` `): -### 安装 uv +- **Windows 系统 (PowerShell)**: + ```powershell + powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex" + ``` + > 提示:该命令从 Astral 官方地址下载执行安装脚本。执行前可打开链接核实内容;请勿对未知来源地址使用 `irm | iex`。 +- **macOS / Linux 系统**: + ```bash + curl -LsSf https://astral.sh/uv/install.sh | sh + ``` -打开 VS Code 内置终端(快捷键 `Ctrl + `` / Mac: `Cmd + ``): - -* **Windows 系统 (PowerShell)**: - -> 下面的命令会从 Astral 官方地址下载并执行安装脚本。执行前请先打开链接检查脚本内容;不要对来源不明的地址使用 `irm | iex`。 - -```powershell -powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex" - -``` - - -* **macOS / Linux 系统**: -```bash -curl -LsSf https://astral.sh/uv/install.sh | sh - -``` - - - -> 验证安装:**完全关闭终端并重新打开**,输入 `uv --version`,只要输出了版本号即代表安装成功! +> 验证安装:**完全关闭终端并重新打开**,输入 `uv --version`,输出版本号即代表安装成功。 --- -## 6. 实操工作流预演(课上现场动手) -### 使用 uv 管理 Python 项目(无需繁琐切换) +### 7. 本地实操:自主开发工作流(使用 uv) + +使用 `uv` 管理本地 Python 工程,无需繁琐的手动创建与激活虚拟环境: ```bash -# 1. 一键初始化一个规范的项目架构 -uv init my_python_project -cd my_python_project +# 1. 初始化一个结构规范的新项目 +uv init my_project +cd my_project -# 2. 声明并安装你需要的依赖(它会自动创建隔离的 .venv 并秒级下载包) +# 2. 声明并安装项目所需依赖(自动创建沙盒 .venv 并更新 pyproject.toml 与 uv.lock) uv add requests pandas -# 3. 运行你的代码(它会自动使用沙盒里的环境运行,完全省去手动激活环境的麻烦) -uv run main.py +# 3. 查验当前的依赖拓扑树 +uv tree +# 4. 运行代码(自动在项目的沙盒环境中执行,无需手动 activate) +uv run main.py ``` --- -## 7. 实用秘籍:国内网络镜像源加速 +### 8. 团队协作:接手项目一键复现(`uv sync`) -国内访问海外官方源偶发超时断连。配置国内高校或企业镜像源可以大幅提速: +在团队协作和大作业中最常见的场景是:**室友把写好的代码推到了 GitHub,或者将去除了 `.venv/` 的纯源码压缩包发给你。你下载打开后,因为本地没有任何依赖库,代码满屏报错。** -* **uv 临时使用清华源加速**: -```bash -uv pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple +切忌对着代码手动一个个去 `pip install`!在现代包管理规范下,标准的跨机复现流程只需两步: +#### 步骤 1:一键同步沙盒环境(`uv sync`) +打开 VS Code 终端进入项目根目录(该目录下包含 `pyproject.toml` 和 `uv.lock`),执行: + +```bash +uv sync ``` +`uv` 会自动读取依赖清单与版本锁定文件,在当前机器上**全自动创建 `.venv` 虚拟环境,并以完全相同的版本安装整棵依赖树中的全部库**。 -* **npm / pnpm 设置国内淘宝镜像源**: +#### 步骤 2:直接运行 ```bash -npm config set registry https://registry.npmmirror.com -pnpm config set registry https://registry.npmmirror.com - +uv run main.py ``` - +无需手动修改系统环境变量,代码即可平稳跑通。至此,“配方表与实体分离”的协作闭环正式达成——**不仅在你自己的电脑上能跑,换台电脑或交作业给别人,一行命令即可 100% 还原相同环境**。 --- -## 8. 拓展阅读:如果虚拟环境还不够?—— 容器技术(Docker) +### 9. 实用技巧:国内网络镜像源加速 -学完虚拟环境,你可能会想:**“虚拟环境已经很厉害了,它把我们这门语言的代码和包隔开了。那还有没有更彻底的隔离?”** +国内访问海外官方源偶发超时断连,配置国内高校或企业镜像源可显著提速: -有,这就是在工业界无处不在的**容器技术(以 Docker 为代表)**。 +- **uv 临时使用清华镜像源加速安装**: + ```bash + uv pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple + ``` +- **npm / pnpm 配置国内淘宝镜像源**: + ```bash + npm config set registry https://registry.npmmirror.com + pnpm config set registry https://registry.npmmirror.com + ``` -### 为什么还需要 Docker? +--- -虚拟环境只能隔离“Python 包”或“Node 模块”。但有时候,程序跑不起来根本不是 Python 的锅,而是**操作系统环境不同**: +## 挑战难度:系统级环境隔离 -* 你的代码在本地 Windows 上跑得很欢,发到生产服务器(Linux Ubuntu)上却疯狂报错,因为 Linux 缺少某个特定的系统字体、底层 C 运行时库或 OpenGL 驱动。 -* 数据库(如 MySQL、Redis)的安装步骤极其繁琐,不同系统配置完全不同。 +### 挑战:深度隔离延伸——容器技术(Docker) -### Docker 是什么? +虚拟环境能够完美隔离“语言级别的软件包(Python 包或 Node 模块)”。但在更复杂的工业级场景中,程序报错有时并非 Python 代码的问题,而是**底层操作系统与系统级环境的差异**: +- 你的代码在本地 Windows 上运行正常,部署到 Linux 生产服务器却报错,因为 Linux 缺少特定的系统字体、底层 C 运行时库或图形驱动; +- 数据库(如 MySQL、Redis)的系统安装步骤繁琐,不同操作系统配置差异巨大。 -如果说**虚拟环境**是给项目发了一个“纸箱”,那么 **Docker 容器**就是直接给项目配了一个“带轮子的微型简配版轻量级操作系统(集装箱)”。 +#### 容器(Docker)是什么? +如果说**虚拟环境**是给项目配备了一个“轻量纸箱”,那么 **Docker 容器**就是直接给项目配备了一个“标准化集装箱(微型操作系统环境)”: -``` +```text +-------------------------------------------------------------------------------+ | Docker 镜像 (Image) | | [代码] + [Python/Node环境] + [第三方库] + [精简版 Linux 系统底层环境] = 打包成一个整体 | +-------------------------------------------------------------------------------+ │ - │ 无论发到谁的电脑上 (Mac / Win / Linux) + │ 无论发到谁的电脑上 (macOS / Windows / Linux) ▼ +-------------------------------------------------------------------------------+ | Docker 容器 (Container) | -| 一键秒级启动,行为 100% 绝对一致,物理隔离 | +| 一键秒级启动,系统环境与行为 100% 绝对一致 | +-------------------------------------------------------------------------------+ - ``` -* **核心价值**:“在我电脑上能跑,在你的电脑上也绝对一模一样能跑”。你不再需要让别人装 Python、配依赖、配系统驱动;直接把这个镜像(Image)丢给对方,对方只要安装了 Docker,敲一行 `docker run` 就能一秒完整跑起来。 -* **学习建议**:现阶段写大作业,**掌握语言级的虚拟环境(uv / Conda)与包管理即可平趟 90% 的需求**。当你未来需要部署网站后端、跑复杂分布式模型或接触服务器运维时,Docker 会是你最得力的终极武器。 +- **核心价值**:实现真正意义上的跨系统“环境一致性”。 +- **学习建议**:现阶段完成课程大作业,**掌握语言级虚拟环境(uv / Conda)与包管理规范即可解决 95% 以上的需求**。容器技术可在后续接触云端部署、微服务或复杂系统运维时作为进阶方向继续探索。 + +--- + +## 推荐学习资源 + +- [Python Packaging User Guide](https://packaging.python.org/):Python 官方打包与分发权威指南 +- [uv 官方文档](https://docs.astral.sh/uv/):现代 Python 工具链参考手册 +- [pnpm 官方文档](https://pnpm.io/zh/):前端现代包管理器与全局硬链接机制 +- [Missing Semester:打包与交付代码(Shipping Code)](https://missing-semester-tw.github.io/2026/shipping-code/):MIT 经典公开课,系统讲解依赖关系、产物打包与跨环境交付原理