使用Rails预编译额外资产

3

我一直在将一个项目转换为使用资产管道,但在部署的某个环节遇到了问题。在将资产预编译之前,开发模式下一切正常,但在将其部署到生产服务器时出现以下错误:

simile-ajax-api.js isn't precompiled

项目结构类似于:
|-app/
  |-assets/
    |-javascripts/
      |- application.js
|-vendor/
  |-assets/
    |-javascripts/
    |-timeline/
      |-timeline_ajax/
        |-simile-ajax-api.js

在我的application.rb文件中,我添加了以下行:
config.assets.paths << "vendor/assets/timeline/timeline_ajax"

在我的production.rb文件中,我添加了以下内容:

  precompile_list = %w(app lib vendor).map do |path|
    Dir[Rails.root.join(*%W(#{path} assets ** *))].select do |f|
      f =~ /(\.js|\.s?css)/
    end
  end.flatten.map do |f|
    f.split(File::SEPARATOR).last
  end.uniq
config.assets.precompile = (config.assets.precompile + precompile_list).uniq
config.assets.precompile << Rails.root.join(*%w( vendor assets timeline timeline_ajax simile-ajax-api.js ))

应用程序的javascript文件看起来像这样:
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
// the compiled file.
//
// WARNING: THE FIRST BLANK LINE MARKS THE END OF WHAT'S TO BE PROCESSED, ANY BLANK LINE SHOULD
// GO AFTER THE REQUIRES BELOW.
//
//= require jquery
//= require jquery_ujs
//= require global
//= require_tree ../../../vendor/assets/timeline/timeline_ajax/.
//= require_tree ../../../vendor/assets/timeline/timeline_js/.
//= require timeline-api
//= require jquery.dataTables.min
//= require FixedHeader.min
//= require ColVis.min
//= require jquery.ba-resize.min
//= require jquery-ui
//= require jquery.blockUI
//= require jquery-ui-timepicker-addon
//= require autocomplete-rails
//= require_tree ../../../vendor/assets/javascripts/.
//= require_tree .

最后,它被加载到application.html.haml中的部分。
%html
  %head
    - page_title = @page_title ? "#{@page_title}" : ''
    %title= strip_tags page_title

    :javascript
      Timeline_ajax_url= "#{asset_path('simile-ajax-api.js')}";
      Timeline_urlPrefix= '/assets/';
      Timeline_parameters='bundle=true'

有任何想法我做错了什么吗?如果需要更多细节,请告诉我。


这是一个错别字问题吗?路径上缺少 javascripts - Amar
抱歉阿玛尔 - 由于混淆,时间轴代码故意放在JavaScript目录之外。 - Irfy
1个回答

1

我认为没有必要像这样声明路径:

//= require_tree ../../../vendor/assets/timeline/timeline_ajax/.

只是:

//= require_tree timeline/timeline_ajax/.

因为所有的资产(无论位于何处)都是以相同的方式查找的。说得简单点,如果目录名为assets,则管道会查找要包含的文件。

编辑:看起来您的vendor目录结构有点奇怪:通常情况下,您会直接将.js文件复制到assets/javascripts目录中。我认为包括assets/vendor/timeline会使事情变得复杂。只需将timeline目录复制到vendor/assets/javascripts即可。


感谢您的回复,但重构似乎并没有解决它。 - Irfy
1
你可以考虑在 production.rb 中返回到默认的管道设置。在我的工作应用程序(rails 3.2.8)中,与 pipeline 相关的设置只有:# 如果缺少预编译的资产,则不要回退到资产管道 config.assets.compile = false config.assets.precompile +=%w(*.js)。如果您尝试将 simile-ajax-api.js 文件复制到 vendor/assets/javascripts 中,那么应该没问题。 - R Milushev
谢谢Quamara,我对这个项目的结构进行了重新整理,并清理了production.rb文件,现在似乎可以正常工作了! - Irfy
很高兴听到这个消息。祝你好运。 - R Milushev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接