安装GitHub版diff包:如何将构建流程移至preinstall钩子
我明白你遇到的困扰了——直接从GitHub仓库安装包时,npm默认不会自动触发项目的构建流程,所以才会出现只看到src目录,却没有编译好的lib/dist文件夹的情况。下面一步步教你把构建流程整合到安装钩子中,同时避开容易踩的坑:
步骤1:修改你fork仓库的package.json
先打开你fork的jsdiff仓库根目录下的package.json,找到scripts字段:
情况1:仓库已有build脚本
如果原仓库已经定义了build命令(比如类似"build": "babel src --out-dir lib"这类编译指令),你只需要添加钩子脚本即可:
"scripts": { // 注意:preinstall会在依赖安装前执行,若build需要依赖devDependencies会失败 // "preinstall": "npm run build", // 更推荐用prepare钩子,它会在依赖安装完成后自动执行 "prepare": "npm run build", "build": "原仓库的build命令内容" }
情况2:仓库没有build脚本
如果原仓库没有现成的build命令,你可以参考原仓库的README或GitHub Actions配置,补全构建逻辑。比如jsdiff通常用babel或rollup编译,把对应的构建命令添加到scripts里,再配置钩子。
步骤2:为什么更推荐prepare而不是preinstall?
preinstall是在npm安装所有依赖之前执行的,如果你的build脚本需要用到项目的devDependencies(比如babel-cli这类工具),这时候这些依赖还没安装,构建会直接失败。
而prepare钩子的执行时机更合适:
- 本地执行
npm install时,先安装所有依赖,再执行prepare - 从GitHub远程安装包时,npm会先拉取代码、安装依赖,再执行prepare,最后完成安装
这样能确保构建所需的工具都已就绪,顺利生成lib/dist目录。
步骤3:提交修改并重新安装
把修改后的package.json提交到你fork的GitHub仓库,然后重新执行安装命令:
npm install git+https://github.com/calcbenc h/jsdiff.git
这次安装时,npm会自动触发你配置的钩子脚本完成构建,node_modules/diff里就会出现预期的lib和dist目录了。
额外小提示
如果你只是临时需要这个包,不想修改fork仓库的话,也可以本地克隆仓库后手动执行npm run build,再用npm install /本地仓库路径完成安装,但修改fork仓库的钩子显然是更长期的解决方案。
内容的提问来源于stack exchange,提问作者andrewkittredge

