如何解决GitHub上NPM包安装脚本依赖devDependencies失败问题?
解决NPM包从Git安装时Babel转译失败的问题
针对你遇到的这个问题,有几个优雅的解决方案,既不用把Babel移到dependencies里膨胀包体积,又能保证用户正常安装:
方案一:预构建代码并提交到Git仓库
这是最推荐的方案,把转译步骤提前在你本地完成,用户安装时直接用已经转译好的代码:
- 先在本地添加一个专门的构建脚本(比复用install脚本更清晰):
"scripts": { "build": "mkdir -p lib && babel src/index.js -o lib/index.js", "test": "jest src" }, - 运行
npm run build生成lib目录,把这个目录从.gitignore中移除,提交到GitHub仓库 - 修改
package.json的main字段,指向转译后的文件:"main": "lib/index.js" - 删掉原来的
install脚本,避免用户安装时重复执行转译
这样用户安装你的包时,直接拿到的就是已经转译好的代码,完全不需要在他们的环境里跑Babel,devDependencies里的工具只会在你开发和构建时用到。
方案二:用prepare脚本替代install脚本
NPM的prepare脚本会在多个关键时机自动运行:包括你本地执行npm install时、执行npm pack打包时,以及用户从Git仓库安装你的包时。而且运行prepare脚本前,NPM会自动安装所有devDependencies,刚好满足转译的需求:
- 修改
package.json的scripts:"scripts": { "prepare": "mkdir -p lib && babel src/index.js -o lib/index.js", "test": "jest src" }, - 当用户执行
npm install git+ssh://git@github.com:user/repo.git时,NPM会先安装你的包的所有devDependencies(包括Babel相关工具),然后运行prepare完成转译,最后如果用户是用生产模式安装(默认就是生产模式),NPM会自动移除devDependencies,不会留在用户的node_modules里。
这个方案适合你不想提交构建产物到代码仓库的场景,但用户安装时会临时下载dev依赖,不过转译完成后就会被清理。
方案三:提前打包成tar包供用户安装
如果你既不想提交构建产物到Git,也不想让用户临时装dev依赖,可以本地打包好完整的包文件:
- 运行
npm run build生成转译后的lib目录 - 执行
npm pack,会生成一个类似your-package-name-1.0.0.tgz的压缩包,这个包里包含了所有必要的文件(包括转译后的代码) - 把这个tar包上传到GitHub Releases,用户可以直接通过tar包的URL安装:
npm install https://github.com/user/repo/releases/download/v1.0.0/your-package-name-1.0.0.tgz
这个方案需要你维护打包后的文件,但用户安装体验和普通NPM包完全一致。
内容的提问来源于stack exchange,提问作者sdgfsdh
相关产品推荐
相关产品推荐

