Appium Server 源码分析(一)

姗姗来迟的 appium Server 的源码学习,其实github上 appium server的版本已经更新到了1.5的版本了,并且代码已经基本上进行重构了。但是还是出于初衷的原因吧,还是好好学些下appium server 1.4的源码,同时也学习一下nodejs吧。

目录结构

这里写图片描述

还是一样 我们首先来看看项目的目录结构吧,首先我们得知道程序的入口是main.js。

分析

再来我们逐一的来看看代码吧。

process.chdir(path.resolve(__dirname, '../..'));

上面这句代码的意思是修改当前的工作目录,从appium/lib/server 路径修改到appium路径下。 这里我们看到process并没有使用require命令进行加载,这个是因为process是一个全局的变量。

process.chdir() //修改工作目录

path.resolve(__dirname, '../..') //将参数 to 位置的字符解析到一个绝对路径里。

下来我们再看

if (require.main === module) {
  args = parser.parseArgs(); // 由parse模块来解析参数,并且将解析到的参数中的noPermsCheck赋值给noPermsCheck,同时初始化Log工厂。
  noPermsCheck = args.noPermsCheck; 
  logFactory.init(args);
}
require.main === module; //用来判当前的模块是否是直接运行的,例如 foo.js文件通过node foo.js运行的话,那么会返回true,而如果通过require('./foo'),将会返回false.
if (!noPermsCheck) {
  var appiumPermStat = fs.statSync(path.resolve(__dirname,
                                                '../../package.json'));
  var launchCmd = (process.env.SUDO_COMMAND || "").toLowerCase();
  var isWindows = require('appium-support').system.isWindows();

  if (
    !isWindows &&
    // Appium should be run by user who owns files in Appium installation directory
    appiumPermStat.uid !== process.getuid() &&
    // authorize* commands could be run using sudo
    !launchCmd.match(/authorize/)
  ) {
    logger.error("Appium will not work if used or installed with sudo. " +
                 "Please rerun/install as a non-root user. If you had to " +
                 "install Appium using `sudo npm install -g appium`, the " +
                 "solution is to reinstall Node using a method (Homebrew, " +
                 "for example) that doesn't require sudo to install global " +
                 "npm packages.");
    process.exit(1);
  }
}

默认情况下 我们的noPermsCheck是为false的,所以就是需要进行权限检查的。
首先:

var appiumPermStat = fs.statSync(path.resolve(__dirname, '../../package.json'));

这句的意思是读取 package.json 会返回一个stat数组对象,里面包含了文件的uid、gid、文件大小、创建时间、修改时间等等

var isWindows = require('appium-support').system.isWindows();// 这里通过 appium-support的第三方模块进行判断当前的系统是否为windows系统,查看 appium-support 发现实际上是最终是通过os.type来判断是否为"Windows_NT","Darwin"或者其他来说明是否为windows系统

最后我们再看判断语句吧!

if (
    !isWindows &&
    // Appium should be run by user who owns files in Appium installation directory
    appiumPermStat.uid !== process.getuid() &&
    // authorize* commands could be run using sudo
    !launchCmd.match(/authorize/)
  ) {
    .....
    }

这里的判断满足条件是非windows的环境下,并且判断package.json文件的uid和进程的uid是否相等,因为只有相等才能够说明当前的用户对该文件具有执行的权限。最后如果都不满足就判断launchCmd是否包含authorize,就是已sudo的权限运行了。

所以我们再安装appium的时候记住不要使用sudo npm install -g appium 来安装哦。

最最后:

if (require.main === module) {
  main(args);
}
module.exports.run = main;

可以看出 main提供给外部的是一个run方法的调用,并且if (require.main === module) {}会判断当前的模块是否是通过node调用,如果是的话,那么它自己就还去调用main方法。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值