【问题标题】:How to get the current Rack environment in Rake?如何在 Rake 中获取当前的 Rack 环境?
【发布时间】:2013-03-17 10:08:29
【问题描述】:

有没有办法在 Rake 中获取有关当前 Rack 环境的信息?例如,如何判断 Rack 是在development 还是production 模式下运行?

我了解 Rake 不支持 Rack。我试图避免在生产环境和开发环境之间几乎相同的 Rake 任务中复制代码。

【问题讨论】:

  • @ted,该链接是关于 Rails 中机架环境的使用,并没有提到任何关于 rake 的内容。它是如何应用的?
  • 请显示那些不同的 Rake 任务。如果我们看到一些代码,也许我们可以提供帮助。
  • 任务没有什么特别之处。最简单的情况:我想连接到不同的数据库,具体取决于我是处于开发阶段还是生产阶段。

标签: ruby rake rack


【解决方案1】:

问题很旧,但从未获得最佳实践答案或完全令人满意的答案。

真正的问题是:如何确定在 Rake 任务中使用哪个环境,以便加载正确的配置/命中正确的 if 条件。

注意:由于 Rake 没有提供太多关于 Rack 的信息(Rake 不使用 HTTP) 依赖 RACK_ENV 基本上是错误的,但如果使用 Rake 则很常见且方便 任务加载您的主 Sinatra 应用程序(需要 RACK_ENV 才能让 西纳特拉斯的发展? / 测试? / 生产?设置正确)。

答案:在每个 Rake 任务调用中设置环境。

命令行调用:

/usr/bin/rake namespace:task_name RACK_ENV=production

Cronjob 调用(在 crontab 中):

cd /into/your/app/root && /usr/bin/rake namespace:task_name RACK_ENV=production --silent

注意:如果您在全局系统变量中指定了 Rake bin 的路径,则无需指定它。您的路径可能与示例中使用的路径不同,请使用以下命令检查 Unix 系统:whereis rake

您可以通过以下方式在您的任务中查看RACK_ENV

puts ENV["RACK_ENV"]

【讨论】:

  • 我通常有一个所有其他任务都依赖的:environment 任务。在此范围内,我总是设置任何其他任务需要的默认值。所以我会更进一步,建议在 Makefile 顶部或 :environment 任务内部定义 ENV['RACK_ENV'] ||= 'development'
【解决方案2】:

作为其他环境变量,您可以使用以下方法检索它:

ENV['RACK_ENV']

考虑到它是一个 Sinatra 应用程序,并且您已将环境设置为 config/environment.rb,您可以将以下内容添加到您的 Rakefile

task :environment do
  require File.expand_path('config/environment', File.dirname(__FILE__))
end

task :your_task => :environment do
  # task
end

然后,您可以使用ENV['RACK_ENV']Sinatra::Application.environment 检索环境(取决于您在environment.rb 中的设置方式)。

考虑到没有config/environment.rb 配置文件,只有应用程序文件,例如hello_world.rb,以下工作:

hello_world.rb:

require 'sinatra'

set :environment, :production

get '/' do
  'Hello World'
end

瑞克文件:

task :environment do
  require File.expand_path('hello_world', File.dirname(__FILE__)) # your Sinatra app
end

task :your_task => :environment do
  puts Sinatra::Application.environment
end

在做rake your_task时你应该得到:

> rake your_task
production

【讨论】:

  • 不起作用。这是一个简单的 Rakefile 来说明:task :test_rack_env do puts ENV['RACK_ENV'] end 打印一个空行。
  • Rack 环境在哪里设置为productiondevelopment
  • 我使用的是 Sinatra,所以它设置了环境。
  • @ArmanH 我已经更新了我的答案。希望这次能帮到你。
  • 感谢您的扩展回答;但是,Sinatra 应用程序中没有配置文件,也没有通过它设置环境。相反,Sinatra 使用 set :environment, :production
【解决方案3】:

2.5 年后,我想分享一下我发现的最佳解决方案。


在应用的根文件夹下创建.env文件,并添加指定应用环境的标志:

ENVIRONMENT=development

然后使用 Brandon Keepers 的 dotenv gem 从这个文件加载所有环境变量。现在您可以在 Rake 任务中使用.env 中指定的任何环境变量。

Rake 将依赖于 .env 中设置的显式值,因此您必须为您计划使用的每个环境创建单独的 .env 文件(例如 devteststagingproduction 等)。

示例Rakefile:

require 'dotenv/tasks'

task :default => :help

desc 'Show this help menu'
task :help do
    puts "Available rake tasks:"
    system('rake --tasks')
end

# Will run in any environment
desc 'Demo task'
task :demo_task => :dotenv do
    puts "Running demo task in '#{ENV['ENVIRONMENT']}' mode"
end

# Will only run if ENVIRONMENT value in .env file is set to 'production'
desc 'Production-only task'
task :production_task => :dotenv do
    if ENV['ENVIRONMENT'] == 'production'
        puts "Running 'Production-only' task"
    else
        puts "Won't run, because the environment is not set to PRODUCTION!"
    end
end

# Will only run if ENVIRONMENT value in .env file is set to 'development'
desc 'Development-only task'
task :dev_task => :dotenv do
    if ENV['ENVIRONMENT'] == 'development'
        puts "Running 'Development-only' task"
    else
        puts "Won't run, because the environment is not set to DEVELOPMENT!"
    end
end

如果您想在 Rack 或 Sinatra 应用程序中使用环境变量(您可能会这样做),请将以下内容添加到应用程序的配置或引导块中:

require 'dotenv'
Dotenv.load

【讨论】:

  • 谢谢!正是我要找的!只是为了澄清一下,要为不同的环境使用不同的.env 文件,您是否使用avdi's approach 或其他一些机制来获取不同.env 文件中的环境变量?
  • 为了在本地测试生产设置,我有一个名为 .env.production 的文件,我在运行测试时将其切换为 .env(在测试时将本地 env 文件重命名为 .env.local)。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-21
  • 2016-05-02
  • 1970-01-01
  • 2012-03-19
  • 2017-04-11
  • 1970-01-01
相关资源
最近更新 更多