章节摘要:前两章解决了"装什么、装在哪",这一章解决"怎么装":沿安装流水线走完全程——预检、取件、编译、脚本、收尾——并在缓存环节停下来做一次对照实验。本章也是理解安装期安全问题(第六章)与安装性能问题(6.2)的机制基础:postinstall 脚本是供应链攻击的头号入口,缓存是安装提速的第一杠杆,两者都在这一章先见机制、后见对策。
一句总纲:安装不是复制文件,而是一段受控的程序执行过程——文件从哪来、解到哪去、装完跑什么,每一步都有钩子,每个钩子都是能力也是风险。日常被一句话带过的 npm install,内部是一条完整的流水线。
状态图里最值得留意的是取件阶段的双路设计:缓存命中与远端下载最终汇合到同一落盘环节,但两条路的校验纪律不同——这条缝是 4.4 节对照实验的主角,也是缓存投毒攻击的理论入口。
4.1 核心安装步骤剖析:逐阶段勘验安装流水线,每阶段配一段真实日志,学会从报错形态反推失败阶段。这是本章的地基节。
4.2 生命周期脚本执行机制:把脚本钩子的触发时机、执行顺序、工作目录一次讲清,并给出安装期脚本的审计方法——哪些脚本该看、在哪看、看什么。
4.3 二进制包编译机制:解释为什么有些包安装时要现场编译、预编译产物如何分发、编译失败时按什么顺序排查。原生依赖是安装期事故的第二大来源。
4.4 缓存与离线安装对照实验:亲手做实验量化缓存收益,勘验两种工具的缓存结构差异,并引出离线安装这个供应链与性能双料话题。
[4.1 流水线全景] —— 给出全程地图 | v [4.2 脚本钩子] —— 地图上能力最强的一站 深挖 | v [4.3 原生编译] —— 脚本钩子的头号用户 深挖 | v [4.4 缓存实验] —— 地图上性能杠杆最大的一站 实验验证
推进逻辑是"全景 → 两个深挖点 → 一个实验点"。4.2 与 4.3 是因果对:脚本机制(因)造就了原生编译生态(果);4.4 则是独立的性能支线,但它的缓存命中判定与 4.1 的取件阶段直接衔接。读完本章,再回头看第三章的 ci 命令,会理解"先清后装"清掉的到底是什么。
进入各节之前带着问题读,读完回来对答案。问题一:流水线的五个阶段里,哪一段最可能把"装不上"的锅甩给网络?——生命周期段:包文件已就位而脚本执行失败,报错常被误读为下载问题(4.1 节)。问题二:postinstall 与 install 钩子的差别是什么?——触发时机与覆盖范围不同:前者在全部安置完成后执行,是编译与配置的主战场(4.2 节)。问题三:热缓存安装为什么几乎和离线一样快?——因为热安装的主导成本是本地读写而非网络(4.4 节)。三问都能秒答,本章才算真读进去了。
前置:第三章的照抄语义(4.1 的取件行为完全建立在"锁文件在场"的前提上)、基础的命令行与进程概念。
后续延伸:本章是第六章的前置——供应链攻击的主要手法(安装脚本执行恶意代码、缓存投毒)都要在本章机制上才讲得清;6.2 的性能优化三板斧(缓存、并行、按需安装)同样根植于本章。建议本章与第六章连读,机制与对策一次配齐。
本章金句:安装流水线上每一个"自动帮你做"的环节,都是一次授权——看清授权清单,才算真正接管了自己的构建环境。