【问题标题】:What's the best way to generate environment-specific files for a Rails project?为 Rails 项目生成特定于环境的文件的最佳方法是什么?
【发布时间】:2008-12-29 19:03:27
【问题描述】:

我在 Javascript 文件中有一些我需要的设置——要连接的服务器——这些设置会根据我的环境而变化。对于developmentteststaging,我想使用临时服务器;对于production,生产服务器。我已经有了 Ruby 中的设置(在我的 environment/xyz.rb 文件中配置)。到目前为止,我一直在使用 application.js.erb 文件和自定义路由在请求时动态创建 JS 文件。不过,这很慢,这意味着只为这个文件创建一个额外的控制器和视图目录。

我希望有一个模板文件和一个从模板生成正确版本并将静态文件放在public/javascripts 目录中的 rake 任务。有没有人尝试过这样的事情?你用什么渲染的?你把模板文件和渲染代码放在哪里了?

还是只保留动态版本并将其缓存在生产环境中更好?

【问题讨论】:

    标签: ruby-on-rails ruby templates caching


    【解决方案1】:

    你可以这样做吗?

    <% javascript_include_file "#{RAILS_ENV}.js" %>
    

    我做了类似的事情,虽然它不是用 JS 文件,而是用一些 RB 文件......我这样做的原因相同,确定要连接到哪些服务器。

    对我来说,我的"lib" 目录中有一个名为"constants.rb" 的rb 文件。该文件有一些 if 语句会根据环境(开发、测试、登台或生产)切换,这些语句会切换出我需要附加到的 IP 地址的值。在我运行应用程序的机器的庞然大物上,这对于我的目的来说已经足够了。

    这是一个示例:

    if ENV['RAILS_ENV'] != "production" ## if the rails environment is development or staging then use the test server
      @@IP_ADDRESS = "10.16.121.173" ## the test server
    else ## if the Rails environment is production, then use the live server.
      @@IP_ADDRESS = "10.16.8.44" ## The is the shared IP address
    end
    

    【讨论】:

    • 这是个好主意。不可能有数百个甚至数十个环境,因此不会有大量文件。我可能会建议一个信息更丰富的名称,例如“settings_#{RAILS_ENV.downcase}.js”或“constants_...”
    • 文件名信息越丰富越好。很高兴你喜欢这个主意。
    【解决方案2】:

    使用 rake 任务来生成这些 javascript 文件确实是一种选择。我正在使用 rake 任务从 YAML 格式的翻译文件中为 JS 前端生成 i18n 翻译文件。一种选择是将 ERB 用于模板。我会将 rakefile 放在 lib/tasks/foo.rake 下,将模板放在 lib/tasks/foo/foo.erb 下。如果您的 JS 模板不是很复杂,我建议使用普通的 Hash.to_json 方法生成 javascript 内容:

    namespace :js do
      task :generate_config => :environment do
        File.open("#{RAILS_ROOT}/public/javascripts/configuration.js", 'w') do |out|
          config = {:option_1 => 'Value 1', :option_2 => 'Value 2'}
          out << "var CONFIG = #{config.to_json}"
        end
      end
    end
    

    配置文件是您不想忘记在配置源数据更改时重新生成的内容。我正在使用一种解决方案在生产环境中生成“缩小”的 JS 文件,以将大量 javascript 文件附加在一起,这样我就可以节省 HTTP 请求。但是您可以使用基本相同的解决方案。如果您使用 Capistrano 来部署您的应用程序,它会非常有用。

    在文件app/helpers/application_helper.rb 中创建全局可用的新辅助方法:

    module ApplicationHelper
      def javascript_include_config_tag
        if ActionController::Base.perform_caching
          unless File.exists?("#{RAILS_ROOT}/public/javascripts/configuration.js")
    
            #
            # TODO: Generate configuration data in here
            #
            config = 'configuration file contents'
    
            File.open("#{RAILS_ROOT}/public/javascripts/configuration.js", 'w') do |out|
              out << config
            end
          end
          javascript_include_tag('configuration')
        else
          # Link to js generated dynamically on each request. Useful in development.
          javascript_include_tag('PATH_TO_DYNAMICALLY_GENERATED_JS')
        end
      end
    end
    

    在您看来,您只需将 javascript 包含在其中

    <%= javascript_include_config_tag %>
    

    这里的想法是,这个 JS 配置文件仅在新 Capistrano 部署后第一次页面加载时生成。它还有一个巨大的缺点,即您无法在生成第一页之前请求 configuration.js 文件,但在我的应用程序中,到目前为止它运行良好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-12
      • 2019-09-08
      • 2018-07-01
      • 2015-03-23
      • 1970-01-01
      • 2023-03-21
      相关资源
      最近更新 更多