Ruby 设置rake管道,与谷歌应用程序引擎旁的把手一起使用

Ruby 设置rake管道,与谷歌应用程序引擎旁的把手一起使用,ruby,handlebars.js,Ruby,Handlebars.js,这就是我想要做的。我正在构建一个ember.js应用程序,在GAE上运行一个java后端 我使用的是把手,但我希望将它们分成单独的文件,而不是全部粘贴到index.html中 通过ember.js irc,我被打开了 随着和一个定制,我开始构建assetfile。我不知道Ruby或gem文件等 因此,我正在尝试找出最好的方法,以便能够动态编译我的coffeescript/Handlebar文件,对它们进行迷你化,但在开发模式下保持单个文件的可访问性,以便调试它们。让这变得困难的是rake管道运行

这就是我想要做的。我正在构建一个ember.js应用程序,在GAE上运行一个java后端

我使用的是把手,但我希望将它们分成单独的文件,而不是全部粘贴到index.html中

通过ember.js irc,我被打开了

随着和一个定制,我开始构建assetfile。我不知道Ruby或gem文件等

因此,我正在尝试找出最好的方法,以便能够动态编译我的coffeescript/Handlebar文件,对它们进行迷你化,但在开发模式下保持单个文件的可访问性,以便调试它们。让这变得困难的是rake管道运行在与GAE不同的端口上。所以我不知道该怎么处理。在开发期间,我是否使GAE中的索引文件指向9292端口(rakep)上的单个文件,但在生产模式中指向完全连接的版本?我不确定

所以我在这里试图做到这一点:通过只有一个由“build”标志触发的部分。我甚至不知道这样是否行得通


我知道这里有很多混乱。抱歉,就像我说的,我对Ruby风格的做事方式一点也不熟悉。

Rake::Pipeline.build是评估
资产文件的方法。您可以想象整个
Assetfile
被包装在
Rake::Pipeline.build{}
块中;您不应该在
资产文件
中编写一个

文档中的一些过滤器是假设的,大多数文档都是在没有任何过滤器之前编写的。不过,最近添加了一个CoffeeScript编译器

至于你的主要问题,我不确定是否有一种干净的方法可以用当前的
rakep
实现来实现。不过,
Assetfile
只是一个Ruby文件,所以可以一起破解一些应该有用的东西。以下是我将如何写你的:

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
需要“json”
需要“rake管道web过滤器”
需要“rake pipeline web筛选器/助手”
类HandlebarsFilter
if ENV['RAKEP_ENV']
位读取环境变量以决定是否将JS连接到单个文件


因此,现在您可以为串联构建运行
RAKEP_ENV=“production”RAKEP build
,或者只为开发构建运行
RAKEP build

由于您不是Ruby用户,以下是使用rake管道设置stock OSX环境的最可靠步骤:

步骤1:安装bundler 步骤2:创建一个文件 步骤3:将rake管道添加到GEM文件 步骤4:安装gems 步骤5:设置资产文件 但是你已经在做了

步骤6:运行Rake::Pipeline
谢谢达力。非常感谢!所以我想剩下的最后一个问题(我知道有很多)是,当我的索引文件位于不同的端口上时,如何让它们在预览模式下动态重新编译。看起来当前的解决方案要么在9292端口解决它们,要么Yehuda建议从GAE以某种方式代理它们。如果有人对最好的解决方案有想法,那就太酷了。非常感谢您的帮助!因此,这几乎是完美的工作。我看到的奇怪的事情是coffeescript和Handlebar文件的minipade标识符被设置为tmp目录(我假设是在这个目录下完成工作的)。有没有办法将其设置为根路径,以使其正常化?同样,我的js文件虽然没有指向tmp路径,但指向的是原始资产路径,而不是公共路径。我知道它只是一个标识符,但我应该期望它们引用公共路径吗?MiniPadeFilter采用:module_id_生成器选项,允许您自定义MiniPade标识符。不幸的是,如果你是Ruby新手,它可能会有点毛茸茸的。下面是我在一个项目中使用的一个:
:module_id_generator=>proc{input}input.path.sub(/lib\/,'timelog/')).sub(/\.js$/,'')
它只是将路径前面的
lib/
替换为
timelog
,并将
.js
从末尾去掉。这里没有太多解释的空间,所以如果你想问另一个关于这方面的问题,我会尝试在那里回答。这里问的问题:谢谢Yehuda!这对你的回答非常有帮助昨天晚上我翻来覆去,但当达德利夫手持我的问题的细节时,他会把我的答案标记为最好的。
# on OSX, using built-in Ruby
$ sudo gem install bundler --pre
# inside your app directory
$ bundle init

# will create a file named Gemfile in the root
# inside the Gemfile
gem "rake-pipeline-web-filters"
$ bundle install --binstubs
# to run the preview server
$ bin/rakep

# to build your assets
$ bin/rakep build