bundle exec rake assets: la précompilation échoue avec `Token inattendu`

Je suis prêt à déployer mon application Rails 3.1 en production et, comme j’utilise le pipeline d’actifs, je dois précomstackr mes actifs . Cependant, lorsque j’essaye ceci, j’obtiens une erreur apparemment liée à la compilation de jQuery:

$ bundle exec rake --trace assets:precomstack ** Invoke assets:precomstack (first_time) ** Execute assets:precomstack /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:precomstack:all RAILS_ENV=production RAILS_GROUPS=assets --trace ** Invoke assets:precomstack:all (first_time) ** Execute assets:precomstack:all ** Invoke assets:precomstack: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:precomstack: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 

[snip beaucoup de choses]

  (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 `comstack_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' 

[Snip beaucoup plus de choses]

Voici mon application.js :

 //= require jquery //= require jquery_ujs //= require jquery-ui // // NB jQuery requires have to come before this: //= require active_scaffold 

J’utilise le compresseur par défaut, c.-à- uglifier . uglifier .

J’ai constaté que si je config.assets.compress en false dans config/environments/production.rb alors cela fonctionnerait bien, mais bien entendu, mon application fonctionnerait mieux si je pouvais trouver un moyen de la garder comme true .

J’ai examiné les ressources de rake: la précompilation ne fonctionne pas (rails 3.1.1) et je ne pense pas qu’il s’agisse d’une copie dupliquée car l’erreur n’est undefined: Unexpected token: operator (<) .

Des idées? Je me méfie vaguement de ces caractères unicode dans le code jQuery, mais je ne sais pas comment prouver ou réfuter qu’ils sont à l’origine du problème.

J’ai eu exactement le même problème et l’ai résolu, voici les détails:

Lorsque vous incluez un ou plusieurs fichiers javascript dans votre environnement Rails 3.1 à l’aide de application.js et //= require ... , Rails encapsule le contenu de votre fichier avec un . Vous pouvez le vérifier en exécutant votre site en mode développement et en effectuant un affichage | La source.

Le problème est qu’en mode de développement, si vous n’utilisez pas réellement ce script, il peut sembler fonctionner correctement. Mais, en gros, ce que vous avez, c’est .

Cependant, lorsque vous tentez de PRECOCULER les actifs, quelque chose dans ce processus de compilation (désolé – je ne sais pas quoi exactement) gags sur le “<" dans le jeton de script interne.

Vérifiez deux fois vos fichiers .js inclus et, si l’un d’eux est enveloppé par supprimez les balises qui l’entourent.

Vous devriez voir que, dans le développement, tout semble encore bien si vous affichez le code source de la page. Et, lorsque vous précomstackz vos actifs, l’erreur doit disparaître.

J’ai rencontré ce problème avec l’extrait de code javascript Google recommandé par Google et la suppression de l’encapsuleur de script du fichier inclus a résolu le problème.

Voici comment j’ai débogué ceci.

Localement, lancez cette

RAILS_ENV=production bundle exec rake assets:precomstack

Essayez de savoir où il s’étouffe (le script juste avant l’étouffement est le fichier que vous souhaitez consulter). Regardez toutes les exigences.

Dans mon cas, j’avais un fichier qui se terminait par .js alors qu’il aurait dû être .jsx et c’est ce qui l’a corrigé.

J’ai eu le même problème.

Même si je n’avais pas de balise dans mes fichiers javascript, la suggestion de Dave m'a beaucoup aidé!

J'ai pu repérer un commentaire sur une bibliothèque externe que je chargeais dans mon application.js :