2014-06-22 49 views
2

我很好奇ENV [SOME_VARIABLE]試圖如何在Mac環境中使用標準導軌安裝來查找數據。軌道應用程序如何知道在哪裏拉ENV變量?

我遇到了一個問題,我使用figaro寶石,但它沒有回答我的問題,爲什麼它不起作用。我對解決問題不再感興趣,但有興趣瞭解ENV [SOME_VARIABLE]如何發現該信息的具體內容。

回答

3

每當您在計算機上運行命令時,其他一些程序正在運行該命令。該父母程序可以爲該孩子提供設置;這些通常被稱爲環境變量

如果您在Mac上打開終端窗口,您正在查看shell。這是您計算機的命令行界面。它運行在終端程序內部,終端程序本身運行在其他內容中 - 無論是碼頭,Spotlight還是Finder(取決於您如何運行它)。通過擴展,如果您通過運行rails server來運行Rails程序,那麼rails命令將由您的shell運行。

有許多方法可以在shell中設置環境變量。如果你在終端運行export,你應該看到一大堆。你的shell會自動爲你設置一些;常見的包括用於主目錄的HOME,用於查找可執行文件的位置的PATH以及用於用戶名的USER。您可以通過預先輸入$符號來打印出這些值。您也可以使用export命令來設置您自己的設置。

[email protected] ~$ echo $USER 
bob 
[email protected] ~$ echo $HOME 
/Users/bob 
[email protected] ~$ export MYVAR="whatever" 
[email protected] ~$ echo $MYVAR 
whatever 

您的設置使用export將只存在,直到您關閉終端,並不會延續到新的終端。您可以將您的export命令放入打開終端時運行的文件中; Bash是Mac上的默認外殼,因此您可以編輯您的~/.bashrc文件以使其在所有終端中均可用。


那麼讓我們回到您的rails server命令。假設您想提供一個SECRET_KEY環境變量,所以您不必將該祕密委託給您的源代碼管理。如上所示,你可以把它放在你的.bashrc。你也可以提供它,當你運行你的服務器,通過在命令前設置它:

[email protected] rails_app$ SECRET_KEY=abc1234 rails server 

您還可以使用插件像Figarodotenv文件來管理您的設置。在Ruby中,ENV只是一個散列 - 由Ruby本身提供給您的特殊散列,但僅僅是一個散列。任何代碼都可以添加鍵,刪除鍵或更改其中的值。我沒有看過dotenv或Figaro的代碼,但我敢打賭,他們正在通過initializer加載自己,讀取配置了環境變量的文件,並將這些環境變量添加到ENV

0

環境變量

爲了簡化Alex P的回答,environment variables在操作系統定義的 - 這意味着它們可用於哪些希望使用他們的任何應用程序:

環境變量是一個一組動態命名值可以影響運行進程在計算機上的行爲方式 。

由於多種原因,Rails使用environment variables,但主要是爲了安全。如果應用程序使用API鑰匙等的喜歡,在environment variables讓你的方式是在操作系統級別的訪問定義敏感信息

這意味着,如果你運行一個主機這是對你的Rails應用程序被黑客入侵,而且你的代碼被破解,黑客將無法完全訪問你的數據,因爲ENV變量存儲在操作系統中。

如何這個作品在Alex的回答

描述 -

Rails "Secrets" YML

一個使用Rails的進步4.1+是引進secrets寶石。這是爲了給你相同的功能ENV瓦爾,除非你就可以讓所有的值的局部到您的Rails應用程序:

的Rails 4.1生成的config文件夾一個新的secrets.yml文件。默認情況下,該文件包含應用程序的secret_key_base,但它也可用於存儲其他機密,例如外部API的訪問鍵。

添加到此文件的祕密可通過 Rails.application.secrets訪問。例如,使用以下 config/secrets.yml

development: 
    secret_key_base: 3b7cd727ee24e8444053437c36cc66c3 
    some_api_key: SOMEKEY