在Rails 4 In Action Book中,它指出在进行其他一些设置后:在生产模式下启动rails应用程序的最终设置(使用web brick)是在终端输入此命令:
SECRET_KEY_BASE='rake secret' rails s -e production
我正在尝试查看SECRET_KEY_BASE
的环境变量的存储位置。
在/app/config/secrets.yml
中,它表示secret_key_base
变量是一个环境变量:
production:
secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
但我在.bashrc
和.bash_profile
内查看,而变量SECRET_KEY_BASE
不在那里。
最终我想知道:环境变量及其价值在哪里?它存储在我的rails应用程序中的某个位置吗?如果我把这个应用程序推送到github,我希望不是出于安全目的。我认为它不是存储在应用程序中,而是存储在我的计算机系统中。在不同的终端窗口中,我echo $SECRET_KEY_BASE
但没有返回任何内容。
提前感谢您帮助我理解丢失的部分。
作为旁注:我知道this question,但问题并不详细,也没有提供答案。
答案 0 :(得分:1)
运行时:
SECRET_KEY_BASE='rake secret' rails s -e production
你实际上并没有“拯救”#39;未来你的秘密钥匙。您一次性定义它。无论何时运行Ruby命令,都可以设置临时环境变量:
# from shell
KEY="VAL" OTHER_KEY=OTHER_VAL ruby my_command.rb
# from the ruby script
puts ENV["KEY"] # => "VAL"
puts ENV["OTHER_KEY"] # => "OTHER_VAL"
要保留环境变量,您有几个选项。您可以在源代码中对它们进行硬编码,但这可能不是一个好主意,因为如果您将代码推送到Github,任何人都可以看到它。无论如何,这是环境变量的一种,你可以让它们保持系统特定。
选项A
您可以在.bashrc
或.bash_profile
首先得到rake secret
的结果(将是一个随机字符串)并设置一个shell变量:
KEY=`rake secret` # uses backticks to get command result
然后在bashrc
中添加一行以将其导出:
echo -e "export SECRET_KEY_BASE=$KEY" >> ~/.bashrc
选项B
我建议您这样做,您可以使用dotenv或figaro以特定于应用的方式管理您的环境变量,即不会弄乱您的bashrc
例如,使用dotenv
,您需要创建一个.env
文件,其中包含:
# change this to the result of rake secret
SECRET_KEY_BASE=j3e2dd293d
将其添加到gitignore,将其从源代码管理中排除。
然后在你的ruby应用程序中调用
require 'dotenv'
Dotenv.load
并且您的ENV["SECRET_KEY_BASE"]
将被设置。
如果需要,可以创建一个.env.example
文件(包含在源代码管理中),该文件显示需要定义哪些环境变量。然后,当克隆应用时,您可以运行mv .env.example .env
并自定义.env
。