You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rails7.0.5+Importmap+Tailwind部署Capistrano时Sprockets报错

问题描述

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 20:17:01