記一個WINDOWS命令列引發的BUG

來源:互聯網
上載者:User

標籤:含義   開始   完全   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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.