解决由于VMWare共享文件夹功能bug导致的yarn(或npm)无法正常使用的问题

转自 https://zhuanlan.zhihu.com/p/36223413

问题特征

在使用yarn或者npm过程中,尝试添加包(或者直接通过install添加package.json中所有包时)最后一步报错,提示无权限之类的信息。

$ yarn add webpack
yarn add v1.6.0
warning package.json: No license field
warning No license field
[1/4] Resolving packages...
[2/4] Fetching packages...
info fsevents@1.2.3: The platform "linux" is incompatible with this module.
info "fsevents@1.2.3" is an optional dependency and failed compatibility check. Excluding it from installation.
[3/4] Linking dependencies...
error An unexpected error occurred: "ENOTSUP: operation not supported on socket, symlink '../../../acorn/bin/acorn' -> '/mnt/hgfs/workspace/temp/nodetest/node_modules/acorn-dynamic-import/node_modules/.bin/acorn'".
info If you think this is a bug, please open a bug report with the information provided in "/mnt/hgfs/workspace/temp/nodetest/yarn-error.log".
info Visit https://yarnpkg.com/en/docs/cli/add for documentation about this command.

解决方案

全局启用no-bin-link选项即可

对于yarn,在~/.yarnrc中添加

"--*.no-bin-links" true

对于npm

config | npm Documentation​docs.npmjs.com

我早就不用npm了,我不知道怎么配置

问题出现的原因

vmhgfs(应用于VMWare共享文件夹的Linux端vfs)不支持symlink(或者可能是不支持Linux和Windows下的符号链接格式互相转换)。

这个问题其实我已经折腾很久了,最开始我的解决思路是使用其他方式去代替vmhgfs,比如nfs和cifs(smb)。nfs性能太低,cifs也不支持symlink,一直都没有完美的,后来调转思路发现其实通过这样去禁用yarn(npm)的符号链接创建也可以。

以下文字更改并添加于2019.11.19

但是这样并没有完全解决vmhgfs不支持symlink这个问题,会导致诸如webpack、prettier这样的node包暴露出来的命令行命令无法使用,暂时没有比较好的解决办法。

这个功能的工作原理是这样的

  1. package.json里有个字段叫bin,指向模块的命令行入口
  2. yarn或者npm在安装的时候会检测被安装包的package.json里有没有bin字段,如果有的话会把对应的文件拉一个symlink到<项目根目录>/node_modules/.bin目录下
  3. 配置nodejs的环境变量的时候,对于yarn一般会往PATH里加一段(yarn bin)和(yarn global bin)用来指向当前目录和全局的nodejs的包暴露的可执行程序文件夹,这个命令输出的就是2中的那个.bin文件夹
  4. 执行命令的时候自然会按照这套配置找到对应的用来做命令行入口的可执行文件了。

我之前还在头铁用vmhgfs的时候曾经写过一个脚本,抓当前project下的所有包的package.json,然后像在windows下创建lnk那样手动往.bin文件夹里放置脚本来指向对应的命令行入口脚本。这个思路其实现在想想也挺好的。我记得当初甚至一度萌生了给yarn开PR的想法,后来看了看yarn的源码感觉当时的我去改起来还着实有点难以保证质量hh

总之我现在已经不用共享文件夹了。symlink其实是小问题,重点是vmhgfs性能不行,至少小文件读写真的不行,你直接在机器上来yarn install会发现比hgfs快了不少。反正我现在的选择是直接建了个vmdk挂到vm上存源码,这样没有任何的问题,缺点就是不太确定vmdk这个东西故障恢复做的怎么样,不知道损坏的概率大不大。。。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容