首頁 > 軟體

buildcheck包報錯問題排查解決

2023-02-10 06:01:48

問題

最近專案開發中遇到 buildcheck 包拋錯,因修復該報錯佔用了一點時間,特此這裡記錄下。

因專案本地部署需要上傳打包檔案,使用到了 ssh2-sftp-client 包,在拉取包的時候控制檯拋如下錯誤:

warning Error running install script for optional dependency: "D:\Projects\xxx\node_modules\cpu-features: Command failed.
Exit code: 1
Command: node buildcheck.js > buildcheck.gypi && node-gyp rebuild
Arguments:
Directory: D:\Projects\xxx\node_modules\cpu-features
Output:
D:\Projects\xxx\node_modules\buildcheck\lib\index.js:133
        throw new Error('Unable to detect compiler type');
        ^
Error: Unable to detect compiler type
    at new BuildEnvironment (D:\Projects\vite-ui\packages\HtUpssh\node_modules\buildcheck\lib\index.js:133:15)
    at Object.<anonymous> (D:\Projects\vite-ui\packages\HtUpssh\node_modules\cpu-features\buildcheck.js:5:12)
    at Module._compile (internal/modules/cjs/loader.js:1085:14)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1114:10)
    at Module.load (internal/modules/cjs/loader.js:950:32)
    at Function.Module._load (internal/modules/cjs/loader.js:790:12)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:76:12)
    at internal/main/run_main_module.js:17:47"

該錯誤不會影響檔案上傳功能,但是有問題還是要想辦法解決掉。

原因

經過排查發現,該報錯是因為:

  • ssh2-sftp-client 包依賴了 ssh2 包。
  • ssh2 包依賴了可選包 cpu-features 包。

  • cpu-features 包依賴了 buildcheck 包;並且在包安裝的時候執行了 install 命令,執行了 buildcheck.js 指令碼來檢查node的構建環境;而 buildcheck.js 裡參照了 buildcheck 包,執行其原始碼。

buildcheck.js 程式碼:

  • buildcheck 包里程式碼在執行時,匹配不到系統可支援的工具型別,就拋錯了。

通過 buildcheck 原始碼的排查,當是 windows 系統時,會去查詢系統安裝的工具包,匹配其版本號,獲取其型別,根據不同的型別走不同的編譯邏輯。(buildcheck原始碼沒有細看,粗略看了下,理解錯誤的話麻煩指正)

我電腦上查詢出的 packages 裡 Microsoft.VisualStudio.Component.Windows10SDK 沒有版本號,所以匹配失敗,導致檢測不出編譯型別,從而拋錯。

解決

以上報錯是在 buildcheck 包執行時的報錯。所以解決思路是:

  • Windows10SDK 補充版本號
  • buildcheck 包原始碼僅下載不執行
  • 移除對 cpu-features 包的依賴

因為 buildcheck 的原始碼執行是在 install 的時候,所以通過打修補程式的方法也不能解決,修補程式是在 install 之後。

方法一

Windows10SDK 補充版本號的話需要通過 vs staller 勾選 window10SDK 元件後重灌,重灌成本較高,且安裝檔案較大。該方法被否決。

方法二

buildcheck 包僅下載不執行。可以在 npm 命令列中使用 --ignore-scripts 實現。

yarn add -D buildcheck --ignore-scripts

或者 .yarnrc 檔案中設定:

ignore-scripts 'true'

或者 .npmrc 檔案中設定:

ignore-scripts = true

新增 ignore-scripts 後,npm scripts 命令將不會執行。那 buildcheck 原始碼邏輯也就不會執行了。但是這個命令會導致 npm 其他的命令也不執行,會有一定風險。該方法也不建議。

方法三

移除對 cpu-featurs 包的依賴。因為我的需求場景是僅支援檔案上傳即可。cpu-features 包不是必須包,可以移除。而 cpu-features 包是在 ssh2 包中被引入的。

可以在 packages-lock.json 去掉對 cpu-features 包的依賴。

或者在 yarn.lock 去掉對 cpu-features 包的依賴。

但是鎖包的檔案容易被篡改,而且增加維護成本。該方法也不是特別適合。

方法四

重發 ssh2 包,移除對 cpu-features 包的依賴。因為我們包在私倉維護,所以在私倉裡釋出了同名的 ssh2 包,packages.json 裡移除了對 cpu-features 的依賴。當拉取包檔案的時候,優先從私倉拉取。

專案中也是採用這個方法來解決。如果大家有更好的辦法,歡迎留言。

總結

遇到問題不能逃避,抽絲剝繭,總能解決的,無非是時間問題罷了。

以上就是buildcheck包報錯問題排查解決的詳細內容,更多關於buildcheck包報錯排查的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com