姗姗来迟的 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 directoryappiumPermStat.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 directoryappiumPermStat.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方法。