Environment variables locally and Heroku

environment-variables, foreman, gitignore, heroku, sinatra

Solution

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.rb

ENV['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.rb

require './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:

# Rakefile

require '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")
end

namespace :assets do
  desc "Precompile assets"
  task :precompile do
    AssetSync.sync
  end
end

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.

Problem

I have a sinatra app in which i have a yml file to set environment variables, i call them using this method ``` module MyConfig def config environment = ENV["RACK_ENV"] || "development" YAML.load_file("./config/config.yml")[environment] end end ``` so when i want to use a variable i do this for example ``` aws_access_key_id = config['aws_access_key'] ``` I have a .gitignore file that ignores config.yml when pushing to github for example.So when I push to heroku these environment variables will not be accessible? So this leaves me with using the heroku way of setting them like so ``` heroku config:add aws_access_key= myapikey ``` but heroku accesses these like ``` aws_access_key_id = ENV['aws_access_key'] ``` How can i set my dev environment to use method config and heroku use ENV, am i looking at this the wrong way? or does my config method do this for me? Any help appreciated RAKEFILE ``` require 'active_support/core_ext' require './config/config.rb' require 'bundler/setup' Bundler.require(:default) include MyConfig AssetSync.configure do |con| con.fog_provider = 'AWS' con.fog_region = 'eu-west-1' con.fog_directory = config['fog_directory'] con.aws_access_key_id = config['aws_access_key'] con.aws_secret_access_key = config['aws_secret_key'] con.prefix = "assets" con.public_path = Pathname("./public") end namespace :assets do desc "Precompile assets" task :precompile do AssetSync.sync end end ```

Original source