解决方案 #1:
在app/assets/ 中创建一个新的子目录,如all 并移动
当前资产目录到新文件夹中;例如
mkdir -p app/assets/all
mv app/assets/{javascripts,images,stylesheets} app/assets/all/
然后在使用RAILS_ENV=production rails assets:precompile 预编译资产时
它应该创建那些javascripts、images 和stylesheets 目录
在public/assets 目录下;
public/assets/javascripts
public/assets/images
public/assets/stylesheets
解决方案 #2:
您可以在项目的其他地方创建一个新目录;喜欢assets,
而不是app/assets;并将新目录添加到当前 Rails
assets.rb 初始化器中的资产路径配置
# app/config/initializers/assets.rb
Rails.application.config.assets.paths << Rails.application.root.join("assets")
那么预编译资产应该具有与解决方案#1相同的效果。
解决方案 #3
因此,作为 Sprocket-Rails 引擎的一部分,它会预加载 app/assets
具有以下代码块的子目录:
# ~/ruby/gems/2.3.0/gems/sprockets-rails-3.2.0/lib/sprockets/railtie.rb:54
module Rails
# [...]
class Engine < Railtie
# Skip defining append_assets_path on Rails <= 4.2
unless initializers.find { |init| init.name == :append_assets_path }
initializer :append_assets_path, :group => :all do |app|
app.config.assets.paths.unshift(*paths["vendor/assets"].existent_directories)
app.config.assets.paths.unshift(*paths["lib/assets"].existent_directories)
app.config.assets.paths.unshift(*paths["app/assets"].existent_directories)
end
end
end
end
感兴趣的线是
app.config.assets.paths.unshift(*paths["app/assets"].existent_directories)
它调用existent_directories 关闭*paths["app/assets"] 正在返回
资产文件夹中的所有子目录,因此为什么没有
当 Sprocket 计算其摘要时,public/assets 文件夹中的子目录
资产。
为了重新添加这些子目录,我们必须修改当前
链轮的 Rails 配置环境; IE。
Rails.application.config.configure。但是,Sprockets::Paths 是
包含在Sprockets::Configuration 中
Rails.application.config.configure 产生不允许公共访问
它的内部@paths 变量,也没有删除路径之类的方法
它确实通过其append_paths 添加路径。相反,我们必须复制
当前路径已包含在上述 Railtie 初始化程序块中,删除
我们不想要的旧的"app/assets" 子目录路径,只需添加
"app/assets" 我们确实想要的目录,然后将它们附加回配置的
链轮环境;在 Rails 初始化程序中看起来像这样:
# app/config/initializers/assets.rb
Rails.application.config.assets.configure do |env|
old_paths = env.paths.dup
new_paths = old_paths - Rails.application.paths["app/assets"].existent_directories
new_paths << Rails.application.root.join("app", "assets")
env.clear_paths
new_paths.each { |path| env.append_path(path) }
end
结束评论
使用任何这些解决方案也意味着您需要在所有您的
asset_path 在视图模板中调用方法以找到
编译资产;例如
<%= asset_path "images/example.png" %>
<%= asset_path "javascripts/application.js" %>
<%= asset_path "stylesheets/application.css" %>
/assets/images/example-ca63e56ac855bdfb187479a35a7476cd65c539727f84fea19e1ad258cf3d23f5.png
/assets/javascripts/application-a4f3e75c7f7aa6d6cbc2ebcbb436b12aca442553219883805baebdd2eecd5471.js
/assets/stylesheets/application-539757f75200b6ea43399bf5e25cbc2819c1e6a610f94d5c9beaf91fec89384e.css
我希望这些解决方案能有所帮助。