Rails7.0.5+Importmap+Tailwind部署Capistrano时Sprockets报错
Rails 7.0.5 + Importmap + Tailwind 部署资产预编译报错
Sprockets::ArgumentError: link_tree argument must be a directory 问题描述
使用Capistrano部署纯Importmap实现的Rails 7.0.5项目,项目通过--css tailwind配置TailwindCSS,开发环境运行正常,但在Ubuntu 20.04服务器执行assets:precompile时失败,抛出Sprockets::ArgumentError: link_tree argument must be a directory错误。
错误日志
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
本地环境信息
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
解决步骤
1. 检查manifest.js配置
错误指向app/assets/config/manifest.js第4行,打开该文件确认link_tree指令的目标路径。Rails 7 + Tailwind默认配置下,该文件通常包含:
//= link_tree ../images //= link_tree ../builds //= link application.css //= link application.js
确认../builds或其他link_tree指向的目录在服务器部署时是否存在。
2. 确保编译目录存在并同步
本地执行资产预编译:
rails assets:precompile执行后会生成
app/assets/builds目录,将该目录加入版本控制(比如Git),确保Capistrano部署时能同步到服务器。若不想把编译后的文件加入版本控制,可在Capistrano的
deploy.rb中添加前置任务,在预编译前创建缺失目录:before 'deploy:assets:precompile', :create_assets_builds_dir do on roles(:web) do execute "mkdir -p #{release_path}/app/assets/builds" end end
3. 重新部署验证
执行Capistrano部署命令,确认资产预编译步骤不再报错。
内容的提问来源于stack exchange,提问作者acoustic_north
相关产品推荐
相关产品推荐

