Environment variables locally and Heroku
Update:
I now use the dotenv gem instead of the example below. So instead of ignoring the env.rb
file, I now ignore the .env
file with Git.
Original post:
Try this,
# /env.rbENV['aws_bucket'] = 'my_bucket'ENV['aws_access_key'] = 'my_access_key'ENV['aws_access_secret'] = 'my_access_secret'
This file sets the same ENV
values as heroku config
would do.
# /config.rbrequire './env' if File.exists?('env.rb')
The env.rb
will only get required if it exists.
# /.gitignore/env.rb
The env.rb
has been added to the .gitignore
file so it isn't kept in Git.
You would then access the values using ENV['key']
instead of config['key']
.
You might need to change the path to the env.rb
if it's not in the same directory as the config.rb
file.
EDIT:
From looking at your Rakefile
in the previous question, you need to change it to this:
# Rakefilerequire 'bundler/setup'Bundler.require(:default)require './env' if File.exists?('env.rb')AssetSync.configure do |con| con.fog_provider = 'AWS' con.fog_region = 'eu-west-1' con.fog_directory = ENV['aws_bucket'] con.aws_access_key_id = ENV['aws_access_key'] con.aws_secret_access_key = ENV['aws_access_secret'] con.prefix = "assets" con.public_path = Pathname("./public")endnamespace :assets do desc "Precompile assets" task :precompile do AssetSync.sync endend
I've assumed that the only method in /config/config.rb
was the config
method so I've removed the,
require './config/config.rb'include MyConfig
And swapped the config[key]
for the ENV[key]
values defined in env.rb
. You may need to change the key
names to match up.
You could delete the yaml, and describe the environment variables in a .env
file then start your app with foreman start
. See https://devcenter.heroku.com/articles/config-vars#local-setup
Or keep your hybrid system, where you load a yaml in dev, and use environment variables on heroku.
I do something similar to Sam's suggestion, but a little bit different. I have a YAML config file too, but I wrap the reading of it in a Rake task, which then runs the app.
# in the Rakefilerequire 'yaml'def set_connstring s = %Q!postgres://#{ENV["DB_APP"]}@localhost/#{ENV["DB_APP"]}! ENV['DATABASE_URL'] ||= ENV["RACK_ENV"] == "test" ? "#{s}.test" : senddef basic_environment warn " Setting up environment..." file = File.expand_path( File.join File.dirname(__FILE__), "./config.yml" ) if File.exist? file YAML.load_file(file).each do |k,v| warn "-> #{k}" ENV[k.upcase] = v end end set_connstring()endnamespace :app do desc "Set up the environment locally" task :environment do basic_environment() end desc "Run the app locally" task :run_local => "app:environment" do exec "bin/rackup config.ru -p #{ENV['RUN_LOCAL_PORT']}" endend
It means I can run it locally without any code inside the app to deal with this.
Edit: a quick aside, I notice you have Bundler.require(:default)
in your Rakefile. If you use bundle install --binstubs
then Bundler installs all executables into a dir named "bin/" within the project. Then, if you run any of those executables they automatically use the libraries installed by Bundler, no need to require via Bundler. See http://gembundler.com/v1.2/man/bundle-exec.1.html.