14

我有一个 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,我看错了吗?还是我的配置方法为我做这个?

任何帮助表示赞赏

瑞克文件

  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

4 回答 4

19

更新:

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

原帖:

尝试这个,

# /env.rb

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

该文件设置的ENVheroku 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.rbconfig方法,所以我删除了,

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

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

于 2013-03-18T00:13:23.433 回答
1

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


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

于 2013-03-17T22:56:10.723 回答
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

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


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

于 2013-03-18T14:44:47.837 回答
0

直接从 heroku 管理员导出:设置 -> 显示配置变量

然后打开浏览器js控制台,粘贴这个并输入回车...

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);
于 2015-08-18T07:21:53.517 回答