Rails资产未在生产中进行预编译

时间:2015-04-02 09:51:55

标签: ruby-on-rails ruby gem assets

我正在使用DatetimepickerSlider。我将它们包含在我的Gemfile中

gem 'datetimepicker-rails', github: 'zpaulovics/datetimepicker-rails', branch: 'master', submodules: true
source 'https://rails-assets.org' do
  # gem 'rails-assets-select2-bootstrap-css'
  gem 'rails-assets-seiyria-bootstrap-slider'
end

在我的application.js

//= require moment
//= require bootstrap-datetimepicker
//= require pickers

//= require seiyria-bootstrap-slider

这在开发方面效果很好,但是当我在服务器上运行RAILS_ENV=production rake assets:precompile(capistrano部署或手动)时,其他人似乎没有被拉进来.Chrome首先专门抱怨这两个。< / p>

我知道我可以放行Rails.application.config.assets.precompile += %w( *.js )然后执行=javascript_include_tag :XXXX,但是这会破坏链轮/清单的目的吗?

我对sprockets / manifest的理解是当我在application.js中需要它时,它将包含在部署中,以便客户端更少地点击服务器。

我有什么遗失的吗?

修改 将问题追溯到uglifier宝石。当我删除/注释掉config.assets.js_compressor = :uglifier并重新编译JS开始再次工作时。

有什么想法吗?

1 个答案:

答案 0 :(得分:4)

这是因为与生产相比,开发过程中的工作方式不同。 几点需要注意: -

  1. 除非config.precompile指令中列出的其他文件 OR 中包含CSS或JS文件,否则您的应用无法通过资源管道使用这些文件。只有application.css和默认情况下,application.js可用于所有CSS和JS文件。
  2. 编译资产时, Rails 中的每个不是Javascript文件或CSS文件的文件都会被 Rails 复制到public/assets文件夹中。如果如果要添加一些Web字体,可以创建app / assets / fonts /文件夹并将字体放在那里,然后在编译资源时将这些字体复制到public/assets/fonts文件夹。请注意,引用这些字体的app/assets/stylesheets/fonts.css.scss文件将被复制,除非您将其添加到config.assets.precompile指令或从application.css
  3. for config.assets.compile ...如果设置为&#34; true&#34; (默认情况下在开发中)然后 Rails 将首先查看public/assets目录并尝试查找Javascript或CSS文件,如果找不到它,将会寻找你的app/assets文件夹寻找文件。如果它在app/assets中找到它,它将继续进行动态编译,然后提供此资产。
  4. 问题在于你没有注意到它在开发过程中发生,然后你提交了所有内容并推送到生产和BOOM,因为生产具有{{ 1}}设置为&#34; false&#34; 。这可以防止应用程序退回&#34;并尝试直接加载文件,而不是使用资产管道。

    config.assets.compile

    为什么不把这个设置为&#34; true&#34;在每个环境?好吧,因为它是sloooooow。而且你不希望生产缓慢

    1. 运行# Don't fallback to assets pipeline if a precompiled asset is missed config.assets.compile = false
    2. 检查public / assets目录并验证资产是否已编译..如果它不为空...这意味着资产管道正在运行但路径不正确。使用asset_helpers设置css文件中资产的路径