Setting up rake-pipeline for use with handlebars alongside Google App Engine

后端 未结 2 1436
余生分开走
余生分开走 2020-12-03 04:19

So here\'s what I\'m attempting to do. I\'m building an ember.js application, with a java backend running on GAE.

I\'m using handlebars, but I want them divided up i

2条回答
  •  北海茫月
    2020-12-03 04:26

    Rake::Pipeline.build is the method that evaluates an Assetfile. You can imagine that your entire Assetfile is wrapped inside a Rake::Pipeline.build {} block; you shouldn't ever need to write one inside an Assetfile.

    Some of the filters in the docs are hypothetical, most of those docs were written before there were any filters at all. A CoffeeScript compiler has been recently added, though.

    As to your main question, I'm not sure there's a clean way to do it with the current rakep implementation. An Assetfile is just Ruby, though, so it's possible to hack something together that should work. Here's how I would write yours:

    require "json"
    require "rake-pipeline-web-filters"
    require "rake-pipeline-web-filters/helpers"
    
    class HandlebarsFilter < Rake::Pipeline::Filter
      def initialize(&block)
        block ||= proc { |input| input.sub(/\.handlebars$/, '.js') }
        super(&block)
      end
    
      def generate_output(inputs, output)
        inputs.each do |input|
          output.write "return Ember.Handlebars.compile(#{input.read.to_json})"
        end
      end
    end
    
    # process all js, css and html files in app/assets
    input "assets"
    
    # processed files should be outputted to public
    output "public"
    
    # process all coffee files
    match "**/*.coffee" do
      # compile all CoffeeScript files. the output file
      # for the compilation should be the input name
      # with the .coffee extension replaced with .js
      coffee_script
    
      # The coffee_script helper is exactly equivalent to:
      # filter Rake::Pipeline::Web::Filters::CoffeeScriptCompiler
    end
    
    match "**/*.js" do
      minispade
      if ENV['RAKEP_ENV'] == "production"
        concat "application.js"
      else
        concat
      end
    end
    
    match "**/*.handlebars" do
      filter HandlebarsFilter
      minispade
      concat "templates.js"
    end
    

    The if ENV['RAKEP_ENV'] bit reads an environment variable to decide whether to concatenate your JS to a single file.

    So now you can run RAKEP_ENV="production" rakep build for a concatenated build, or just rakep build for a development build.

提交回复
热议问题