Rubyist的環(huán)境變量指南(譯)

如果你想要在開發(fā)和生產(chǎn)模式下窥浪,高效的管理你的應用,那么你就需要理解什么是環(huán)境變量〉驯現(xiàn)在越來越多的Ruby工程師開始使用環(huán)境變量漾脂,但是可能有些人沒有真正的理解它是怎么工作的。這么文章將會告訴你胚鸯,環(huán)境變量是如何工作的骨稿,在什么情況下不能使用環(huán)境變量,并且還會介紹姜钳,如何在Rails應用中使用幾個最常用的管理環(huán)境變量的方法坦冠。

每個進程都擁有一組自己的環(huán)境變量


運行在服務器上的每一個程序,至少運行于一個進程之上哥桥。并且這些進程持有自己的一組環(huán)境變量蓝牲,其他進程不可以訪問。
可以理解的錯誤泰讽,初學者通常認為環(huán)境變量是服務器范圍內(nèi)使用的例衍。就像系統(tǒng)服務配置文件一樣。

每一個進程都有自己的環(huán)境

進程和它的環(huán)境變量的生命周期是一樣的


環(huán)境變量是生命周期是和它所在的進程是一樣的已卸,也就是說佛玄,當你的應用的進程退出,重啟累澡,那么原先的環(huán)境變量就都會消失梦抢。
你可以通過在IRB 中設置環(huán)境變量來查看這個特性:

當進程退出的時候,環(huán)境變量也隨之消失了愧哟。
這就是為什么你的環(huán)境變量在你重啟服務或者退出shell的時候奥吩,消失的原因哼蛆。如果你想要環(huán)境變量有效的話,你就需要將它們存儲在想.bashrc這樣的配置文件當中霞赫。

子進程可以從父進程中繼承環(huán)境變量


每一個應用進程都會有一個父進程腮介,這是因為每個程序都是在其他程序中觸發(fā)啟動的。
如果你使用bash shell 打開 vim 端衰,那么vim的父進程就是這個shell叠洗。如果你的Rails應用是用了imagemagick去識別圖片,那么識別程序的父進程就是你的Rails應用旅东。

子進程從父進程中繼承環(huán)境變量灭抑。

在下面的例子中,我在IRB中設置了 環(huán)境變量$MARCO的值抵代,然后執(zhí)行輸出shell中環(huán)境變量的值腾节。

那么IRB就是我們創(chuàng)建的shell的父進程,然后它獲得了$MARCO環(huán)境變量的拷貝荤牍。

父進程可以定制環(huán)境變量給子進程


默認情況下禀倔,父進程會拷貝一份環(huán)境變量到子進程中,不過它還可以参淫,從命令行你可以使用env命令救湖,或者設置環(huán)境變量的特殊語法去設置傳遞給子進程的環(huán)境變量。

子進程不可以修改它的父進程的環(huán)境變量


上面已經(jīng)提到了涎才,子進程只是獲得了父進程的環(huán)境變量的拷貝而不是引用鞋既,所以通過下面的例子我們可以看到,修改子進程的環(huán)境變量的值耍铜,相應在父進程中沒有變化邑闺。

環(huán)境變量的改變不會同步到其他進程中


環(huán)境變量是存儲在進程空間的,也就是表明棕兼,運行相同程序的兩個進程的環(huán)境變量的變化不會相互影響陡舅。

環(huán)境變量與shell變量是不同的


環(huán)境變量和本地變量經(jīng)常被搞混,shell為自己提供了一個 本地的變量系統(tǒng)伴挚,在語法上shell變量和環(huán)境變量的用法是一樣的靶衍,但是shell變量不會被拷貝到子進程中去。

下面是一個例子茎芋,首頁使用在命令行中設置了一個本地變量(shell變量)的值颅眶,然后通過Ruby命令訪問環(huán)境變量哈希中與之同名的變量,結(jié)果返回是找不到的田弥,然后再使用export 對本地變量進行轉(zhuǎn)換后它就可以在環(huán)境變量中被訪問了涛酗。


管理環(huán)境變量實踐


