【发布时间】:2014-06-22 18:27:25
【问题描述】:
我很好奇 ENV[SOME_VARIABLE] 如何尝试在 mac 环境中安装标准 rails 来查找数据。
我遇到了一个使用 figaro gem 克服的问题,但它没有回答我关于为什么它不起作用的问题。我不再对解决问题感兴趣,但有兴趣了解 ENV[SOME_VARIABLE] 如何找到该信息的细节。
【问题讨论】:
标签: ruby-on-rails macos environment-variables
我很好奇 ENV[SOME_VARIABLE] 如何尝试在 mac 环境中安装标准 rails 来查找数据。
我遇到了一个使用 figaro gem 克服的问题,但它没有回答我关于为什么它不起作用的问题。我不再对解决问题感兴趣,但有兴趣了解 ENV[SOME_VARIABLE] 如何找到该信息的细节。
【问题讨论】:
标签: ruby-on-rails macos environment-variables
每当您在计算机上运行命令时,其他程序都会运行该命令。该父程序可以为该子程序提供设置;这些通常称为环境变量。
如果您在 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
您还可以使用 Figaro 和 dotenv 等插件来管理文件中的设置。在 Ruby 内部,ENV 只是一个散列 - Ruby 本身提供给您的特殊散列,但只是一个散列。任何代码都可以在其中添加键、删除键或更改值。我没有查看 dotenv 或 Figaro 的代码,但我敢打赌,这就是他们正在做的事情 - 他们通过 initializer 加载自己,读取配置环境变量的文件,并将这些环境变量添加到ENV。
【讨论】:
环境变量
为了简化Alex P 的回答,environment variables 是在操作系统中定义的——这意味着它们可供任何希望使用它们的应用程序使用:
环境变量是一组动态命名值,可以 影响正在运行的进程在计算机上的行为方式。
Rails 出于多种原因使用environment variables,但主要是出于安全考虑。如果您的应用程序使用 API 之类的键等,environment variables 允许您以仅在操作系统级别访问的方式定义敏感信息
这意味着,如果您在被黑客入侵的主机上运行 Rails 应用程序,并且您的代码遭到入侵,黑客将无法完全访问您的数据,因为 ENV 变量存储在操作系统中。
如何在Alex的回答中描述了这个工作原理
--
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
【讨论】: