利用Node.js編寫跨平台的spawn語句詳解,node.jsspawn
前言
Node.js 是跨平台的,也就是說它能運行在 Windows、OSX 和 Linux 平台上。很多 Node.js 開發人員都是在 OSX 上做開發的,然後再將代碼部署到 Linux 伺服器上。由於 OSX 和 Linux 都是基於 Unix 的,因此兩者共性很多。Windows 也是 Node.js 官方支援的平台,只要你通過正確的方式寫代碼,就能在各個平台上毫無壓力的跑起來。
Node.js 的子進程 (child_process
) 模組下有一 spawn
函數,可以用於調用系統上的命令,如在 Linux, macOS 等系統上,我們可以執行
const spawn = require('child_process').spawn;spawn('npm', { stdio: 'inherit'});
來調用 npm
命令。
然而,同樣的語句在 Windows 上執行則會報錯。
Error: spawn npm ENOENT at exports._errnoException (util.js:855:11) at Process.ChildProcess._handle.onexit (internal/child_process.js:178:32) at onErrorNT (internal/child_process.js:344:16) at nextTickCallbackWith2Args (node.js:455:9) at process._tickCallback (node.js:369:17) at Function.Module.runMain (module.js:432:11) at startup (node.js:141:18) at node.js:980:3
因為在 Windows 上,當我們執行 npm 時,我們實際執行的是 npm.cmd
批處理,而在 Windows 上, .cmd
, .bat
批處理是無法脫離 cmd.exe
這一解譯器而單獨啟動並執行。
因此,我們需要顯式地調用 cmd
spawn('cmd', ['/c', 'npm'], { stdio: 'inherit'});
或者使用在調用 spawn
函數時,設定 shell
選項為 true
以隱式地調用 cmd
(該選項添加自 Node.js v6 版本)
spawn('npm', { stdio: 'inherit', shell: true});
另外,雖然在 Linux, macOS 等系統上不需要設定 shell
選項,命令也能夠正常執行;設定 shell
為 true
也不會妨礙命令的執行,只是會額外的產生一個本不必要的 shell 進程,影響效能。
因此,如果想要編寫跨平台的 spawn
命令,而又不想增加額外的開銷的話,可以這樣寫
const process = require('process');const { spawn } = require('child_process');spawn('npm', { stdio: 'inherit', // 僅在當前運行環境為 Windows 時,才使用 shell shell: process.platform === 'win32'});
第三方模組 cross-spawn
關於 spawn
函數的跨平台寫法,除了自己編寫代碼的時候做處理,也有第三方模組封裝好了相關細節,如 cross-spawn。
使用該模組,可以在調用 spawn
函數時,自動根據當前的運行平台,來決定是否產生一個 shell
來執行所給的命令。
而且,還能夠
- 支援低於 v6 的 Node.js 版本 (使用
shell
選項需要至少 Node.js v6);
- 跨平台地支援 shebang;
- 對命令和參數中的字元進行轉義更為方便。
安裝
npm install cross-spawn
用法
const spawn = require('cross-spawn');spawn('npm', { stdio: 'inherit'});
參考文檔
在 Windows 上衍生 .bat 和 .cmd 檔案
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的協助,如果有疑問大家可以留言交流。