环境变量本地和Heroku

时间:2013-03-17 21:47:02

标签: heroku sinatra environment-variables gitignore foreman

我有一个sinatra应用程序,其中我有一个yml文件来设置环境变量,我用这个方法调用它们

module MyConfig

 def config
  environment = ENV["RACK_ENV"] || "development"
  YAML.load_file("./config/config.yml")[environment]
 end
 end

因此,当我想使用变量时,我会这样做,例如

aws_access_key_id = config['aws_access_key']

我有一个.gitignore文件在推送到github时忽略了config.yml。例如,当我推送到heroku时,这些环境变量将无法访问?

所以这让我使用heroku的方式来设置它们

heroku config:add aws_access_key= myapikey

但是heroku会像

一样访问这些内容
aws_access_key_id = ENV['aws_access_key']

如何设置我的开发环境以使用方法配置和heroku使用ENV,我是否以错误的方式看待这个?或者我的配置方法是否为我做了这个?

任何帮助表示赞赏

Rake文件

  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

4 个答案:

答案 0 :(得分:19)

<强>更新

我现在使用dotenv gem而不是下面的示例。因此,我现在忽略了env.rb文件而不是忽略.env文件。

原帖:

试试这个,

# /env.rb

ENV['aws_bucket'] = 'my_bucket'
ENV['aws_access_key'] = 'my_access_key'
ENV['aws_access_secret'] = 'my_access_secret'

此文件设置与ENV相同的heroku config值。

# /config.rb

require './env' if File.exists?('env.rb')

env.rb只有在存在时才会被要求。

# /.gitignore

/env.rb

env.rb已添加到.gitignore文件中,因此不会保存在Git中。

然后,您可以使用ENV['key']代替config['key']来访问这些值。

如果它与env.rb文件不在同一目录中,您可能需要更改config.rb的路径。

修改

通过查看上一个问题中的Rakefile,您需要将其更改为:

# 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

我认为/config/config.rb中唯一的方法是config方法,所以我删除了

require './config/config.rb'
include MyConfig

并将config[key]替换为ENV[key]中定义的env.rb值。您可能需要更改key名称才能匹配。

答案 1 :(得分:1)

您可以删除yaml,并在.env文件中描述环境变量,然后使用foreman start启动您的应用。见https://devcenter.heroku.com/articles/config-vars#local-setup


或者保留您的混合系统,在dev中加载yaml,并在heroku上使用环境变量。

答案 2 :(得分:1)

我做了类似Sam的建议,但有点不同。我也有一个YAML配置文件,但是我在Rake任务中读取它,然后运行应用程序。

# in the Rakefile

require 'yaml'

def set_connstring
  s = %Q!postgres://#{ENV["DB_APP"]}@localhost/#{ENV["DB_APP"]}!
  ENV['DATABASE_URL'] ||= ENV["RACK_ENV"] == "test" ? "#{s}.test" : s
end


def 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()
end

namespace :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']}"
  end
end

这意味着我可以在本地运行它,而无需在应用程序内部使用任何代码来处理此问题。


编辑:暂时不说,我注意到你的Rakefile中有Bundler.require(:default)。如果您使用bundle install --binstubs,则Bundler会将所有可执行文件安装到名为&#34; bin /&#34;的目录中。在项目内。然后,如果您运行任何这些可执行文件,它们会自动使用Bundler安装的库,无需通过Bundler。请参阅http://gembundler.com/v1.2/man/bundle-exec.1.html

答案 3 :(得分:0)

直接从heroku admin导出: 设置 - &gt;显示配置变量

然后打开浏览器js控制台,粘贴它并输入enter ...

k=[];
$(".config-var-list input").map(function(y, x){k.push($(x).val())});
v=[];
$(".config-var-list textarea").map(function(y, x){v.push($(x).val())});
ret="";
k.map(function(x, i){ret+=k[i]+"\t"+v[2*i]+"\n"});
console.info(ret);