导轨资产没有在生产中预编译
我使用的是Datetimepicker和Slider。我有他们在我的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开始再次工作。
有什么想法?
这是因为与生产相比,事物在开发中的工作方式不同。 几件事要注意: -
- 没有CSS或JS文件将可以通过资产管道您的应用程序,除非它们包含在其他文件OR在
config.precompile
directive.Only上市application.css
和application.js
可用默认情况下所有的CSS和JS文件。 - 当您编译资产时,每个非应用程序/资产文件夹中的Javascript文件或CSS文件的文件将被Rails复制到
public/assets
文件夹中。因此,如果您要添加一些Web字体,可以创建应用程序/资产/字体/文件夹并将字体放入其中,然后在编译资源时将这些文件复制到public/assets/fonts
文件夹。请注意,您app/assets/stylesheets/fonts.css.scss
文件引用这些字体将不被复制,除非你要么加入到config.assets.precompile
指令或从application.css
- 需要它
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。而且你不想
- 运行
RAILS_ENV=production rake assets:clean assets:precompile
- 检查公共/资产目录,并确认资产compiled..if它不是空的......这意味着缓慢的生产资产管道正在工作,但路径不正确。使用asset_helpers设置CSS文件中资产的路径。
有关路径的补充 - 有时应用程序部署在某些路径下,而不是'/' - 在这种情况下使用变量'RAILS_RELATIVE_URL_ROOT = $ prefix_path'来预编译资产# – AlkH 2015-04-02 10:40:22
对于#1,是不是我在'application.js'中说'// require require bootstrap-datetimepicker'所做的事情,这样我就不必做'config.assets.compile = false'?此外,还记录在生产服务器上(capistrano部署和手工在服务器上) – nitsujri 2015-04-02 11:41:52
如果你想从rail的'public'目录提供静态(预编译)资产,请确保'config.serve_static_assets = true'。另一个可能的问题 - 默认情况下,您为'development'运行'assets:precompile' - 指定例如'RAILS_ENV =生产耙子资产:预编译' – AlkH 2015-04-02 10:19:04
@AlkH,对不起,我应该说,这是在生产服务器上完成的,所以'RAILS_ENV = production'正在被应用。编辑文章 – nitsujri 2015-04-02 11:38:38
你只在html中链接到application.js吗?预编译的application.js是否包含这两个依赖关系? – 2015-04-02 12:00:44