首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Rake中获取当前的Rack环境?

如何在Rake中获取当前的Rack环境?
EN

Stack Overflow用户
提问于 2013-03-17 18:08:29
回答 3查看 17.2K关注 0票数 8

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

我知道Rake不是机架感知的。我正在努力避免在生产环境和开发环境之间复制几乎相同的Rake任务中的代码。

EN

回答 3

Stack Overflow用户

发布于 2014-09-23 19:48:28

问题很老,但从来没有得到过最佳实践的答案或令人满意的答案。

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

注意:由于瑞克并没有给出太多关于瑞克的信息(瑞克没有使用超文本传输协议),依赖RACK_ENV基本上是错误的,但如果瑞克的任务加载了你的主要Sinatra应用程序( RACK_ENV是让Sinatras开发所必需的吗?/测试?/生产?设置正确)。

答案是:为每个Rake任务调用设置环境。

命令行调用:

代码语言:javascript
复制
/usr/bin/rake namespace:task_name RACK_ENV=production

Cronjob调用(在crontab中):

代码语言:javascript
复制
cd /into/your/app/root && /usr/bin/rake namespace:task_name RACK_ENV=production --silent

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

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

代码语言:javascript
复制
puts ENV["RACK_ENV"]
票数 7
EN

Stack Overflow用户

发布于 2013-03-17 18:20:08

与其他环境变量一样,您可以使用以下命令检索它:

代码语言:javascript
复制
ENV['RACK_ENV']

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

代码语言:javascript
复制
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:

代码语言:javascript
复制
require 'sinatra'

set :environment, :production

get '/' do
  'Hello World'
end

Rakefile:

代码语言:javascript
复制
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时,您应该获得:

代码语言:javascript
复制
> rake your_task
production
票数 6
EN

Stack Overflow用户

发布于 2015-11-13 18:03:57

两年半后,我想分享我发现的最好的解决方案。

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

代码语言:javascript
复制
ENVIRONMENT=development

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

Rake将依赖于在.env中设置的显式值,因此您必须为您计划使用的每个环境(例如开发、测试、升级、生产等)创建单独的.env文件。

示例Rakefile

代码语言:javascript
复制
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应用程序中使用环境变量(您可能会这样做),请将以下内容添加到应用程序的配置或引导程序块中:

代码语言:javascript
复制
require 'dotenv'
Dotenv.load
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15459569

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档