我假设你是在这么做:
<%= stylesheet_link_tag 'fontawesome/all.min.css' %>
vendor/
└── assets/ # <= this one is important
└── stylesheets/
└── fontawesome/
└── all.min.css
vendor/assets
和app/assets
中的目录会自动添加到资源路径.以下是链轮用于查找资源的路径:
>> puts Rails.application.config.assets.paths
...
/myapp/app/assets/stylesheets
/myapp/vendor/assets/stylesheets # <=
/usr/local/bundle/gems/coffee-rails-4.2.2/lib/assets/javascripts
/usr/local/bundle/gems/actioncable-5.2.8.1/lib/assets/compiled
...
你有config.assets.compile = false
个,这意味着链轮已经完成了在资源路径中的查找和动态编译.它现在预计public/assets
年会有预编译的assets资源 :
# assuming sprockets is still serving files (but not compiling them anymore)
>> Rails.application.config.public_file_server.enabled
=> true
>> Rails.application.config.assets.compile
=> false
>> helper.asset_path("fontawesome/all.min.css")
Traceback (most recent call last):
1: from (irb):5
Sprockets::Rails::Helper::AssetNotFound (The asset "fontawesome/all.min.css" is not present in the asset pipeline.)
你必须做到bin/rails assets:precompile
:
# config/initializers/assets.rb
# but make it precompilable first
Rails.application.config.assets.precompile += ["fontawesome/all.min.css"]
$ bin/rails assets:precompile
I, [2023-09-10T10:04:24.038220 #1] INFO -- : Writing /myapp/public/assets/fontawesome/all.min-1f62e82d4d0217052a8d48596d631f5c58ee5149386c719419046118e4fa43f3.css
...
现在应该可以工作了:
>> helper.asset_path("fontawesome/all.min.css")
=> "/assets/fontawesome/all.min-1f62e82d4d0217052a8d48596d631f5c58ee5149386c719419046118e4fa43f3.css"
# check if it is being served
>> require "open-uri"
>> URI.open(helper.asset_path("fontawesome/all.min.css", host: "http://localhost:3000")).read
=> "i am font\n"
100
Update个
要批量处理文件,有两种 Select .添加将动态匹配资源以进行预编译的过程:
# config/initializers/assets.rb
VENDOR_ASSETS = lambda do |logical_path, filename|
filename.start_with?(::Rails.root.join("vendor/assets/").to_s) &&
[".css", ".js"].include?(File.extname(logical_path))
end
Rails.application.config.assets.precompile += [VENDOR_ASSETS]
100
更好的 Select 是使用manifest.js
,这是更高版本中的默认设置:
# config/initializers/assets.rb
# don't need this in sprockets v4
Rails.application.config.assets.precompile += ["manifest.js"]
// app/assets/config/manifest.js
//= link_tree ../images
//= link_directory ../javascripts .js
//= link_directory ../stylesheets .css
//
// link everything to be precompiled
//= link_tree ../../../vendor/assets/stylesheets .css
//= link_tree ../../../vendor/assets/javascripts .js
//
// or one file at a time
//= link fontawesome/all.min.css
100
此外,当您预编译assets资源 时,这意味着您希望通过URL直接加载它们.如果只使用//= require
条指令,则不需要预编译所需的文件,因为它们会合并到预编译的文件中.你只会得到一个很大的application.css
文件:
/* app/assets/stylesheets/application.css */
/*
*= require_tree .
*= require_self
*= require fontawesome/all.min
*/
如果您要在本地预编译以进行测试,请不要在完成后忘记使用bin/rails assets:clobber
,您不希望在开发中使用预编译assets资源 .