【发布时间】:2012-02-20 20:47:56
【问题描述】:
所以我正在使用 Rails 编写一个 Facebook 应用程序,并托管在 Heroku 上。
在 Heroku 上,您通过将存储库推送到服务器来进行部署。
当我这样做时,我希望它自动将一些开发设置(例如,facebook 密码)更改为生产设置。
最好的方法是什么? Git钩子?
【问题讨论】:
标签: ruby-on-rails-3 git heroku
所以我正在使用 Rails 编写一个 Facebook 应用程序,并托管在 Heroku 上。
在 Heroku 上,您通过将存储库推送到服务器来进行部署。
当我这样做时,我希望它自动将一些开发设置(例如,facebook 密码)更改为生产设置。
最好的方法是什么? Git钩子?
【问题讨论】:
标签: ruby-on-rails-3 git heroku
您可以根据结帐时自动执行的'smudge'脚本来探索content filter的想法。
你会声明:
smudge 脚本能够识别其执行环境并从值文件或从 Git 存储库外部的其他来源(对于更敏感的信息)生成必要的(非版本化)最终文件。李>
【讨论】:
如果您不想在部署时使用 Git 钩子或其他方法来修改实际代码,有几种常见做法可以处理这种情况。
基于环境的配置
如果您不介意在存储库中使用您的配置设置的生产值,您可以使它们基于环境。我有时会使用这样的东西:
# config/application.yml
default:
facebook:
app_id: app_id_for_dev_and_test
app_secret: app_secret_for_dev_and_test
api_key: api_key_for_dev_and_test
production:
facebook:
app_id: app_id_for_production
app_secret: app_secret_for_production
api_key: api_key_for_production
# config/initializers/app_config.rb
require 'yaml'
yaml_data = YAML::load(ERB.new(IO.read(File.join(Rails.root, 'config', 'application.yml'))).result)
config = yaml_data["default"]
begin
config.merge! yaml_data[Rails.env]
rescue TypeError
# nothing specified for this environment; do nothing
end
APP_CONFIG = HashWithIndifferentAccess.new(config)
现在您可以通过例如APP_CONFIG[:facebook][:app_id] 访问数据,并且该值将自动根据应用程序启动的环境而有所不同。
基于环境变量的配置
另一种选择是通过环境变量指定生产数据。 Heroku 允许您通过config vars 执行此操作。
设置您的代码以使用基于环境的值(可能具有可选的默认值):
facebook_app_id = ENV['FB_APP_ID'] || 'some default value'
通过在控制台上键入在 Heroku 上创建生产配置变量:
heroku config:add FB_APP_ID=the_fb_app_id_to_use
现在ENV['FB_APP_ID'] 在生产 (Heroku) 中是 the_fb_app_id_to_use,在开发和测试中是 'some default value'。
上面链接的 Heroku 文档包含有关此策略的更多详细信息。
【讨论】: