yay (Yet Another Yogurt)

1. 概述与核心定位

  • 名称:yay(Yet Another Yogurt)
  • 类型:Arch Linux 官方包管理器 pacman 的增强封装器(Wrapper)与 AUR 助手(AUR Helper)。
  • 核心定位:无缝桥接 Arch 官方软件仓库与社区驱动的 AUR(Arch User Repository),以统一的 CLI 交互处理官方预编译二进制包和社区源码构建包。

2. 核心概念与架构设计

官方仓库 vs AUR

  • 官方仓库(Core / Extra / Multilib):提供经官方打包测试的预编译二进制包(.pkg.tar.zst),直接通过 pacman 极速下载解压安装。
  • AUR(用户仓库):存放的是构建脚本(PKGBUILD)与元数据,而不是编译好的成品。安装时需在本地从源码拉取、安装编译工具并就地编译打包。

权限分离原则(Security Model)

  • 绝不以 root 身份运行 yay:AUR 脚本属于社区提供,以 root 直接运行存在极大安全隐患。
  • 普通用户编译:拉取源码、解压、打补丁及执行编译全程使用当前普通用户权限(makepkg 强制要求非 root)。
  • 按需提权(sudo):仅在“安装系统级编译依赖(Make Dependencies)”和“将打包好的软件安装到系统目录(/usr)”这两个关键节点提示输入 sudo 密码。

本地编译与构建缓存

  • 构建环境:默认直接运行于宿主系统环境(依赖安装到系统,编译在普通用户空间执行)。
  • 缓存位置:源码仓库与中间产物默认存放于 ~/.cache/yay/<包名>/。
  • 生成产物:最终产物为标准的 Arch 软件包(如 <包名>-<版本>.pkg.tar.zst),内部包含二进制程序、.desktop 桌面入口、图标及系统依赖声明。

3. AUR 软件包安装与构建完整流程

flowchart TD
    Start["执行 yay -S <aur-pkg>"] --> Resolve["1. 解析依赖(区分运行依赖与编译依赖)"]
    Resolve --> PromptClean{"2. 交互提示: 是否 cleanBuild 缓存?"}
    PromptClean --> CheckMakeDeps{"3. 系统是否已安装编译依赖 (MakeDeps)?"}
    CheckMakeDeps -->|否| SudoMake["[sudo] 调用 pacman 安装构建工具 (如 rust, meson, ninja)"]
    CheckMakeDeps -->|是| Fetch["4. 拉取/更新 PKGBUILD 与源码到 ~/.cache/yay/"]
    SudoMake --> Fetch
    Fetch --> PromptDiff{"5. 交互提示: 是否审查代码改动 (Diffs)?"}
    PromptDiff --> Build["6. 普通用户执行编译与打包 (makepkg)"]
    Build --> PkgDone["生成本地归档包: <pkg>.pkg.tar.zst"]
    PkgDone --> SudoInstall["[sudo] 调用 pacman -U 安装至系统根目录"]
    SudoInstall --> PromptCleanDeps{"7. 交互提示: 是否清理编译依赖 (Remove make dependencies)?"}
    PromptCleanDeps -->|y| RemoveDeps["[sudo] 卸载仅用于构建的工具,节省磁盘"]
    PromptCleanDeps -->|N| Done["安装完成"]
    RemoveDeps --> Done

4. 关键交互提示释义(Prompts Reference)

在执行 AUR 软件包安装时,yay 会在不同阶段触发以下经典提示:

提示内容触发时机选项含义与推荐选择
Packages to cleanBuild?本地已有历史构建缓存时• [N]one(默认,直接回车):保留缓存增量构建,速度最快。
• [A]ll:清空缓存彻底重拉构建,排查编译报错时使用。
Diffs to show?准备构建前• 提示是否查看 PKGBUILD 及相关补丁的安全差异。
• 默认直接回车(None)跳过审查;安装不信任来源时可输入对应编号核查代码。
looking for conflicting packages...准备安装依赖/本体时• 此为 pacman 的常规安全性检查日志(“正在核验是否存在文件/包冲突”),属于正常流程,并非发生冲突。
Remove make dependencies after install? [y/N]编译并安装全部完成之后• 是否自动卸载仅在编译期间派上用场的重型构建工具(如 rust、meson、lld)。
• 空间紧张输 y 清理;后续经常编译此类项目直接回车(N)保留。

5. 常用命令速查(Cheat Sheet)

安装与更新

# 安装官方包或 AUR 包(语法与 pacman -S 完全一致)
yay -S <package-name>
 
# 全系统滚动更新(同步更新官方包与所有已安装的 AUR 包)
yay -Syu
# 或简写为(不加任何参数即默认执行 -Syu)
yay
 
# 强制重新构建并安装 AUR 包
yay -S --rebuild <aur-pkg>

搜索与信息查看

# 跨官方源和 AUR 模糊搜索软件包
yay -Ss <keyword>
 
# 查看软件仓库详情(源码地址、依赖、许可证等)
yay -Si <package-name>
 
# 查看本机已安装包的信息与安装时间
yay -Qi <package-name>
 
# 列出某个已安装包释放的所有文件路径
yay -Ql <package-name>

卸载与清理

# 彻底卸载软件包及其不再被其他软件依赖的孤立依赖(推荐)
yay -Rns <package-name>
 
# 清理未安装包的下载缓存及无用构建缓存
yay -Sc
 
# 彻底清空所有包缓存(释放大量磁盘)
yay -Scc