Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
局部环境变量与Heroku_Heroku_Sinatra_Environment Variables_Gitignore_Foreman - Fatal编程技术网

局部环境变量与Heroku

局部环境变量与Heroku,heroku,sinatra,environment-variables,gitignore,foreman,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

我有一个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']
我如何将我的开发环境设置为使用方法config和heroku使用ENV,我看得不对吗?还是我的config方法为我做了这件事

谢谢你的帮助

耙子

  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

您可以删除yaml,并在
.env
文件中描述环境变量,然后使用
foreman start
启动应用程序。看



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

更新:

我现在使用gem而不是下面的示例。因此,我不再忽略
env.rb
文件,而是用Git忽略
.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']
访问这些值

如果
config.rb
文件不在同一目录中,您可能需要更改
env.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
值。您可能需要更改
名称以匹配。

我做了一些类似于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安装--binstubs
,那么Bundler会将所有可执行文件安装到项目中名为“bin/”的目录中。然后,如果您运行这些可执行文件中的任何一个,它们将自动使用Bundler安装的库,而无需通过Bundler。请参阅。

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

然后打开浏览器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);

再次感谢您的帮助Sam,这次在运行heroku run rake assets:precompile之后,我没有得到这样的文件或目录-/config/config.yml,我理解为它在.gitignore文件中?有什么办法解决这个问题吗?试着删除
YAML.load\u文件(“./config/config.yml”)[environment]
。由于您已将YAML文件替换为
env.rb
文件,因此不再需要包含它。是的,我尝试过,但后来得到了未定义的方法或局部变量config,因为我的rake文件调用了该方法,我发布了rakefileYou将不得不移动所有YAML
config[key]
properties转换为
env.rb
并将其更改为
env[key]
properties。然后删除对
MyConfig
中的
config[key]
方法的所有引用。非常感谢,如果我不打算使用heroku,我可以使用config.yml方式,但是你的方法同样有效,即使我没有使用heroku