2014-06-22 44 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