npm从Bitbucket Git源安装私有包时出现部分源码文件缺失问题
问题原因
- npm 6.x 版本从Git地址安装依赖时,会自动执行依赖包的打包逻辑:优先读取依赖包
package.json中files字段指定的允许发布的文件列表,如果没有配files字段,会依次读取.npmignore、.gitignore的过滤规则,排除掉匹配到的文件后再安装到node_modules。 - 本地通过
file:协议安装依赖时,npm会直接复制/软链整个本地目录,不会触发打包过滤逻辑,因此所有文件都完整保留。 - 你遇到的文件缺失,排除分支代码本身提交不全的情况外,就是因为目标依赖包的配置规则过滤掉了
file2.js、file3.js两个文件。
解决方法
- 第一步:验证根因
先确认你配置的Git地址对应的分支代码是否完整,有没有存在分支提交时遗漏file2.js、file3.js的情况。排除代码本身不全的问题后,进入目标依赖包的本地仓库根目录,执行npm pack命令,会在当前目录生成后缀为.tgz的压缩包,解压后查看内部文件结构,和Git安装后node_modules下的目录结构对比,即可确认是否为打包过滤导致的问题。 - 第二步:修改依赖包配置(三选一即可,优先级从高到低)
- 优先修改依赖包
package.json的files字段:直接指定需要发布的完整目录,比如配置为"files": ["src/"],即可将整个src目录下的所有文件纳入打包范围,不会出现遗漏。 - 如果依赖包根目录存在
.npmignore文件,检查是否存在匹配file2.js、file3.js的排除规则,删除对应规则即可。 - 如果没有
.npmignore文件,检查.gitignore是否存在对应排除规则:如果这两个文件不需要被Git忽略,直接删除.gitignore中对应规则即可;如果这两个文件确实需要被Git忽略但需要纳入npm打包范围,新增一个.npmignore文件(优先级高于.gitignore),不要写入对应排除规则即可覆盖Git忽略的逻辑。
- 优先修改依赖包
- 临时规避方案:如果不方便修改依赖包配置,也可以将依赖包打包后的压缩包上传到内部文件存储,直接通过压缩包地址安装,或者本地打包后通过
file:协议引入。
内容的提问来源于stack exchange,提问作者Julian Rojas
相关产品推荐
相关产品推荐

