29 votes

"L'argument require_tree doit être un répertoire" rails 3.1.1 precompile assets

J'ai fait le tour de la question en essayant de faire précompiler les assets sur mon serveur de production (installation directe d'ubuntu avec ruby 1.9.2 et Rails 3.1.1, et j'ai essayé 3.1.2RC avec le nouveau sprockets 2.10 également).

"L'argument require_tree doit être un répertoire". J'ai vu d'autres problèmes liés à cela sur la pile mais la situation n'est pas exactement la même et aucune des solutions proposées n'a aidé - comme créer un fichier stub dans le sous-dossier, puis référencer seulement relativement à ce point. Je n'ai pas eu de chance.

Et pour couronner le tout, cela fonctionne parfaitement sur toutes les machines de développement (mac's mais avec des configs identiques, même gem pour gem), en production env.

Voici mon /app/assets/javascript/application.js :

//= require ../../views/app/manifest
//= require_self

Il n'y a pas grand-chose à en tirer. En gros, il s'agit de pointer vers le vrai fichier manifest de la zone d'application (oui, ce n'est pas exactement du Rails vanille en boîte, mais...).

Voici mon manifeste stub dans mon views/admin (/views/app/manifest.coffee.js) :

# = require ./app
# = require_tree ./models
# = require_directory ./views <- or using require_directory, either would work fine.

Comme je l'ai dit, dans l'environnement de développement, il n'y a aucun problème. Le pipeline d'assets compile à la volée et tout se passe bien. En lançant rake assets:precompile sur la machine de développement, aucun problème non plus.

Je l'envoie sur la machine de production et j'exécute exactement le même code et j'obtiens :

L'argument require_tree doit être un répertoire

Il doit y avoir une toute petite différence que je ne vois pas. Toute aide serait très appréciée !

0 votes

Tu devrais vraiment déplacer les assets là où ils doivent être et ne pas les mettre dans le répertoire app/view

0 votes

C'est un peu plus compliqué que ce que montre cet exemple simplifié. Les vues sont étroitement liées aux actifs et il est plus logique qu'elles soient physiquement situées.

0 votes

Se pourrait-il que manifest.coffee.js soit plutôt manifest.js.coffee ?

85voto

Keith Schacht Points 1062

J'ai rencontré exactement le même problème que celui que vous avez décrit. Mon serveur de production était Heroku (cedar stack). Dans mon cas, le problème était que l'un de mes :

require_tree ./mobile

pointait vers un répertoire légitime, mais ce répertoire ne contenait aucun fichier. Sur dev, cela n'avait pas d'importance, mais quelque chose dans la configuration de production entraînait l'erreur "require_tree argument must be a directory".

J'espère que cela vous aidera.

1 votes

Je viens de perdre deux heures à cause de cela et j'espère que cela aidera quelqu'un à l'avenir. Si rien n'est dans le dossier, heroku ne le créera pas. (vous devrez mettre au moins un .gitkeep dans ce dossier si vous le voulez toujours)

11 votes

Il s'agit d'un problème avec git plutôt qu'avec ruby ou rails. Git ne crée pas de répertoire s'il n'y a pas de fichiers dedans. Vérifiez votre repo, je parie qu'il n'y a pas de répertoire vide.

0 votes

Je viens d'avoir ce problème avec la Gem Backbone pour Rails. Merci de m'avoir fourni cette solution ! Tout fonctionne maintenant :)

18voto

quentinpre Points 61

require_tree doit se voit attribuer un dossier existant, mais git ne stocker des dossiers vides, donc lorsque vous déployez sur heroku, ces dossiers vides n'existent pas.

une astuce consiste à ajouter un .garder vers les dossiers que vous souhaitez conserver.

0 votes

C'est la vraie raison pour laquelle le répertoire vide n'existe pas en production car il n'est pas dans git.

0voto

Joshua Muheim Points 2906

Pour moi, la création manuelle d'un dossier (vide) a fonctionné shared/vendor/javascript .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X