I am trying to figure out why I am getting this message Sprockets::ArgumentError: link_tree argument must be a directory. This is a minty fresh Rails 7.0.5 installation configured with Tailwindcss (using the --css tailwind option) that runs fine in development environment, but when I try to deploy using Capistrano it fails at when precompiling the assets on my Ubuntu 20.04 server. Here's a relevant portion of the console output:

00:26 deploy:assets:precompile
  01 $HOME/.rbenv/bin/rbenv exec bundle exec rake assets:precompile
  01
  01 Rebuilding...
  01
  01 Done in 1073ms.
  01 rake aborted!
  01 Sprockets::ArgumentError: link_tree argument must be a directory
  01 /var/www/ai_demo/releases/20230524232929/app/assets/config/manifest.js:4
  01 /var/www/ai_demo/shared/bundle/ruby/3.1.0/gems/sprockets-4.2.0/lib/sprockets/directive_processor.rb:407:…
  01 /var/www/ai_demo/shared/bundle/ruby/3.1.0/gems/sprockets-4.2.0/lib/sprockets/directive_processor.rb:359:…
  01 /var/www/ai_demo/shared/bundle/ruby/3.1.0/gems/sprockets-4.2.0/lib/sprockets/directive_processor.rb:189:…
  01 /var/www/ai_demo/shared/bundle/ruby/3.1.0/gems/sprockets-4.2.0/lib/sprockets/directive_processor.rb:187:…
  01 /var/www/ai_demo/shared/bundle/ruby/3.1.0/gems/sprockets-4.2.0/lib/sprockets/directive_processor.rb:187:…
  01 /var/www/ai_demo/shared/bundle/ruby/3.1.0/gems/sprockets-4.2.0/lib/sprockets/directive_processor.rb:84:i…
  01 /var/www/ai_demo/shared/bundle/ruby/3.1.0/gems/sprockets-4.2.0/lib/sprockets/directive_processor.rb:65:i…
  01 /var/www/ai_demo/shared/bundle/ruby/3.1.0/gems/sprockets-4.2.0/lib/sprockets/processor_utils.rb:84:in `c…
  01 /var/www/ai_demo/shared/bundle/ruby/3.1.0/gems/sprockets-4.2.0/lib/sprockets/processor_utils.rb:66:in `b…
  01 /var/www/ai_demo/shared/bundle/ruby/3.1.0/gems/sprockets-4.2.0/lib/sprockets/processor_utils.rb:65:in `r…
  01 /var/www/ai_demo/shared/bundle/ruby/3.1.0/gems/sprockets-4.2.0/lib/sprockets/processor_utils.rb:65:in `c…
  01 /var/www/ai_demo/shared/bundle/ruby/3.1.0/gems/sprockets-4.2.0/lib/sprockets/loader.rb:182:in `load_from…
  01 /var/www/ai_demo/shared/bundle/ruby/3.1.0/gems/sprockets-4.2.0/lib/sprockets/loader.rb:59:in `block in l…
  01 /var/www/ai_demo/shared/bundle/ruby/3.1.0/gems/sprockets-4.2.0/lib/sprockets/loader.rb:337:in `fetch_ass…
  01 /var/www/ai_demo/shared/bundle/ruby/3.1.0/gems/sprockets-4.2.0/lib/sprockets/loader.rb:43:in `load'
  01 /var/www/ai_demo/shared/bundle/ruby/3.1.0/gems/sprockets-4.2.0/lib/sprockets/cached_environment.rb:44:in…
  01 /var/www/ai_demo/shared/bundle/ruby/3.1.0/gems/concurrent-ruby-1.2.2/lib/concurrent-ruby/concurrent/map.…
  01 /var/www/ai_demo/shared/bundle/ruby/3.1.0/gems/concurrent-ruby-1.2.2/lib/concurrent-ruby/concurrent/map.…
  01 /var/www/ai_demo/shared/bundle/ruby/3.1.0/gems/concurrent-ruby-1.2.2/lib/concurrent-ruby/concurrent/map.…
  01 /var/www/ai_demo/shared/bundle/ruby/3.1.0/gems/sprockets-4.2.0/lib/sprockets/cached_environment.rb:44:in…
  01 /var/www/ai_demo/shared/bundle/ruby/3.1.0/gems/sprockets-4.2.0/lib/sprockets/bundle.rb:27:in `call'
  01 /var/www/ai_demo/shared/bundle/ruby/3.1.0/gems/sprockets-4.2.0/lib/sprockets/processor_utils.rb:84:in `c…
  01 /var/www/ai_demo/shared/bundle/ruby/3.1.0/gems/sprockets-4.2.0/lib/sprockets/processor_utils.rb:66:in `b…
  01 /var/www/ai_demo/shared/bundle/ruby/3.1.0/gems/sprockets-4.2.0/lib/sprockets/processor_utils.rb:65:in `r…
  01 /var/www/ai_demo/shared/bundle/ruby/3.1.0/gems/sprockets-4.2.0/lib/sprockets/processor_utils.rb:65:in `c…
  01 /var/www/ai_demo/shared/bundle/ruby/3.1.0/gems/sprockets-4.2.0/lib/sprockets/loader.rb:182:in `load_from…
  01 /var/www/ai_demo/shared/bundle/ruby/3.1.0/gems/sprockets-4.2.0/lib/sprockets/loader.rb:59:in `block in l…
  01 /var/www/ai_demo/shared/bundle/ruby/3.1.0/gems/sprockets-4.2.0/lib/sprockets/loader.rb:337:in `fetch_ass…
  01 /var/www/ai_demo/shared/bundle/ruby/3.1.0/gems/sprockets-4.2.0/lib/sprockets/loader.rb:43:in `load'
  01 /var/www/ai_demo/shared/bundle/ruby/3.1.0/gems/sprockets-4.2.0/lib/sprockets/cached_environment.rb:44:in…
  01 /var/www/ai_demo/shared/bundle/ruby/3.1.0/gems/concurrent-ruby-1.2.2/lib/concurrent-ruby/concurrent/map.…
  01 /var/www/ai_demo/shared/bundle/ruby/3.1.0/gems/concurrent-ruby-1.2.2/lib/concurrent-ruby/concurrent/map.…
  01 /var/www/ai_demo/shared/bundle/ruby/3.1.0/gems/concurrent-ruby-1.2.2/lib/concurrent-ruby/concurrent/map.…
  01 /var/www/ai_demo/shared/bundle/ruby/3.1.0/gems/sprockets-4.2.0/lib/sprockets/cached_environment.rb:44:in…
  01 /var/www/ai_demo/shared/bundle/ruby/3.1.0/gems/sprockets-4.2.0/lib/sprockets/base.rb:81:in `find_asset'
  01 /var/www/ai_demo/shared/bundle/ruby/3.1.0/gems/sprockets-4.2.0/lib/sprockets/base.rb:88:in `find_all_lin…
  01 /var/www/ai_demo/shared/bundle/ruby/3.1.0/gems/sprockets-4.2.0/lib/sprockets/manifest.rb:125:in `each'
  01 /var/www/ai_demo/shared/bundle/ruby/3.1.0/gems/sprockets-4.2.0/lib/sprockets/manifest.rb:125:in `to_a'
  01 /var/www/ai_demo/shared/bundle/ruby/3.1.0/gems/sprockets-4.2.0/lib/sprockets/manifest.rb:125:in `block (…
  01 /var/www/ai_demo/shared/bundle/ruby/3.1.0/gems/concurrent-ruby-1.2.2/lib/concurrent-ruby/concurrent/exec…
  01 /var/www/ai_demo/shared/bundle/ruby/3.1.0/gems/concurrent-ruby-1.2.2/lib/concurrent-ruby/concurrent/sync…
  01 /var/www/ai_demo/shared/bundle/ruby/3.1.0/gems/concurrent-ruby-1.2.2/lib/concurrent-ruby/concurrent/sync…
  01 /var/www/ai_demo/shared/bundle/ruby/3.1.0/gems/concurrent-ruby-1.2.2/lib/concurrent-ruby/concurrent/sync…
  01 /var/www/ai_demo/shared/bundle/ruby/3.1.0/gems/concurrent-ruby-1.2.2/lib/concurrent-ruby/concurrent/exec…
  01 /var/www/ai_demo/shared/bundle/ruby/3.1.0/gems/concurrent-ruby-1.2.2/lib/concurrent-ruby/concurrent/prom…
  01 /var/www/ai_demo/shared/bundle/ruby/3.1.0/gems/concurrent-ruby-1.2.2/lib/concurrent-ruby/concurrent/exec…
  01 /var/www/ai_demo/shared/bundle/ruby/3.1.0/gems/concurrent-ruby-1.2.2/lib/concurrent-ruby/concurrent/exec…
  01 /var/www/ai_demo/shared/bundle/ruby/3.1.0/gems/concurrent-ruby-1.2.2/lib/concurrent-ruby/concurrent/exec…
  01 /var/www/ai_demo/shared/bundle/ruby/3.1.0/gems/concurrent-ruby-1.2.2/lib/concurrent-ruby/concurrent/exec…
  01 /var/www/ai_demo/shared/bundle/ruby/3.1.0/gems/concurrent-ruby-1.2.2/lib/concurrent-ruby/concurrent/exec…
  01 /var/www/ai_demo/shared/bundle/ruby/3.1.0/gems/concurrent-ruby-1.2.2/lib/concurrent-ruby/concurrent/exec…
  01 Tasks: TOP => assets:precompile

This is my rails environment:

Rails version             7.0.5
Ruby version              ruby 3.1.2p20 (2022-04-12 revision 4491bb740a) [arm64-darwin22]
RubyGems version          3.3.7
Rack version              2.2.7
Middleware                ActionDispatch::HostAuthorization, Rack::Sendfile, ActionDispatch::Static, ActionDispatch::Executor, ActionDispatch::ServerTiming, ActiveSupport::Cache::Strategy::LocalCache::Middleware, Rack::Runtime, Rack::MethodOverride, ActionDispatch::RequestId, ActionDispatch::RemoteIp, Sprockets::Rails::QuietAssets, Rails::Rack::Logger, ActionDispatch::ShowExceptions, WebConsole::Middleware, ActionDispatch::DebugExceptions, ActionDispatch::ActionableExceptions, ActionDispatch::Reloader, ActionDispatch::Callbacks, ActiveRecord::Migration::CheckPending, ActionDispatch::Cookies, ActionDispatch::Session::CookieStore, ActionDispatch::Flash, ActionDispatch::ContentSecurityPolicy::Middleware, ActionDispatch::PermissionsPolicy::Middleware, Rack::Head, Rack::ConditionalGet, Rack::ETag, Rack::TempfileReaper
Application root          /Users/scervera/app_dev_local/rails_projects/AiDemo
Environment               development
Database adapter          postgresql
Database schema version   0
3

There are 3 best solutions below

1
acoustic_north On

I was able to clear the errors by removing this line from my manifest.js file in /app/assets/config/manifest.js

//= link_tree ../../../vendor/javascript .js

I'm not yet sure how that will bite me down the road.

UPDATE: I had to add this line back in for the tailwindcss_rails gem's javascript to function. Makes sense.

0
Nikolay Sidorov On

You can modify you're deploy.rb and add "vendor/javascript" to :linked_dirs

0
Md. Mahmudur Rahman On

In your deploy.rb, add the "vendor/javascript" directory as link directory(not just "vendor"):

For example:

append :linked_dirs, "log", "tmp/pids", "tmp/cache", "vendor/javascript", "tmp/sockets", "public/system", "storage"

I hope this could solve the problem.