Аргумент require_tree должен быть каталогом в обновленном приложении Rails 5

Я только что обновил свое приложение с Rails 4.2.7 до Rails 5.0.0.1. Я использовал RailsDiff, чтобы убедиться, что у меня все покрыто, и я думаю, что сделал. Пока все работало хорошо, вплоть до загрузки моего приложения.

Теперь я вижу эту ошибку:

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

Это мой 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
 */

Это мой 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 .

Вот как выглядит журнал сервера:

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'

Я не использую никаких плагинов. Это довольно простое приложение. Единственный стиль по умолчанию - scaffold.scss.

Что может быть причиной этого?


person marcamillion    schedule 02.09.2016    source источник


Ответы (4)


Я наконец-то понял. Так как я выполняю обновление, RailsDiff не сказал мне, что я чего-то упускаю.

Таким образом, сообщение об ошибке не было неправильным, однако я забыл создать пустой каталог.

В моем app/assets/javascripts/cable.js было следующее:

//= require_tree ./channels

Однако я забыл создать эту папку.

Чтобы исправить это, все, что мне нужно было сделать, это создать в app/assets/javascripts пустую папку с именем channels. Кроме того, поскольку git игнорирует пустые каталоги, внутри этой вновь созданной папки мне также пришлось создать пустой файл с именем .keep.

Итак, как только я сделал следующее, все заработало как шарм:

  • Создать папку: app/assets/javascripts/channels
  • Создайте в этой папке пустой файл: app/assets/javascripts/channels/.keep

Теперь все работает отлично.

person marcamillion    schedule 03.09.2016
comment
Все еще работаю в 2018 году - спасибо за публикацию - у меня сработало! - person Nick Schwaderer; 21.08.2018
comment
В моем случае я преобразовал звездочки javascript в webpacker и забыл удалить строку, ссылающуюся на старое местоположение javascript в app / assets / config / manifest.js - person karns; 22.10.2020
comment
Все еще работая в 2021 году, я обновлялся с Rails 4.2.11.1 до Rails 5.0.1. Спасибо за разъяснения. Ошибка в консоли была неправильной, как вы упомянули. - person alexventuraio; 22.06.2021

Проблема возникает при использовании флага rails new appname --skip-keeps - он по-прежнему пытается требовать несуществующие файлы и, как правило, является ошибкой на стороне команды Rails.

Это просто другой подход к описанной проблеме, основное решение работает отлично;

  1. Открыть app/assets/javascripts/cable.js
  2. Удалите автоматически созданный //= require_tree ./channels из строки 6

Сохраняйте кодовую базу как можно меньше, кто-то не зря пропустил .keep.

person wscourge    schedule 26.11.2018
comment
Я согласен с тем, чтобы кодовая база была как можно меньше. У меня возникла проблема, когда я обновил рельсы. - person olucube.com; 20.01.2019

Столкнулся с похожей, но не такой проблемой. При обновлении Rails с 5.2.3 до 5.2.4.1

$ rails s вернул:

Expected to find a manifest file in `app/assets/config/manifest.js` (Sprockets::Railtie::ManifestNeededError)
But did not, please create this file and use it to link any assets that need to be rendered by your app:

Example:
  //= link_tree ../images
  //= link_directory ../javascripts .js
  //= link_directory ../stylesheets .css
and restart your server

Хорошо, следовал инструкциям, создал manifest.js с указанным выше содержанием, затем

$ rails s вернул:

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

Исправить:

создать пустой .keep файл в новой images папке (которая, возможно, была удалена в какой-то момент в прошлом без каких-либо немедленных последствий):

app/assets/images/.keep

person Arta    schedule 23.01.2020

Если вы не используете ActionCable, удалите все содержимое внутри app/assets/javascripts/cable.js

person Abdullah Aden    schedule 16.06.2020