文章来源:?
2018 年刚开始就踩了一个很懵逼的雷,居然还是关于 Windows 的命令行的。
配景
配景是这样的,在开发 Lavas cli 的过程中,需要通过开发者选定的模版类型拼接出对应的 repo 地点和分支名,然后通过 Node.js 从 github 上拉取合适的模版到本地给开发者使用。这个需求很明确,就是涉及到需要使用 Node.js 操纵 git 命令行,然后就很自然的就使用 child_process.exec 搞起来了。
想要实现这个需求,概略先组织一下命令行,概略需要干下面几件工作:
然后问题就来了,child_process.exec 如何执行多个命令行呢?child_precess.exec 命令只能撑持传入一条命令。所以需要将多条命令合成一条命令才行。
同时执行多行命令
无论是 Linux/Mac 还是 Windows 的 shell 命令都撑持一条命令来执行多条命令的。一共有 &&,&,||,| 这么几种方法,这几种方法分袂代表着差此外含义:
&&:command1 && command2,如果 command1 执行告成了,就执行命令 command2,如果 command1 掉败了,就不会执行 command2 了。
&:command1 & command2,无论 command1 执行告成与否城市执行 command2。
||:command1 || command2,如果 command1 执行告成了,就不会执行 command2 了,如果 command1 掉败了,就会继续执行 command2。
|:command1 | command2,command1 的功效做为 command2 的参数,如果 command1 掉败了,整个命令也就都掉败了。
Linux/Mac 下还可以使用 ; 来链接两条命令,挨次执行命令,不管告成与否都往后执行,和 & 含义一样。
了解了这些逻辑之后,我们的需求必定就是选择 && 来实现我们前面所说的需求:
# 假如已经 clone 了模版到 /some/target/path 目录的话
cd /some/target/path && git pull && git checkout some_branch_name
基于我们上面的各种分析,我们的代码根基上就是以下这个样子了:
然后在 Linux/Mac 和 windows 上测试了一遍,发明没什么问题,就感受 OK 了,但是直到今天被 Windows 用户曝出从 github 上拉代替码一直报 fatal: Not a git repository (or any of the parent directories): .git 的错误。
排查错误
看这个报错,应该就是执行 git 命令的时候,没有找对相应的目录,所以排查的重点就是这几条命令了,如果是没有找到相应的 git 目录的话,这个 cd 命令就很容易被怀疑了。
这里需要交代个配景,我们的 targetPath 是通过 process.env[‘APPDATA‘] 和 process.env[‘HOME‘] 的方法取得的:
也就是说,对付 targetPath 有两件事我们是能够明确的:
· 在 Linux/Mac 下,targetPath 的路径为 /User/zoumiaojiang/.lavas-project
· Windows 下就是 c:\\Users\\Administrator\\AppData\\Roaming\\.lavas-project
只有在 Windows 下才会报错,那么执行命令 cd c:\\Users\\Administrator\\AppData\\Roaming\\.lavas-project 到底能有什么问题呢?为什么我本身在 Windows 上测试就没有问题呢?然后我在本身电脑上也敲了如下图的命令,完全没问题啊:
瞬间陷入懵逼状态中,觉得陷入僵局。。
windows cd 命令
就在懵逼的过程中,瞎敲命令行,居然发明了这种情况:
而这种情况是掉败的,居然没有 cd 告成,然而这个和告成的 case 的分歧,仅仅只是因为此次我是在 d:\ 盘执行的。回想起 Lavas cli 的报错,公然不是在 c:\ 盘执行的命令行,而我之前一直测试告成,因为我每次都是在 c:\ 盘执行命令。这下彻底懂了:
· Windows 不撑持直接跨盘执行 cd 命令
· 在执行 cd 命令之前,必需先指定盘
这下公然告成了。问题终于找到了,俄然回想,,这个错误犯的也太初级了,之前操纵 Windows 命令行的时候,这个操纵的确是潜意识的,久疏 Windows 之后,居然把这么个事给忘记了。既然找到了病因,就好解决了,我们改一下 downloadFromGit 的代码就可以了:
之前的 Bug 是因为 Windows 下不能跨盘直接 cd,导致没有直接 cd 到 targetPath,所以不能正确的进入 git 目录,导致会报 fatal: Not a git repository (or any of the parent directories): .git 错误。
PS: 往往解决 Bug 都是容易解决的,定位 Bug 却很难,记下这个有意思的 Bug,提醒下本身以后必然要仔细,测试必然要丰裕。
如想了解更多关于Windows命令行引发的Bug ,请前往51Testing软件测试网()哈~