我是一名 React 開發人員,習慣于在 Linux 中從 Bash 運行如下示例的命令,但現在我必須通過 Powershell 使其在 Windows 環境中運行:
npm test ExampleComponent --collectCoverageFrom='["**/ExampleComponent.tsx"]' --watch
npm 測驗腳本中只有“jest”,但我需要通過腳本使用它,以便我在專案中使用 jest 版本,而不是全域版本。
我在嘗試填補特定檔案 ( ExampleComponent.tsx)中代碼覆寫率的空白時使用它,因此我希望 Jest 在我保存對測驗檔案的更改時重新評估該檔案的覆寫率(ExampleComponent.test.tsx在本例中)。
這就是我在 Powershell 中運行的內容(添加引號是"--"因為 Powershell 不像--bash 那樣對待,并從 Windows 的正斜杠切換到反斜杠):
npm test "--" ExampleComponent --collectCoverageFrom='["**\ExampleComponent.tsx"]' --watch
這是根據 npm 的輸出呼叫 jest 的方式:
jest "ExampleComponent" "--collectCoverageFrom=[**\ExampleComponent.tsx]" "--watch"
在 Powershell(7.2 版,如果重要的話)中,上面的命令不限制對指定檔案的覆寫率檢查。它只測驗指定的檔案,但該collectCoverageFrom選項可能被忽略,因為 jest 接收的模式被 Powershell 破壞。
如何從 Powershell 命令列中轉義引號和斜杠以復制頂部的 bash 呼叫?根據有關在 Powershell 中轉義的答案,我嘗試過在無數排列中組合多個反斜杠和多個引號,但到目前為止它們都沒有作業。
uj5u.com熱心網友回復:
我找到了一個有效的版本:
npm t "--" ExampleComponent --collectCoverageFrom="'[\\\""**/ExampleComponent.tsx\\\""]'"
該命令似乎按預期運行,僅計算指定檔案的覆寫率。
Jest 將命令回顯為:
jest "ExampleComponent" "--collectCoverageFrom='[\"**/ExampleComponent.tsx\"]'"
處理后的版本在雙引號前有反斜杠,因為整個引數已經用雙引號括起來了。我還必須將反斜杠改回正斜杠。
感謝@mklement0 在問題評論中的投入。
uj5u.com熱心網友回復:
您的解決方案是有效的,但讓我添加重要的背景資訊:
的核心問題是悲傷的現實,即直到至少7.2的PowerShell一個額外的手動的層\ 的嵌入-escaping"字符傳遞給引數是必需的外部程式。這可能會在未來版本中得到修復,這可能需要選擇加入。有關詳細資訊,請參閱此答案。
在您的特定情況下,問題顯然因必須執行此轉義兩次而變得更加復雜,因為涉及兩個呼叫:首先, to npm,然后將它收到的一些引數中繼到jest。
最終,在決議自己的命令列(在 Windows 上)之后,您希望jest看到的逐字顯示是以下字串:
--collectCoverageFrom='["**/ExampleComponent.tsx"]'
順便說一句:您的bash命令并沒有做到這一點,因為'有句法功能(因為他們在PowerShell中這樣做),并洗掉由bash生成的字串傳遞之前。
如果 PowerShell 錯誤不在圖片中,您將使用以下內容:
npm t '--' ExampleComponent --collectCoverageFrom='''["**/ExampleComponent.tsx"]'''
注意''嵌入在整個'...' 逐字字串中,它們是轉義 '字符。逐字包含在字串中。
或者,您可以使用"..."外部參考,然后要求您轉義嵌入的"字符。作為`"(或""[1]):
npm t '--' ExampleComponent --collectCoverageFrom="'[`"**/ExampleComponent.tsx`"]'"
但是請注意,這種雙引號字串是可擴展的字串,即受字串插值的影響。一般來說,最好使用逐字字串('...')為那些字串不要求插值,澄清概念,并防止潛在有害插值(這里不是一個問題,因為該字串包含不意味著要被逐字$或`字符)。
由于不存在有關嵌入"字符的錯誤,因此中繼引數也沒有問題- 無論執行此操作的次數如何。
事實上,如果您使用的是PowerShell 7.2,則可以使這項作業正常運行,但前提是您明確啟用了PSNativeCommandArgumentPassing 實驗性功能:
Enable-ExperimentalFeature PSNativeCommandArgumentPassing- 然后啟動一個新會話以使更改生效。
- 在新會話中,運行
$PSNativeCommandArgumentPassing = 'Standard'以將修復也應用到批處理檔案(*.cmd,*.bat),這是必要的,因為npmCLI 是作為一個實作的。- 這不幸需要一個額外的,每個會話的步驟是一個非常不幸的設計決定,默認(值的結果
'Windows')免除批處理檔案和WSH腳本檔案(JScript中,VBScript)的自修復,而不是應用目標腳本引擎,適當自動修復- 請參閱GitHub 問題 #15143 中的對話
- 這不幸需要一個額外的,每個會話的步驟是一個非常不幸的設計決定,默認(值的結果
Disable-ExperimentalFeature PSNativeCommandArgumentPassing稍后運行以再次禁用它。
隨著本錯誤:
該嵌入式
"字符在字串中需要手動\-逃逸,由于錯誤-無論你是否使用'...'或"..."字串:如果只涉及一個呼叫,這意味著:
# Note the \-escaped "
npm t '--' ExampleComponent --collectCoverageFrom='''[\"**/ExampleComponent.tsx\"]'''
這將使npm看到所需的逐字字串。
- 因為
npmthen將有問題的論點中繼到jest,所以必須應用額外的轉義輪:
# Note the \-escaped ", preceded by an \-escaped \
npm t '--' ExampleComponent --collectCoverageFrom='''[\\\"**/ExampleComponent.tsx\\\"]'''
那是:
- 要將呼叫
npm有效地把\"以" - 因為引數隨后被轉發,所以它必須再次手動
\轉義,以便"chars. 也保留在對 的呼叫中jest。 - 通過預先添加
\\- 即轉義\到 -\"(\\\"),npm最終會看到逐字逐字\",當通過 PowerShell中繼時,可以根據需要使jestsee just"。
[1] 雖然""在里面作業正常"...",但它只在那里作業。相比之下,`"使用 PowerShell 的通用轉義字符,反引號 ( `) - 并且只需要記住一個字符,而不管背景關系,減少了用戶的記憶體負擔。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/368431.html
