標籤:含義 開始 完全 not test targe 意思 parent rom
文章來源:http://www.51testing.com/html/30/n-3724330.html?
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軟體測試網(http://www.51testing.com)哈~
記一個WINDOWS命令列引發的BUG