导轨资产没有在生产中预编译

问题描述:

我使用的是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的部署或手工),这些,和其他人不要” t似乎被拉进来。Chrome首先特别抱怨这两个。

我知道我可以把行Rails.application.config.assets.precompile += %w(*.js),然后做一个=javascript_include_tag :XXXX,但这失败了链轮/清单权的目的?

我对链轮/清单的理解是,当我需要它在我的application.js中时,它将包含在部署中,以便客户端少打击服务器。

有什么我失踪了吗?

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

有什么想法?

+1

如果你想从rail的'public'目录提供静态(预编译)资产,请确保'config.serve_static_assets = true'。另一个可能的问题 - 默认情况下,您为'development'运行'assets:precompile' - 指定例如'RAILS_ENV =生产耙子资产:预编译' – AlkH 2015-04-02 10:19:04

+0

@AlkH,对不起,我应该说,这是在生产服务器上完成的,所以'RAILS_ENV = production'正在被应用。编辑文章 – nitsujri 2015-04-02 11:38:38

+0

你只在html中链接到application.js吗?预编译的application.js是否包含这两个依赖关系? – 2015-04-02 12:00:44

这是因为与生产相比,事物在开发中的工作方式不同。 几件事要注意: -

  1. 没有CSS或JS文件将可以通过资产管道您的应用程序,除非它们包含在其他文件ORconfig.precompile directive.Only上市application.cssapplication.js可用默认情况下所有的CSS和JS文件。
  2. 当您编译资产时,每个非应用程序/资产文件夹中的Javascript文件或CSS文件的文件将被Rails复制到public/assets文件夹中。因此,如果您要添加一些Web字体,可以创建应用程序/资产/字体/文件夹并将字体放入其中,然后在编译资源时将这些文件复制到public/assets/fonts文件夹。请注意,您app/assets/stylesheets/fonts.css.scss文件引用这些字体将被复制,除非你要么加入到config.assets.precompile指令或从application.css
  3. 需要它config.assets.compile ...如果它被设置为“真”(它那么Rails会尝试通过首先查找public/assets目录来查找Javascript或CSS文件,如果找不到它,将通过您的app/assets文件夹搜索以查找该文件。如果它在app/assets中找到它,它将继续前进并在运行中编译,然后提供此资产。

这里的问题是,你不会注意到它的发展发生的事情,那么你犯的一切,推动生产和繁荣,一切都与500错误的破裂是因为生产config.assets.compile设置为“假” 。这可以防止应用程序“回退”,并尝试直接加载文件,而不是使用资产管道。

# Don't fallback to assets pipeline if a precompiled asset is missed 
config.assets.compile = false 

你为什么不只是有这个设置为“true”在每一个环境?那么,因为它是sloooooow。而且你不想

  1. 运行RAILS_ENV=production rake assets:clean assets:precompile
  2. 检查公共/资产目录,并确认资产compiled..if它不是空的......这意味着缓慢的生产资产管道正在工作,但路径不正确。使用asset_helpers设置CSS文件中资产的路径。
开始=“4”>
+0

有关路径的补充 - 有时应用程序部署在某些路径下,而不是'/' - 在这种情况下使用变量'RAILS_RELATIVE_URL_ROOT = $ prefix_path'来预编译资产# – AlkH 2015-04-02 10:40:22

+0

对于#1,是不是我在'application.js'中说'// require require bootstrap-datetimepicker'所做的事情,这样我就不必做'config.assets.compile = false'?此外,还记录在生产服务器上(capistrano部署和手工在服务器上) – nitsujri 2015-04-02 11:41:52