我已准备好将我的Rails 3.1应用程序部署到生产环境中,因为我正在使用资产管道I need to precompile my assets。但是,当我尝试这个时,我得到一个显然与编译jQuery相关的错误:
$ bundle exec rake --trace assets:precompile
** Invoke assets:precompile (first_time)
** Execute assets:precompile
/home/adam/.rvm/rubies/ruby-1.9.3-p0/bin/ruby /home/adam/.rvm/gems/ruby-1.9.3-p0@rails-3.1/bin/rake assets:precompile:all RAILS_ENV=production RAILS_GROUPS=assets --trace
** Invoke assets:precompile:all (first_time)
** Execute assets:precompile:all
** Invoke assets:precompile:primary (first_time)
** Invoke assets:environment (first_time)
** Execute assets:environment
** Invoke environment (first_time)
** Execute environment
** Invoke tmp:cache:clear (first_time)
** Execute tmp:cache:clear
** Execute assets:precompile:primary
rake aborted!
399: unexpected token at '"/*!\u000a * jQuery JavaScript Library v1.7.1\u000a * http://jquery.com/\u000a *\u000a * Copyright 2011, John Resig\u000a * Dual licensed under the MIT or GPL Version 2 licenses.\u000a * http://jquery.org/license\u000a *\u000a * Includes Sizzle.js\u000a * http://sizzlejs.com/\u000a * Copyright 2011, The Dojo Foundation\u000a * Released under the MIT, BSD, and GPL Licenses.\u000a *\u000a * Date: Mon Nov 21 21:11:03 2011 -0500\u000a */\u000afunction addActiveScaffoldPageToHistory(a,b){if(typeof
[剪掉很多东西]
(in /data/music/RotC/eventbook/app/assets/javascripts/application.js)
/home/adam/.rvm/gems/ruby-1.9.3-p0@rails-3.1/gems/json-1.6.4/lib/json/common.rb:148:in `parse'
/home/adam/.rvm/gems/ruby-1.9.3-p0@rails-3.1/gems/json-1.6.4/lib/json/common.rb:148:in `parse'
/home/adam/.rvm/gems/ruby-1.9.3-p0@rails-3.1/gems/multi_json-1.0.4/lib/multi_json/engines/json_common.rb:9:in `decode'
/home/adam/.rvm/gems/ruby-1.9.3-p0@rails-3.1/gems/multi_json-1.0.4/lib/multi_json.rb:76:in `decode'
/home/adam/.rvm/gems/ruby-1.9.3-p0@rails-3.1/gems/execjs-1.2.13/lib/execjs/external_runtime.rb:61:in `extract_result'
/home/adam/.rvm/gems/ruby-1.9.3-p0@rails-3.1/gems/execjs-1.2.13/lib/execjs/external_runtime.rb:27:in `block in exec'
/home/adam/.rvm/gems/ruby-1.9.3-p0@rails-3.1/gems/execjs-1.2.13/lib/execjs/external_runtime.rb:40:in `compile_to_tempfile'
/home/adam/.rvm/gems/ruby-1.9.3-p0@rails-3.1/gems/execjs-1.2.13/lib/execjs/external_runtime.rb:26:in `exec'
[剪掉更多东西]
这是我的application.js
:
//= require jquery
//= require jquery_ujs
//= require jquery-ui
//
// N.B. jQuery requires have to come before this:
//= require active_scaffold
我正在使用默认压缩器,即uglifier
。
我发现,如果我在config.assets.compress
中将false
更改为config/environments/production.rb
,那么它可以正常工作,但当然,如果我能找到一种方法,我的应用会表现得更好它为true
。
我查看了rake assets:precompile doesn't work (rails 3.1.1),我认为它不重复,因为错误是undefined: Unexpected token: operator (<)
。
有什么想法吗?我对jQuery代码中的那些unicode字符含糊不清,但我不确定如何证明或反驳它们导致了这个问题。
答案 0 :(得分:20)
我有这个完全相同的问题并解决了它,详情如下:
当您使用application.js和//= require ...
在Rails 3.1环境中包含一个或多个javascript文件时,Rails将使用<script> ..filecontents.. </script>
包装文件的内容。您可以通过在开发模式下运行站点并执行View |来验证这一点源。
问题是,在开发模式下,如果您不实际使用该脚本,它可能出现以正常工作。但是,基本上,你所拥有的是<script><script> ..filecontents.. </script></script>
。
但是,当你试图预处理资产时,那个编译过程中的一些东西(对不起 - 我不知道到底是什么)在“&lt;”上喋喋不休在内部脚本令牌中。
仔细检查您附带的.js文件,如果其中任何文件被<script> ... </script>
包裹,请删除周围的标记。
你应该看到,在开发中,如果你查看页面源,一切看起来都很好。而且,当您预编译资产时,错误应该消失。
我使用Google推荐的google-analytics javascript片段遇到了这个问题,并从包含的文件中删除脚本包装解决了这个问题。
答案 1 :(得分:6)
以下是我调试此内容的方法。
在本地,运行此
RAILS_ENV=production bundle exec rake assets:precompile
尝试找出它窒息的地方(窒息之前的脚本是你想看的文件)。看看所有要求。
在我的情况下,我有一个以.js
结尾的文件,当它应该是.jsx
时,就是修复它的文件。
答案 2 :(得分:0)
我遇到了同样的问题。
即使我的javascript文件中没有<script>
标记,Dave的建议对我帮助很大!
我能够发现我在application.js
中加载的外部库的评论:
<!-- Hotjar Tracking Code for (...) ->
单一评论打破了uglifier
压缩,我花了很长时间才找到它,甚至可能认为这是罪魁祸首。
所以,也要注意JS文件开头的评论,因为它可能会破坏你的压缩。