假設我們有兩個Rails 應用同時運行在同一個服務器上,然后這兩個應用又同樣需要訪問第三方的API_KEY ,我們可以將這個第三方API_KEY存放在環(huán)境變量中商叹。但是如何為他們設置不同的值呢燕刻。
看完上面的介紹,想必你也知道了剖笙,環(huán)境變量與服務器上的兩個Rails應用一樣是運行在不同的進程當中的卵洗,所以它們是獨立的,可以被分別設置枯途,那現(xiàn)在剩下的問題就是如何設置這個環(huán)境變量的值了忌怎。

Figaro


當你安裝完Figaro到Rails應用之后籍滴,在config/application.yml中的鍵值對酪夷,都將會在應用啟動的時候被加載進ruby的ENV中。
安裝gem:

# Gemfile
gem "figaro"

然后添加鍵值對到 application.yml孽惰。注意一定要將這個文件添加到.gitignore中以防止重要的信息被提交到代碼倉庫中晚岭。

# config/application.yml
API_KEY: 12345

Dotenv


dotenv 與Figaro非常的相似,除了它是從.env文件中加載的環(huán)境變量勋功,而不是YAML中坦报。
安裝:

# Gemfile
gem "dotenv"

然后添加配置信息到.env文件中,與上面一樣狂鞋,.env文件也要加到到.gitignore中片择。

# .env
API_KEY=12345

在Rails中就可以使用ENV哈希訪問它了。

ENV['API_KEY']

你還可以像下面這樣骚揍,在shell中運行命令加載預定于的環(huán)境變量:

dotenv ./my_script.sh

Secrets.yml?


抱歉雖然Secrets.yml很酷字管,但他并不會設置環(huán)境變量,所以它其實不是Figoaro和dotev這樣的Gem的替代方案信不。

英文原文地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嘲叔,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子抽活,更是在濱河造成了極大的恐慌硫戈,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件下硕,死亡現(xiàn)場離奇詭異丁逝,居然都是意外死亡,警方通過查閱死者的電腦和手機梭姓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門果港,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人糊昙,你說我怎么就攤上這事辛掠。” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵萝衩,是天一觀的道長回挽。 經(jīng)常有香客問我,道長猩谊,這世上最難降的妖魔是什么千劈? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮牌捷,結(jié)果婚禮上墙牌,老公的妹妹穿的比我還像新娘。我一直安慰自己暗甥,他們只是感情好喜滨,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著撤防,像睡著了一般虽风。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上寄月,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天辜膝,我揣著相機與錄音,去河邊找鬼漾肮。 笑死厂抖,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的克懊。 我是一名探鬼主播忱辅,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼保檐!你這毒婦竟也來了耕蝉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤夜只,失蹤者是張志新(化名)和其女友劉穎垒在,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扔亥,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡场躯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了旅挤。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片踢关。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖粘茄,靈堂內(nèi)的尸體忽然破棺而出签舞,到底是詐尸還是另有隱情秕脓,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布儒搭,位于F島的核電站吠架,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏搂鲫。R本人自食惡果不足惜傍药,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望魂仍。 院中可真熱鬧拐辽,春花似錦、人聲如沸擦酌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽仑氛。三九已至乙埃,卻和暖如春闸英,著一層夾襖步出監(jiān)牢的瞬間锯岖,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工甫何, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留出吹,地道東北人。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓辙喂,卻偏偏與公主長得像捶牢,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子巍耗,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理秋麸,服務發(fā)現(xiàn),斷路器炬太,智...
    卡卡羅2017閱讀 134,651評論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,804評論 6 342
  • 概述 首先灸蟆,咱們來了解一下,什么是Shell亲族。操作系統(tǒng)內(nèi)核給我們提供了各種接口炒考,同時也提供了各種用戶層的庫,理論上...
    keysaim閱讀 1,370評論 0 0
  • 你需要在口袋里經(jīng)常放兩張紙條霎迫,一張寫的是“我只是一顆塵罢啵”,另一張寫著“世界為我而造”知给。 總有個喜歡迎著烈日瓤帚,大風...
    執(zhí)念馥郁閱讀 158評論 0 0
  • 是媽媽買的上面有老胡同的味道在幽深的巷子里有荒園里的蛇有拐走小孩的壞人 還有 老奶奶藏的銀手鐲和小孩掉的牙齒 新鞋...
    葺寶閱讀 162評論 0 2