node_modules/.bin/ 软链接丢失

2,311 阅读1分钟

背景

项目:一个 nuxt 架构的前端项目
要发布了,运营告诉我不能在生产机上运行 npm install,那就拷贝一个 node_modules 用呗。然后就在测试环境运行了 npm installzip node_modules.zip node_modules这两个命令做了安装并压缩 node_modules, 再把node_modules.zip传到生产机上解压使用。

问题

然后在生产机上执行 npm run build:prod 构建项目,报错。

[*************** dist]$ npm run build:prod

> ************************
> cross-env BUILD_ENV=production nuxt build

module.js:549
    throw err;
    ^

Error: Cannot find module '..'
    at Function.Module._resolveFilename (module.js:547:15)
    at Function.Module._load (module.js:474:25)
    at Module.require (module.js:596:17)
    at require (internal/module.js:11:18)
    at Object.<anonymous> (**************/dist/node_modules/.bin/cross-env:3:18)
    at Module._compile (module.js:652:30)
    at Object.Module._extensions..js (module.js:663:10)
    at Module.load (module.js:565:32)
    at tryModuleLoad (module.js:505:12)
    at Function.Module._load (module.js:497:3)
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR!******************** build:prod: `cross-env BUILD_ENV=production nuxt build`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the *************** build:prod script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     **************/2020-08-05T09_35_36_129Z-debug.log

这个问题的原因是 node_modules/.bin/ 内的软链接(符号连接)被替换成指向的文件,所以执行代码的时候就各种 module 路径不对。

解决办法

思来想去可能是压缩的时候软链接丢失。 开始google, 结果如下:

  • zip 参数 -y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。

    zip -yr node_modules.zip node_modules
    

    解压后的 .bin:

    zip 参数参考地址:www.runoob.com/linux/linux…

  • tar + gzip
    tar 是打包工具,参数 -z或--gzip或--ungzip 通过gzip指令处理备份文件

    tar -czvf node_modules.tar.gz node_modules
    

    解压后的 .bin:

    tar 参数参考地址:www.runoob.com/linux/linux…