web-dev-qa-db-fra.com

l'argument require_tree doit être un répertoire dans une application mise à niveau vers Rails 5

Je viens de mettre à niveau mon application de Rails 4.2.7 à Rails 5.0.0.1. J'ai utilisé RailsDiff pour m'assurer que tout était couvert et je crois que je l'ai fait. Jusqu'à présent, tout a bien fonctionné jusqu'au chargement de mon application. 

Maintenant je vois cette erreur:

Sprockets::ArgumentError at /
require_tree argument must be a directory

C'est mon application.css:

/*
 * This is a manifest file that'll be compiled into application.css, which will include all the files
 * listed below.
 *
 * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
 * or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
 *
 * You're free to add application-wide styles to this file and they'll appear at the bottom of the
 * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS
 * files in this directory. Styles in this file should be added after the last require_* statement.
 * It is generally better to create a new file per style scope. *
 *= require_tree .
 *= require_self
 */

C'est mon application.js

// This is a manifest file that'll be compiled into application.js, which will include all the files
// listed below.
//
// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
// or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path.
//
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
// compiled file. JavaScript code in this file should be added after the last require_* statement.
//
// Read Sprockets README (https://github.com/Rails/sprockets#sprockets-directives) for details
// about supported directives.
//
//= require jquery
//= require jquery_ujs
//= require turbolinks
//= require_tree .

Voici à quoi ressemble le journal du serveur:

Started GET "/" for ::1 at 2016-09-02 09:08:19 -0500
  ActiveRecord::SchemaMigration Load (1.5ms)  SELECT "schema_migrations".* FROM "schema_migrations"
  User Load (1.7ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 2], ["LIMIT", 1]]
Processing by ProfilesController#index as HTML
  Rendering profiles/index.html.erb within layouts/application
  Profile Load (1.6ms)  SELECT "profiles".* FROM "profiles"
  Rendered profiles/index.html.erb within layouts/application (45.8ms)
Completed 500 Internal Server Error in 367ms (ActiveRecord: 6.3ms)


DEPRECATION WARNING: #original_exception is deprecated. Use #cause instead. (called from initialize at /.rvm/gems/Ruby-2.3.1@myapp/gems/better_errors-2.1.1/lib/better_errors/raised_exception.rb:7)
DEPRECATION WARNING: #original_exception is deprecated. Use #cause instead. (called from initialize at /.rvm/gems/Ruby-2.3.1myapp/gems/better_errors-2.1.1/lib/better_errors/raised_exception.rb:8)

Sprockets::ArgumentError - require_tree argument must be a directory:
  sprockets (3.7.0) lib/sprockets/directive_processor.rb:182:in `rescue in block in process_directives'
  sprockets (3.7.0) lib/sprockets/directive_processor.rb:179:in `block in process_directives'
  sprockets (3.7.0) lib/sprockets/directive_processor.rb:178:in `process_directives'

Je n'utilise aucun plugin d'aucune sorte. C'est une application assez simple/vanille. Le seul style provient de la valeur par défaut scaffold.scss.

Qu'est-ce qui peut causer cela?

19
marcamillion

J'ai finalement compris. Donc, parce que je fais la mise à niveau, RailsDiff ne m'a pas dit qu'il me manquait quelque chose.

Donc, le message d'erreur n'était pas incorrect, cependant, ce que j'ai oublié de faire, c'est de créer un répertoire vide.

Dans mon app/assets/javascripts/cable.js, j'avais les éléments suivants:

//= require_tree ./channels

Cependant, j'ai oublié de créer ce dossier.

Donc, pour résoudre ce problème, tout ce que je devais faire était de créer un dossier vide dans app/assets/javascripts appelé channels. De plus, parce que git ignore les répertoires vides, dans ce dossier nouvellement créé, je devais également créer un fichier vide appelé .keep.

Donc, une fois que j'ai fait ce qui suit, tout a fonctionné comme un charme:

  • Créer un dossier: app/assets/javascripts/channels
  • Créez un fichier vide dans ce dossier: app/assets/javascripts/channels/.keep

Tout fonctionne parfaitement maintenant.

44
marcamillion

Le problème survient lors de l'utilisation de l'indicateur Rails new appname --skip-keeps. Il tente toujours d'exiger des fichiers non existants et constitue généralement une erreur du côté de l'équipe Rails.

Ceci est juste une approche différente du problème décrit, la solution principale fonctionne parfaitement;

  1. Ouvrez app/assets/javascripts/cable.js
  2. Supprimer le //= require_tree ./channels généré automatiquement de la ligne 6

Gardez votre base de code aussi petite que possible, quelqu'un a ignoré le .keeps pour une raison.

1
wscourge