【问题标题】:How does a rails app know where to pull an ENV variable?Rails 应用程序如何知道在哪里提取 ENV 变量?
【发布时间】:2014-06-22 18:27:25
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

    如果您在 Mac 上打开终端窗口,您看到的是一个 shell。这是您计算机的命令行界面。它在终端程序中运行,而终端程序本身也在其他东西中运行——无论是您的扩展坞、来自 Spotlight 还是来自 Finder(取决于您如何运行它)。通过扩展,如果您通过运行 rails server 来运行 Rails 程序,则您的 shell 正在运行 rails 命令。

    有多种方法可以在 shell 中设置环境变量。如果您在终端中运行export,您应该会看到一大堆。你的 shell 会自动为你设置一些;常见的包括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 设置的任何内容都只会在您关闭该终端之前存在,并且不会延续到新终端中。您可以将export 命令放在一个文件中,当您打开终端时该文件就会运行; Bash 是 Mac 上的默认 shell,因此您可以编辑 ~/.bashrc 文件以使其在所有终端中可用。


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

    bob@host rails_app$ SECRET_KEY=abc1234 rails server
    

    您还可以使用 Figarodotenv 等插件来管理文件中的设置。在 Ruby 内部,ENV 只是一个散列 - Ruby 本身提供给您的特殊散列,但只是一个散列。任何代码都可以在其中添加键、删除键或更改值。我没有查看 dotenv 或 Figaro 的代码,但我敢打赌,这就是他们正在做的事情 - 他们通过 initializer 加载自己,读取配置环境变量的文件,并将这些环境变量添加到ENV

    【讨论】:

      【解决方案2】:

      环境变量

      为了简化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
      

      【讨论】:

        猜你喜欢
        • 2016-06-12
        • 1970-01-01
        • 2017-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-21
        • 1970-01-01
        相关资源
        最近更新 更多