require_tree 参数必须是 Rails 5 升级应用程序中的目录

require_tree argument must be a directory in a Rails 5 upgraded app

我刚刚将我的应用程序从 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" =  ORDER BY "users"."id" ASC LIMIT   [["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'

我没有使用任何类型的插件。这是一个相当 simple/vanilla 的应用程序。唯一的样式来自默认 scaffold.scss.

可能是什么原因造成的?

我终于明白了。所以因为我正在进行升级,RailsDiff 没有告诉我我遗漏了什么。

所以错误信息并没有错,但是,我忘记做的是创建一个空目录。

在我的 app/assets/javascripts/cable.js 中,我有以下内容:

//= require_tree ./channels

但是,我忘记实际创建那个文件夹了。

所以要解决这个问题,我所要做的就是在 app/assets/javascripts 中创建一个名为 channels 的空文件夹。另外,因为 git 忽略了空目录,所以在新创建的文件夹中,我还必须创建一个名为 .keep.

的空文件

因此,一旦我执行了以下操作,一切都非常顺利:

  • 创建文件夹:app/assets/javascripts/channels
  • 在该文件夹中创建空文件:app/assets/javascripts/channels/.keep

现在一切正常。

使用 rails new appname --skip-keeps 标志时会出现问题 - 它仍然会尝试要求不存在的文件并且通常是 Rails 团队方面的错误。

这只是针对所描述问题的另一种方法,主要解决方案非常有效;

  1. 打开app/assets/javascripts/cable.js
  2. 从第 6 行删除自动生成的 //= require_tree ./channels

让您的代码库尽可能小,有人出于某种原因跳过了 .keep

遇到了类似但不相同的问题。 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

修复:

在新的 images 文件夹中创建空的 .keep 文件(可能在过去的某个时候被删除,没有任何直接后果):

app/assets/images/.keep

如果您没有使用 ActionCable 然后删除了 app/assets/javascripts/cable.js

中的所有内容