簡體   English   中英

使用 Powershell 通過 npm 腳本運行 Jest 測試時,轉義引號和斜杠的正確方法是什么?

[英]What is the proper way to escape quotes and slashes when running a Jest test with --collectCoverageFrom from Powershell via npm scripts?

I am a React developer, and am used to running commands like the example below from Bash in Linux, but now I have to make it work in a Windows environment from Powershell:

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 的 output 調用 jest 的方式:

jest "ExampleComponent" "--collectCoverageFrom=[**\ExampleComponent.tsx]" "--watch"

在 Powershell(版本 7.2,如果這很重要)中,上面的命令不會將覆蓋檢查限制到指定的文件。 它只測試指定的文件,但可能會忽略collectCoverageFrom選項,因為 jest 接收到的模式被 Powershell 破壞了。

如何從 Powershell 命令行中轉義引號和斜杠以復制頂部的 bash 調用? 根據 Powershell 中有關 escaping 的答案,我嘗試了多種反斜杠和多個引號的組合,但到目前為止它們都沒有奏效。

我找到了一個有效的版本:

npm t "--" ExampleComponent --collectCoverageFrom="'[\\\""**/ExampleComponent.tsx\\\""]'"

該命令似乎按預期運行,僅計算指定文件的覆蓋率。

Jest 將命令回顯為:

jest "ExampleComponent" "--collectCoverageFrom='[\"**/ExampleComponent.tsx\"]'"

處理后的版本在雙引號之前有反斜杠,因為整個參數已經包含在雙引號中。 我還必須將反斜杠改回正斜杠。

感謝@mklement0 在問題評論中的投入。

您的解決方案是有效的,但讓我添加重要的背景信息:

核心問題是悲慘的現實,至少在 PowerShell 7.2 之前,在 arguments 中需要額外的手動\ -轉義嵌入的"字符”傳遞給外部程序。這可能會在未來的版本中得到修復,這可能需要選擇 -中。有關詳細信息,請參閱此答案

在您的特定情況下,由於必須執行此 escaping兩次,問題顯然更加復雜,因為涉及兩個調用:首先,到npm ,然后將一些 arguments中繼jest

最終,在它解析了自己的命令行(在 Windows 上)之后,您希望逐字逐句jest看到以下字符串:

--collectCoverageFrom='["**/ExampleComponent.tsx"]'

順便說一句:您的bash命令沒有實現這一點,因為'具有語法function (就像它們在 PowerShell 中所做的那樣)並且在傳遞結果字符串之前被bash刪除

如果 PowerShell 錯誤不在圖片中,您將使用以下內容:

npm t '--' ExampleComponent --collectCoverageFrom='''["**/ExampleComponent.tsx"]'''

請注意嵌入在整個'' '...' 逐字字符串中的 '' ,它們是轉義'字符。 逐字包含在字符串中。

或者,您可以使用"..."進行外部引用,然后要求您將嵌入的" chars. as `" (或"" [1] )轉義:

npm t '--' ExampleComponent --collectCoverageFrom="'[`"**/ExampleComponent.tsx`"]'"

但是請注意,這種雙引號字符串是可擴展的字符串,即受到字符串插值的影響。 通常最好對不需要插值的字符串使用逐字字符串 ( '...' ),以便概念清晰並防止可能不需要的插值(這里不是問題,因為該字符串不包含應逐字的$`字符)。

由於沒有關於嵌入"字符的錯誤,因此中繼arguments 也沒有問題 - 無論執行多少次。


實際上,如果您使用的是 PowerShell 7.2,則可以進行此操作,但前提是您明確啟用了PSNativeCommandArgumentPassing 實驗功能

  • Enable-ExperimentalFeature PSNativeCommandArgumentPassing
  • 然后啟動一個新的 session 以使更改生效。
  • 在新的 session 中,運行$PSNativeCommandArgumentPassing = 'Standard'以便將修復程序也應用於批處理文件*.cmd*.bat ),這是必要的,因為npm已實現
    • 不幸的是,需要額外的每個會話步驟是一個非常不幸的設計決定的結果,默認情況下(值'Windows' )將批處理文件和 WSH 腳本文件(JScript、VBScript)從修復中排除,而不是應用目標腳本引擎相應的自動修復 - 請參閱GitHub 問題 #15143中的對話

稍后運行Disable-ExperimentalFeature PSNativeCommandArgumentPassing以再次禁用它。


存在錯誤:

  • 由於該錯誤,字符串中嵌入"字符需要手動\ - escaping - 無論您使用的是'...'還是"..."字符串:

  • 如果只涉及一個電話,這意味着:

# Note the \-escaped "
npm t '--' ExampleComponent --collectCoverageFrom='''[\"**/ExampleComponent.tsx\"]'''

這將使npm看到所需的逐字字符串。

  • 因為npm然后有問題的論點傳遞給jest所以必須應用額外的一輪 escaping
# Note the \-escaped ", preceded by an \-escaped \
npm t '--' ExampleComponent --collectCoverageFrom='''[\\\"**/ExampleComponent.tsx\\\"]'''

那是:

  • npm的調用有效地將\"變為"
  • 因為參數隨后被轉發,所以必須再次手動\ -轉義,以便" chars." 也保留在對jest的調用中。
  • 通過將\\ - 即轉義\添加到 - \"\\\" ), npm最終會看到逐字\" ,當通過 PowerShell中繼時,可以根據需要讓jest只看到"

[1] 雖然"""..."內工作正常,但它只在那里工作。 相比之下, `"使用 PowerShell 的通用轉義字符,即反引號 ( ` ) - 並且無論上下文如何,都必須只記住一個字符,從而減少了用戶的 memory 負擔。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM