Ruby版本升级遭遇Asset Pipeline配置错误求助
问题背景与报错信息
正在将Ruby版本从2.7.6升级至3.2.2,应用基于Rails 6.1.3 + Webpacker 6.0.0,暂计划后续升级Rails时再替换已弃用的Webpacker,当前遇到两处配置问题:
现有配置文件
app/assets/config/manifest.js内容:
//= link_tree ../images //= link_directory ../javascripts .js //= link_directory ../stylesheets .css //= link_tree ../builds
报错1:测试用例执行失败
Failure/Error: <%= stylesheet_pack_tag 'application', media: 'all', 'data-turbo-track': 'reload' %> ActionView::Template::Error: Webpacker can't find application.css in /Users/.../public/packs-test/manifest.json. Possible causes: 1. You want to set webpacker.yml value of compile to true for your environment unless you are using the `webpack -w` or the webpack-dev-server. 2. webpack has not yet re-run to reflect updates. 3. You have misconfigured Webpacker's config/webpacker.yml file. 4. Your webpack configuration is not creating a manifest. Your manifest contains: { "application.js": "/packs-test/js/application-5019ada8c79f4945bc85.js", "application.js.map": "/packs-test/js/application-5019ada8c79f4945bc85.js.map", "entrypoints": { "application": { "js": [ "/packs-test/js/application-5019ada8c79f4945bc85.js" ], "js.map": [ "/packs-test/js/application-5019ada8c79f4945bc85.js.map" ] } }, "vendors~actioncable.js": "/packs-test/js/vendors~actioncable-111339b91a6898730a91.chunk.js", "vendors~actioncable.js.map": "/packs-test/js/vendors~actioncable-111339b91a6898730a91.chunk.js.map" }
报错2:资产预编译失败
Sprockets::DoubleLinkError: Multiple files with the same output path cannot be linked ("tailwind.css") In "/Users/.../app/assets/config/manifest.js" these files were linked: - /Users/.../app/assets/stylesheets/tailwind.css - /Users/.../app/assets/builds/tailwind.css
解决方案
1. 修复stylesheet_pack_tag找不到application.css的问题
Webpacker 6默认将CSS嵌入到JavaScript文件中,不再单独输出.css文件,因此manifest里不会生成application.css条目。
可选修复方式:
- 方式1:改用
javascript_pack_tag加载:模板中替换stylesheet_pack_tag为javascript_pack_tag,它会自动处理嵌入的CSS:<%= javascript_pack_tag 'application', media: 'all', 'data-turbo-track': 'reload' %> - 方式2:重新启用CSS提取:修改
config/webpack/environment.js,配置CSS提取插件,确保Webpack单独输出CSS文件。示例配置:
同时确保const { environment } = require('@rails/webpacker') const MiniCssExtractPlugin = require('mini-css-extract-plugin') environment.plugins.append('MiniCssExtractPlugin', new MiniCssExtractPlugin({ filename: '[name].[contenthash].css' })) module.exports = environmentconfig/webpacker.yml中对应环境的extract_css设置为true。
2. 修复Sprockets::DoubleLinkError重复链接问题
问题源于manifest.js同时链接了app/assets/stylesheets和app/assets/builds目录,而tailwind.css同时存在于这两个目录(原文件在stylesheets,Webpack编译后输出到builds),导致Sprockets检测到重复输出路径。
修复方式:修改app/assets/config/manifest.js,移除重复的链接规则。根据你的资产处理逻辑二选一:
- 如果Webpack负责编译所有CSS(包括tailwind),则移除stylesheets目录的链接:
//= link_tree ../images //= link_directory ../javascripts .js //= link_tree ../builds - 如果Sprockets负责处理stylesheets,限制builds目录只链接JS文件:
//= link_tree ../images //= link_directory ../javascripts .js //= link_directory ../stylesheets .css //= link_tree ../builds .js
内容的提问来源于stack exchange,提问作者dxpo
相关产品推荐
相关产品推荐

