Rails 资产未在生产中预编译

nit*_*jri 1 ruby gem assets ruby-on-rails

我正在使用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
Run Code Online (Sandbox Code Playgroud)

在我的 application.js

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

//= require seiyria-bootstrap-slider
Run Code Online (Sandbox Code Playgroud)

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

我知道我可以放线Rails.application.config.assets.precompile += %w( *.js )然后做一个=javascript_include_tag :XXXX,但这违背了链轮/清单的目的,对吗?

我对链轮/清单的理解是,当我需要它时,application.js它将包含在部署中,因此客户端对服务器的访问更少。

有什么我想念的吗?

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

有什么想法吗?

Mil*_*ind 5

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

  1. 无CSS或JS文件将提供给您的应用程序通过资产管道,除非它们包含在其他文件在上市config.precompiledirective.Onlyapplication.cssapplication.js可被所有的CSS和JS文件的默认。
  2. 当你编译你的assets 时,Rails会将 app/assets 文件夹中不是 Javascript 文件或 CSS 文件的每个文件复制到该public/assets文件夹中。所以如果你想添加一些网络字体,你可以制作一个 app/assets /fonts/ 文件夹并将您的字体放在那里,这些将public/assets/fonts在您编译资产时复制到文件夹中。请注意,您app/assets/stylesheets/fonts.css.scss引用这些字体的文件不会被复制,除非您将其添加到config.assets.precompile指令中或从您的指令中要求它application.css
  3. for config.assets.compile...如果它被设置为“true”(在开发中是默认的),那么Rails将首先在public/assets目录中查找一个 Javascript 或 CSS 文件,如果找不到它,将搜索您app/assets正在查找文件的文件夹。如果它在其中找到它,app/assets它将继续进行动态编译,然后提供此资产。

这样做的问题是您没有注意到它在开发中发生,然后您提交所有内容并推送到生产和 BOOM,一切都因 500 个错误而被破坏,因为生产config.assets.compile设置为 "false" 。这可以防止应用程序“回退” "并尝试直接加载文件而不是使用资产管道。

# Don't fallback to assets pipeline if a precompiled asset is missed
config.assets.compile = false
Run Code Online (Sandbox Code Playgroud)

为什么不在每个环境中都将此设置为“true”?好吧,因为它太慢了。而且您不希望生产缓慢

  1. RAILS_ENV=production rake assets:clean assets:precompile
  2. 检查 public/assets 目录并验证资产是否已编译...如果它不为空...这意味着资产管道正在工作但路径不正确。使用asset_helpers在 css 文件中设置资产的路径。