利用Node.js編寫跨平台的spawn語句詳解,node.jsspawn

來源:互聯網
上載者:User

利用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 檔案

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的協助,如果有疑問大家可以留言交流。

相關關鍵詞:
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.