我们在Electron中可能会调用一些外部程序,比如extraResources中的ffmpeg等插件,在windows上,使用exec或是spawn基本不会有什么问题,但是到了mac上就会麻烦很多,苹果会人为的设置门槛不让你运行。以下是我遇到的几种情况,记录下解决方案。
最常见的是系统直接弹框提示无法运行
此时前往系统偏好设置 -> 隐私与安全性 -> 安全性下方,会提示“已阻止使用XXX” -> 点击“仍然允许”
然后重新运行你的程序,此时又会弹出来一个框说不安全,直接允许运行即可。
EACCES(Permission denied)
文件没有运行权限,这里直接赋予文件最高权限,-R表示递归调用子文件夹,所以/path/to/folder直接填你的项目文件夹就行,不用找到具体的文件
chmod -R 777 /path/to/folder
ENOENT (no such file or directory)
通常是你调用插件时候的路径错了,请仔细检查你执行的路径,并且最好用path.resolve一下把路径统一。如果带空格那么记得加上引号。
EPERM(operation not permitted)
文件没有调用的权限。需要3步来处理:
- 首先要确保文件有777权限(和EACCES一样处理):
chmod -R 777 /path/to/folder
- 系统偏好设置 -> 隐私与安全性 -> 完全磁盘访问权限 -> 终端 -> 打开
- 对文件夹递归调用,删除 macOS 文件上的扩展属性中的 com.apple.quarantine 标签。这是一个用来标记文件来源的扩展属性。当你从互联网下载文件或者从其他来源获取文件时,系统会给这些文件打上 quarantine 标签,作为一种安全机制。这个标签会提示用户文件的来源,并在首次打开该文件时发出警告,提醒用户该文件是从互联网或其他来源下载的。
find /path/to/folder -type f -exec xattr -d com.apple.quarantine {} \;
这个命令的含义是:
find /path/to/your/folder -type f: 在指定路径下找到所有的文件(包括子目录中的文件)。
-exec xattr -d com.apple.quarantine {} ;: 对于每个找到的文件,执行 xattr -d com.apple.quarantine 命令来移除 quarantine 属性。