rails应用程序如何知道在哪里提取ENV变量?

时间:2014-06-22 18:27:26

标签: ruby-on-rails macos environment-variables

我很好奇ENV [SOME_VARIABLE]如何在mac环境中尝试使用标准rails安装来查找数据。

我遇到了一个问题,我使用figaro宝石克服了它,但它没有回答我的问题,为什么它没有工作。我不再对解决问题感兴趣,但我有兴趣了解ENV [SOME_VARIABLE]如何找到该信息的具体细节。

2 个答案:

答案 0 :(得分:3)

每当您在计算机上运行命令时,某些其他程序正在运行该命令。该父程序可以为该孩子提供设置;这些通常称为环境变量

如果您在Mac上打开终端窗口,则需要查看 shell 。这是计算机的命令行界面。它在终端程序中运行,终端程序本身在其他内容中运行 - 您的Dock,或者来自Spotlight,或来自Finder(取决于您如何运行它)。通过扩展,如果您通过运行rails server来运行Rails程序,那么您的shell将运行rails命令。

有许多方法可以在shell中设置环境变量。如果您在终端中运行export,您应该看到一大堆。你的shell会自动为你设置一些;常见的包括{1}用于您的主目录,HOME用于查找可执行文件的位置,PATH用于您的用户名。您可以通过添加USER符号来打印这些值。您也可以使用$命令设置自己的名称。

export

您使用bob@host ~$ echo $USER bob bob@host ~$ echo $HOME /Users/bob bob@host ~$ export MYVAR="whatever" bob@host ~$ echo $MYVAR whatever 设置的任何内容只有在您关闭该终端后才会存在,并且不会延续到新的终端。您可以将export命令放在打开终端时运行的文件中; Bash是Mac上的默认shell,因此您可以编辑export文件,使其在所有终端中都可用。


让我们回到你的~/.bashrc命令。我们假设你想提供一个rails server环境变量,这样你就不必将这个秘密委托给你的源代码控制了。您可以将它放在SECRET_KEY中,如上所示。您也可以在运行服务器时通过在命令之前设置它来提供它:

.bashrc

您还可以使用Figarodotenv等加载项来管理文件中的设置。在Ruby内部,bob@host rails_app$ SECRET_KEY=abc1234 rails server 只是一个哈希 - 一个由Ruby本身提供给你的特殊哈希,但只是一个哈希。任何代码都可以添加键,删除键或更改其中的值。我没有看过dotenv或Figaro的代码,但我打赌他们正在做的事情 - 他们通过initializer加载自己,阅读文件配置环境变量,并将这些环境变量添加到ENV

答案 1 :(得分:0)

环境变量

为了简化Alex P的回答,environment variables在操作系统中定义 - 这意味着任何希望使用它们的应用程序都可以使用它们:

  

环境变量是一组可以的动态命名值   影响运行进程在计算机上的行为方式。

Rails使用environment variables有很多原因,但主要是出于安全考虑。如果您的应用程序使用API密钥等,environment variables允许您以在操作系统级别访问的方式定义敏感信息

这意味着如果您在被黑客攻击的主机上运行Rails应用程序,并且您的代码遭到破坏,黑客将无法完全访问您的数据,因为ENV变量存储在操作系统中。

的工作方式在Alex的答案

中有所描述

-

Rails "Secrets" YML

Rails 4.1+的一个进步是引入了secrets gem。这旨在为您提供与ENV变量相同的功能,除非您能够将所有值保留在Rails应用程序的本地:

  

Rails 4.1在config文件夹中生成一个新的secrets.yml文件。通过   默认情况下,此文件包含应用程序的secret_key_base,但它   也可用于存储其他秘密,如访问密钥   外部API。

     

添加到此文件的秘密可通过以下方式访问:   Rails.application.secrets。例如,具有以下内容   配置/ secrets.yml

development:
  secret_key_base: 3b7cd727ee24e8444053437c36cc66c3
  some_api_key: SOMEKEY