目录
npm install过程中的operation not permitted
打包过程中的operation not permitted分析
前置内容(可跳过)
环境配置
下载Node.JS并安装,查看版本命令检验node –v 和npm –v
https://electronjs.org/docs/tutorial/development-environment#setting-up-windows
初始化例程
若未配置git需下载样例程序:
https://github.com/electron/electron-quick-start
若已配置git可参考:
https://electronjs.org/docs/tutorial/first-app#installing-electron
- 解压例程至文件夹
- 在文件中,按住shift+鼠标左键,选择【在此处打开命令窗口】
- 命令行中输入npm install
- 若未发现错误 输入npm start 运行程序
- 若发现错误:
(node:4724) UnhandledPromiseRejectionWarning:
Error: EPERM: operation not permitted,lstat
'C:\Users\ADMINI~1\AppData\Local\Temp\electron-downloadVE91IJ\electron-v7.1.7-win32-x64.zip'
解决办法看下面的operation not permitted解决方案
打包成exe文件
参考: https://segmentfault.com/a/1190000013924153
- 在\electron-quick-start-master目录下适用命令行,键入命令
npm install electron-packager --save-dev
- 在package.json中添加代码:
"scripts": {
"package": "electron-packager ./ myapp --out ./OutApp"
}
- 命令行中执行npm run package
- 若出现该问题
即发现错误:
(node:4724) UnhandledPromiseRejectionWarning:
Error: EPERM: operation not permitted,lstat
'C:\Users\ADMINI~1\AppData\Local\Temp\electron-downloadVE91IJ\electron-v7.1.7-win32-x64.zip'
解决办法看下面的operation not permitted解决方案
operation not permitted解决方案
在文件electron-quick-start-master\node_modules\@electron\get\dist\cjs\index.js中修改代码
即在url后添加
if(url.startsWith("http://npm.taobao.org/mirrors/electron/v"))
url=url.replace("http://npm.taobao.org/mirrors/electron/v","http://npm.taobao.org/mirrors/electron/");
if(url.startsWith("https://npm.taobao.org/mirrors/electron/v"))
url=url.replace("https://npm.taobao.org/mirrors/electron/v","https://npm.taobao.org/mirrors/electron/");
错误原因是生成的下载地址多了个字母v,详细情况可看下面分析过程。
operation not permitted异常分析
npm install过程中的operation not permitted
分析控制台输出信息:
由输出信息可知:
- 该错误是在目录\electron-quick-start-master\node_modules\electron中,执行node install.js命令时出现
- 最后位置为C:\Users\ADMINI~1\AppData\Local\Temp\
- 提示信息为:operation not permitted(操作未被允许)
根据输出信息初步判断是临时目录权限问题,命令行中输入 npm config ls -l,得
说明C:\Users\ADMINI~1\AppData\Local\Temp\为npm安装模块时的临时目录,若该目录有权限问题,则npm在安装其他模块时,也会报出operation not permitted错误,npm可正常安装其他模块,故可排除C:\Users\ADMINI~1\AppData\Local\Temp\具有权限问题。
此时怀疑为electron-v7.1.7-win32-x64.zip未下载成功,导致operation not permitted错误,故分析\electron-quick-start-master\node_modules\electron目录下的install.js文件,找到下载相关的代码:
由代码易知,若下载失败,extractFile函数将会抛出一个异常,猜想得到了初步的验证,向上追踪downloadArtifact函数:
查看\electron-quick-start-master\node_modules\@electron\get目录
点开package.json,得
可知相关代码在\electron-quick-start-master\node_modules\@electron\get\dist\cjs目录中的index.js里,继续分析index.js文件,找到downloadArtifact函数相关代码得
为验证是否是下载时出现问题,在url后新增输出语句,将下载目标的url输出,若可通过url手动下载,则说明目标地址没有问题,转而排查downloadArtifact函数的业务逻辑。若目标地址不可下载,则可初步确定已定位问题原因。
在\electron-quick-start-master\node_modules\electron目录的命令行(目录下shift+右键,命令行中执行)内,执行node install.js
得下载地址
http://npm.taobao.org/mirrors/electron/v7.1.7/electron-v7.1.7-win32-x64.zip
浏览器浏览该地址,果然是无法访问,则可确定,问题源自此处
通过不断向上级目录查看,发现淘宝镜像下并非没有我没所要的文件
而是淘宝镜像下,该文件的地址为(版本号差了一个v):
http://npm.taobao.org/mirrors/electron/7.1.7/electron-v7.1.7-win32-x64.zip
在文件electron-quick-start-master\node_modules\@electron\get\dist\cjs\index.js中修改代码
即在url后添加
if(url.startsWith("http://npm.taobao.org/mirrors/electron/v7.1.7"))
url=url.replace("http://npm.taobao.org/mirrors/electron/v7.1.7","http://npm.taobao.org/mirrors/electron/7.1.7");
在\electron-quick-start-master\node_modules\electron目录的命令行(目录下shift+右键,命令行中执行)内,执行node install.js
执行成功,没有报错
回到\electron-quick-start-master目录下的命令行,执行npm start
成功加载界面。
打包过程中的operation not permitted分析
打包过程中electron-packager会临时下载一个electron模块,所以其中的operation not permitted异常与上述一致,要么因为临时文件夹权限问题,要么就是目标文件无法下载。如果临时文件夹权限存在问题,那么显然其他模块也无法正常下载,所以究竟是哪种情况其实很好分辨。若是目标文件无法下载,可参照上述分析过程,很硬核的把目标地址强行改为有效地址。