運行設置和使用跨平台環境變量的腳本
注意:交叉ENV仍然運行良好,但處於維護模式。不會添加新功能,只能修復嚴重和常見的錯誤,並且隨著時間的推移,它只能使用node.js保持最新狀態。了解更多
當您設置NODE_ENV=production時,大多數Windows命令提示都會扼殺。 (例外是Windows上的Bash,它使用本機bash。)同樣,Windows和Posix命令如何利用環境變量也有所不同。使用POSIX,您使用: $ENV_VAR ,在Windows上您使用%ENV_VAR% 。
cross-env使其成為一個單個命令,而不必擔心設置或適當地使用環境變量為平台。只需像在Posix系統上運行的那樣設置它, cross-env將正確設置它。
cross-env vs cross-env-shell該模塊是通過NPM分發的,該模塊與節點捆綁在一起,應作為您項目的devDependencies之一安裝:
npm install --save-dev cross-env
警告!確保安裝正確拼寫的軟件包時,以避免錯誤安裝惡意軟件
注意:Cross-Env的版本7僅支持Node.js 10及更高版本,在Node.js 8或更低安裝版本上使用它6
npm install --save-dev cross-env@6
我在我的NPM腳本中使用它:
{
"scripts" : {
"build" : " cross-env NODE_ENV=production webpack --config build/webpack.config.js "
}
}最終,執行的命令(使用cross-spawn )為:
webpack --config build/webpack.config.js
NODE_ENV環境變量將通過cross-env設置
您可以一次設置多個環境變量:
{
"scripts" : {
"build" : " cross-env FIRST_ENV=one SECOND_ENV=two node ./my-program "
}
}您還可以將命令分為幾個,或將環境變量聲明與實際命令執行分開。您可以這樣做:
{
"scripts" : {
"parentScript" : " cross-env GREET= " Joe " npm run childScript " ,
"childScript" : " cross-env-shell " echo Hello $GREET " "
}
} childScript保留執行的實際命令,並parentScript了要使用的環境變量。然後,您不必運行父母來運行父母。這對於使用不同的ENV變量啟動同一命令或環境變量太長以至於將所有內容都插入一行時非常有用。這也意味著您即使在窗口上也可以使用$GREET env env var語法,這通常要求它為%GREET% 。
如果您先於一個奇怪的後斜線,則表達式語句將不會被替換。請注意,這意味著在JSON String逃脫後的後斜線。 "FOO=\$BAR"將不會更換。 "FOO=\\$BAR"將被替換。
最後,如果要通過JSON字符串(例如,使用TS-Loader),則可以按以下方式執行以下操作:
{
"scripts" : {
"test" : " cross-env TS_NODE_COMPILER_OPTIONS={ \" module \" : \" commonjs \" } node some_file.test.ts "
}
}在雙引號(")和缺少單個引號(')之前,請特別注意三重後斜線(\) 。必須滿足這兩個條件才能在Windows和Unix上使用。
cross-env vs cross-env-shell cross-env模塊暴露了兩個垃圾箱: cross-env和cross-env-shell 。第一個使用cross-spawn執行命令,而第二個使用Node的spawn中使用shell選項。
cross-env-shell的主要用例是您需要在整個Inline Shell腳本上設置一個環境變量,而不僅僅是一個命令。
例如,如果要使環境變量適用於串聯的多個命令,則需要將這些變量包裹在引號中,並使用cross-env-shell而不是cross-env 。
{
"scripts" : {
"greet" : " cross-env-shell GREETING=Hi NAME=Joe " echo $GREETING && echo $NAME " "
}
}經驗法則是:如果您想cross-env到包含要解釋的特殊外殼字符的命令,請使用cross-env-shell 。否則堅持cross-env 。
如果您想處理程序內部的信號事件,則需要在Windows上使用cross-env-shell 。一個常見的情況是,當您想捕獲通過在命令行接口上按Ctrl + C調用的SIGINT事件時。
請注意, npm默認使用cmd ,並且不支持命令替換,因此,如果您想利用它,則需要更新.npmrc將script-shell設置為PowerShell。在這裡了解更多。
我最初創建了這個問題是為了解決我對NPM腳本的問題的問題。這使Windows用戶更容易為項目做出貢獻。
env-cmd改用文件讀取環境變量@naholyr/cross-env - cross-env支持設置默認值想要貢獻?尋找良好的第一期標籤。
請提交錯誤,缺少文檔或意外行為的問題。
請參閱錯誤
該項目處於維護模式,不會考慮新的功能請求。
了解更多
謝謝這些人(表情符號密鑰):
肯特·多德斯(Kent C. Dodds) ? | Zhuang ? | 詹姆斯·哈里斯(James Harris) | Compumike08 ? | 丹尼爾·羅德里格斯·里維羅(DanielRodríguezRivero) ? | 喬納斯·基因霍爾茲(Jonas Keinholz) ? | 雨果·伍德 ? |
Thiebaud Thomas ? | 丹尼爾·雷伊普斯(DanielReyLópez) | Amila Welihinda ? | 保羅·貝茨(Paul Betts) ? | 特納·海斯(Turner Hayes) ? | Suhas Karanth | 斯文 |
D.NicolásLopezZelaya | 約翰·埃爾南德斯(Johan Hernandez) | 喬丹·尼爾森(Jordan Nielson) ? | 傑森·庫克(Jason Cooke) | BIBO5088 | 埃里克·貝里(Eric Berry) ? | Michaëlde Boey |
勞裡·埃斯科拉(Lauri Eskola) | Devuxer | 丹尼爾 |
該項目遵循全企業規範。歡迎任何形式的貢獻!
注意:該項目較晚。如果您以任何方式為該項目做出了貢獻,請通過按照
CONTRIBUTING.md中的說明來提出拉的請求,以將自己添加到列表中。 md
麻省理工學院