环境变量和局部的Heroku(Environment variables locally and H

2019-08-17 16:26发布

我有一个西纳特拉应用中,我有一个文件阳明海运设置环境变量,我打电话给他们使用这种方法

module MyConfig

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

所以,当我想用​​一个变量i做到这一点,例如

aws_access_key_id = config['aws_access_key']

我有力推github上的example.So的时候,当我推到Heroku的这些环境变量将无法访问,忽略config.yml一个的.gitignore文件?

因此,这让我使用他们的设置,像这样的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

Answer 1:

更新:

我现在用的dotenv宝石,而不是下面的例子。 因此,而不是忽略的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名称匹配。



Answer 2:

你可以删除YAML,并描述在环境变量.env文件,然后开始使用你的应用程序foreman start 。 见https://devcenter.heroku.com/articles/config-vars#local-setup


或者让你的混合动力系统,在这里装载在开发一个YAML,并在Heroku使用环境变量。



Answer 3:

我做类似山姆的建议的东西,但有一点点不同。 我有一个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然后捆扎机安装的所有可执行文件到一个项目中的一个名为“滨/”目录。 然后,如果你运行任何这些可执行程序会自动使用由安装捆扎机库,无需通过捆扎机要求。 见http://gembundler.com/v1.2/man/bundle-exec.1.html 。



Answer 4:

直接从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);


文章来源: Environment variables locally and Heroku