14

環境変数を設定するymlファイルがあるsinatraアプリがあります。このメソッドを使用してそれらを呼び出します

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']

たとえば、github にプッシュするときに config.yml を無視する .gitignore ファイルがあります。したがって、heroku にプッシュすると、これらの環境変数にアクセスできなくなりますか?

したがって、これにより、herokuの方法を使用してそれらをそのように設定することになります

heroku config:add aws_access_key= myapikey

しかし、herokuはこれらに次のようにアクセスします

aws_access_key_id = ENV['aws_access_key']

メソッド構成を使用し、heroku が ENV を使用するように開発環境を設定するにはどうすればよいですか? または私の設定方法は私のためにこれを行いますか?

どんな助けでも大歓迎

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
4

4 に答える 4

19

アップデート:

以下の例の代わりに、 dotenvgemを使用します。そのため、ファイルを無視する代わりに、Gitでファイルを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.rbkey一致するように名前を変更する必要がある場合があります。

于 2013-03-18T00:13:23.433 に答える
1

私はサムの提案に似た何かをしますが、少し異なります。YAML構成ファイルもありますが、その読み取り値をRakeタスクでラップし、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 に答える
1

yaml を削除し、環境変数を.envファイルに記述してから、 foreman start. https://devcenter.heroku.com/articles/config-vars#local-setupを参照してください


または、開発環境で yaml をロードするハイブリッド システムを維持し、heroku で環境変数を使用します。

于 2013-03-17T22:56:10.723 に答える
0

heroku admin から直接エクスポート: [設定] -> [設定変数を表示]

次に、ブラウザの 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 に答える