web-dev-qa-db-ger.com

das required_tree-Argument muss ein Verzeichnis in einer mit Rails 5 aktualisierten App sein

Ich habe gerade meine App von Rails 4.2.7 auf Rails 5.0.0.1 aktualisiert. Ich habe RailsDiff verwendet, um sicherzustellen, dass alles abgedeckt ist und ich glaube, ich habe es getan. Bis zum Laden meiner App hat alles gut funktioniert. 

Jetzt sehe ich diesen Fehler:

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

Dies ist mein 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
 */

Dies ist mein 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 .

So sieht das Serverprotokoll aus:

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/[email protected]/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'

Ich verwende keinerlei Plugins. Es ist eine ziemlich einfache/Vanilla-App. Das einzige Styling stammt vom Standardcode scaffold.scss.

Was könnte das verursachen?

19
marcamillion

Ich habe es endlich herausgefunden. Weil ich das Upgrade durchführe, sagte mir RailsDiff nicht, dass mir etwas fehlte.

Die Fehlermeldung war also nicht falsch, aber ich habe vergessen, ein leeres Verzeichnis anzulegen.

In meinem app/assets/javascripts/cable.js hatte ich Folgendes:

//= require_tree ./channels

Ich habe jedoch vergessen, diesen Ordner zu erstellen.

Um dies zu beheben, musste ich lediglich einen leeren Ordner mit dem Namen channels in app/assets/javascripts erstellen. Da git leere Verzeichnisse in diesem neu erstellten Ordner ignoriert, musste ich auch eine leere Datei mit dem Namen .keep erstellen.

Nachdem ich folgendes getan hatte, funktionierte alles wie ein Zauber:

  • Ordner erstellen: app/assets/javascripts/channels
  • Erstellen Sie eine leere Datei in diesem Ordner: app/assets/javascripts/channels/.keep

Jetzt funktioniert alles perfekt.

44
marcamillion

Das Problem tritt auf, wenn das Flag Rails new appname --skip-keeps verwendet wird. Es wird weiterhin versucht, nicht vorhandene Dateien anzufordern. Dies ist im Allgemeinen ein Fehler auf der Rails-Team-Seite.

Dies ist nur ein anderer Ansatz für das beschriebene Problem. Die Hauptlösung funktioniert einwandfrei.

  1. app/assets/javascripts/cable.js öffnen
  2. Entfernen Sie den automatisch generierten //= require_tree ./channels aus Zeile 6

Halten Sie Ihre Codebase so klein wie möglich, jemand hat die .keeps aus einem bestimmten Grund übersprungen.

1
wscourge