2013-03-17 26 views
6

Rake'de mevcut Rack ortamı hakkında bilgi almanın bir yolu var mı? Örneğin, Rack'in development veya production modunda çalışıp çalışmadığını nasıl anlarım?Rake'de mevcut Raf ortamı nasıl alınır?

Rake'in Rack uyumlu olmadığını anlıyorum. Üretim ve dev ortamlar arasında neredeyse aynı Rake görevlerinde kod çoğaltmaktan kaçınmaya çalışıyorum. Diğer ortam değişkeni olarak

+0

http://stackoverflow.com/questions/2715035/rails-env-vs-rails-env – ted

+1

@ted, bağlantı Raylar içinde raf ortamının kullanımı ile ilgili olup, tırmık konusundan hiç söz etmez. Nasıl uygulanır? –

+0

Lütfen bu farklı Rake görevlerini görüntüleyin. Belki bir kod görürsek yardım edebiliriz. – robkuz

cevap

5

, kullanmakta geri alabilirsiniz:

ENV['RACK_ENV'] 

bir Sinatra uygulama ve sen config/environment.rb içine çevreyi kurdum olduğunu düşünürsek, aşağıdakileri ekleyin edebilirsiniz Rakefile:

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

task :your_task => :environment do 
    # task 
end 

Sonra ENV['RACK_ENV'] veya Sinatra::Application.environment ile çevreyi (eğer senin environment.rb içinde kurmak nasıl bağlı olarak) alabilirsiniz.

hello_world.rb:

require 'sinatra' 

set :environment, :production 

get '/' do 
    'Hello World' 
end 

Rakefile:

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 
Mesela hello_world.rb, bir config/environment.rb yapılandırma dosyası, yalnızca uygulama dosyası, aşağıdaki işleri yoktur düşünüldüğünde

'u yaparken aşağıdakileri edinmelisiniz:

> rake your_task 
production 
+0

Çalışmıyor. İşte göstermek için basit bir Rakefile var: 'görevi: yapmak test_rack_env Sonu ' boş satır yazdırır ENV [ 'RACK_ENV'] koyar. –

+0

Raf ortamını "production" veya "development" olarak nerede ayarlıyorsunuz? – toch

+0

Sinatra kullanıyorum, bu yüzden çevreyi ayarlar. –

6

Soru eski ama en iyi uygulama yanıtını ya da tatmin edici bir cevabı asla almadı.

Asıl soru şudur: Doğru yapılandırma/doğru yerleştirme koşullarında doğru yapılandırmayı/yüklemeyi yüklemek için Rake görevinde hangi ortamın kullanıldığından emin olun.

Not: Bir Rake görev ana Sinatra uygulamasını (yükler eğer Rake için (Rake HTTP kullanarak değildir) Raf hakkında pek vermez gibi RACK_ENV itimat temelde yanlış ama yaygın ve kullanışlı RACK_ENV, Sinatras'ın geliştirilmesine izin vermelidir?/Test?/Prodüksiyon doğru şekilde ayarlanmıştır).

Yanıt: Çevreyi, her Rake görev çağrısı ile ayarlayın.

Komut satırı çağrı: (crontab)

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

cronjob çağrı:

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

Not: Rake bin yolunu belirtmek için, o varsa gerekli değildir küresel sistem değişkenleriniz.

Sen aracılığıyla görevlerde RACK_ENV kontrol edebilirsiniz whereis tırmık: Yolunuzu, örneklerde kullanılan madenden farklı olan ile Unix sistemleri üzerinde kontrol edebilirsiniz

puts ENV["RACK_ENV"] 
+0

Genelde diğer tüm görevlerin bağımlı olduğu bir 'çevre 'görevim var. İçinde her zaman diğer görevlerin ihtiyaç duyacağı varsayılan değerleri belirledim. Bu yüzden daha ileri gidip, “ENV ['RACK_ENV'] || = 'geliştirme' 'yi Makefile'nin tepesinde veya bir': çevre 'görevinin içinde tanımlamayı önerirdim. – Bill

3

2,5 sonra yıllar, ben istiyorum En iyi çözüm olduğunu düşündüğüm şeyi paylaş.


uygulamanın kök klasöründe bir .env dosyası oluşturun ve uygulama ortamı belirten bir bayrak ekleyin:

ENVIRONMENT=development 

O zaman bu tüm ortam değişkenleri yüklemek için Brandon Keepers' dotenv mücevher kullanmak dosya. Artık, Rake görevleri içinde .env'da belirtilen ortam değişkenlerini kullanabilirsiniz.

Rake .env belirlenen açık değerine güvenmek ve böylece bunları (örn dev vb testi, evreleme, üretim,) kullanarak size planladığınız her ortam için ayrı .env dosyası oluşturmanız gerekir.

Numune Rakefile:

require 'dotenv' 
Dotenv.load 
: Eğer Rack veya Sinatra uygulamasından (muhtemelen yapmak) içinde ortam değişkenleri kullanmak istiyorsanız

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 

, uygulamanın genelinde veya önyükleme bloğu aşağıdakileri ekleyin

+0

Teşekkürler! Tam olarak ne arıyorum! Sadece açıklamak gerekirse, farklı ortamlar için farklı '.env' dosyalarını kullanmak, [avdi'nin yaklaşımını kullanıyor musunuz? (Http://devblog.avdi.org/2014/01/17/dotenv-for-multiple-environments/) veya Env pick up için başka bir mekanizma farklı '.env' dosyaları var? – EricC

+0

Üretim ayarlarını yerel olarak test etmek için '.env.production' adlı bir dosyam var.test çalıştırırken (test ederken yerel env dosyasını ".env.local" olarak adlandırmak). –

İlgili konular