2011-10-14 17 views
2

更好的辦法,我結束了很多特定環境下的初始化,例如我carrierwave.rb在我目前Rails項目組織Rails的初始化

對於開發我使用類似:

CarrierWave.configure do |config| 
    config.cache_dir = Rails.root.join('tmp', 'carrierwave') 
    config.storage = :file 
end 

對於生產我使用S3通過fog

CarrierWave.configure do |config| 
    config.cache_dir = Rails.root.join('tmp', 'carrierwave') 
    config.storage = :fog 

    config.fog_public = false 
    config.fog_credentials = { 
    provider:    'AWS', 
    aws_access_key_id:  '...', 
    aws_secret_access_key: '...' 
    } 
end 

我不想使用Rails.env.development?調用大量與T之間切換他配置,並且我不想將這個初始化器存儲在我的environment/*.rb文件中。有沒有辦法,例如爲initializers目錄下的每個環境創建一個目錄?

initializers 
├── development 
│   └── carrierwave.rb 
├── production 
│   └── carrierwave.rb 
└── test 
    └── carrierwave.rb 

的問題根據Rails的嚮導是以下幾點:

您可以使用子文件夾來組織你的初始化,如果你喜歡,因爲Rails會看到從初始化整個文件層級文件夾下來。

回答

2

你必須進入到另一個目錄隊友,在初始化文件夾中一切都將獲得包括在啓動時。

如果你把上面的,而不是爲說..

RAILS_ROOT /配置/ env_init_files /開發

RAILS_ROOT /配置/ env_init_files /生產

然後,你可以做這樣的事情..

#at the end of your environment.rb   
Dir["#{Rails.root}/config/env_init_files/#{Rails.env}/**/*"].each { |initializer| require initializer } 
0

您可以使用dotenv gem並使用環境變量在環境中更改配置。

2

把你的環境的具體初始化/config/environments/initializers/[env]下,例如/config/environments/initializers/development並添加這樣的事情config/application.rb:從/config/environments/initializers/[env]

module YourApp 
    class Application < Rails::Application 
    # Load environment specific initializers from "config/environments/initializers/[current_env]". 
    initializer 'load_environment_initializers', after: :load_config_initializers do |app| 
     Dir[File.join(File.dirname(__FILE__), 'environments', 'initializers', Rails.env.to_s, '**', '*.rb')].each {|file| require file } 
    end 

    ... 

end 
end 

這將需要(加載)的所有文件和子目錄,它已經完成加載所有常規剛過初始化。

0

我有一個這樣做的Capistrano食譜。證書存儲在repo之外(位於名爲/ var/secure /的文件夾中),並在部署時符號鏈接到config/initializers /中。

namespace :local do 
    desc "Symlink all files in /var/secure into config/initializers. This is how we get production keys into our apps without hard-coding them. If they're production-only, great. If there are development and production credentials, put the development credentials in the repo, and they will be overwritten during deploy." 
    task :symlink_secure_initializers, :roles => [:app,:api] do 
    run "for l in `ls /var/secure/*.rb`; do 
      rm -f #{release_path}/config/initializers/$(basename $l) 
      ln -s /var/secure/$(basename $l) #{release_path}/config/initializers/$(basename $l) 
     done" 
    end 
end 

after "deploy:update_code", "local:symlink_secure_initializers"