首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在执行Rails assets:预编译时,如何运行一些初始化器?

在执行Rails assets:预编译时,如何运行一些初始化器?
EN

Stack Overflow用户
提问于 2012-02-11 05:48:23
回答 5查看 6.7K关注 0票数 18

背景

我有一个应用程序,我最近更新到了Rails 3.2.1 (从Rails 3.0.x),并重构了JS和CSS资产,以利用新的资产管道。该应用程序托管在Heroku上,使用Celadon Cedar堆栈。

应用配置

我将特定于应用程序的配置保存在一个名为app_config.yml的YAML文件中,并使用初始化器将其加载到一个全局APP_CONFIG变量中:

代码语言:javascript
复制
# config/initializers/load_app_config.rb

app_config_contents = YAML.load_file("#{Rails.root.to_s}/config/app_config.yml")
app_config_contents["default"] ||= {}
APP_CONFIG = app_config_contents["default"].merge(
                       app_config_contents[Rails.env] || {} ).symbolize_keys

Heroku上的资源编译

Heroku支持内置到Cedar堆栈中的Rails资产管道。当您将应用程序推送到Heroku时,作为部署过程中的一个步骤,它会自动调用服务器上的rake assets:precompile。但是,它是在没有数据库访问或普通ENV变量的沙箱环境中执行此操作的。

如果允许应用程序在资产预编译期间正常初始化,则在尝试连接到数据库时会抛出错误。只需将以下内容添加到application.rb文件即可轻松解决此问题:

代码语言:javascript
复制
    # Do not load entire app when precompiling assets
    config.assets.initialize_on_precompile = false

我的问题

设置initialize_on_precompile = false时,config/initializers/*中的任何初始化器都不会运行。我遇到的问题是,我需要APP_CONFIG变量在资产预编译期间可用。

如何在不初始化整个应用的情况下,在资源编译过程中加载load_app_config.rb?我能对传递给Rails::Application.initialize的group参数做些什么吗!?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-10-03 08:05:29

Rails只允许您在某些组中注册初始化器,但您需要使用Railtie API:

代码语言:javascript
复制
# in config/application.rb

module AssetsInitializers
  class Railtie < Rails::Railtie
    initializer "assets_initializers.initialize_rails",
                :group => :assets do |app|
      require "#{Rails.root}/config/initializers/load_config.rb"
    end
  end
end

您不需要检查是否定义了AppConfig,因为这只会在assets组中运行。

而且你可以(也应该)继续使用initialize_on_precompile = false。load_config.rb初始化器将在初始化应用程序时运行(因为它是在config/initializers中),以及在没有初始化的情况下预编译时运行(因为上面的代码)。

票数 46
EN

Stack Overflow用户

发布于 2012-03-07 23:42:27

绝对可以在github上查看asset_sync。或者我们在Using a CDN asset Host with Rails 3.1 on Heroku上的Heroku开发中心的文章。

Heroku实验室的一个插件最近解决了环境变量的问题,该插件使您的应用程序的heroku config变量可以在编译时访问。要启用此功能,请阅读有关user_env_compile插件的信息。

还有。与让应用程序在生产环境中懒惰地编译资产或直接从应用程序服务器上预编译资产相比,使用asset_sync会有相当大的性能提升。然而,我要说的是。这是我写的。

  • 使用asset_sync和S3,您可以预编译资产,这意味着所有资产都已准备好在资产主机上提供服务/ CDN immediately
  • You在预编译时只能要求application.rb中的: assets 捆绑包,节省production
  • Your应用服务器中的内存永远不会命中资产请求。你知道,你可以在上面花费昂贵的计算时间。Computing.
  • Best实践HTTP缓存头都是默认设置的
  • 您可以通过一个额外的配置来启用自动gzip压缩
票数 7
EN

Stack Overflow用户

发布于 2012-02-21 20:35:06

这是我想出来的。在需要应用程序配置的资产中,我将这一行放在最开始:

代码语言:javascript
复制
<% require "#{Rails.root}/config/initializers/load_config.rb" unless defined?(AppConfig) %>

..。并在文件名中添加.erb,这样video_player.js.coffee就变成了video_player.js.coffee.erb。之后我就可以安全地使用AppConfig['somekey']了。

在资产预编译期间,尽管initialize_on_precompile设置为false,但它仍会加载应用程序配置,并且只执行一次(这可以避免不断的重新定义问题)。

是的,这是一个杂乱无章的东西,但比在资产文件中嵌入配置要好很多倍。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9235292

复制
相关文章

相似问题

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