【问题标题】:How can I have assets compiled into image, stylesheet, and javascript directories?如何将资产编译到图像、样式表和 javascript 目录中?
【发布时间】:2017-08-02 02:23:26
【问题描述】:

资产管道将所有内容放在同一个目录中。图像、样式表和 javascript 都进入 /public/assets(尽管子目录受到尊重)。

有没有办法将它们复制到 /public/assets/images、public/assets/stylesheets 和 public/assets/javascripts 中?

更令人困惑的是 rails 指南中的这一行:

http://guides.rubyonrails.org/asset_pipeline.html#coding-links-to-assets

在常规视图中,您可以像这样访问 public/assets/images 目录中的图像:

但 rails 不使用或创建 public/assets/images 目录。

【问题讨论】:

  • 你试过precompiling the assets吗? RAILS_ENV=production bin/rails assets:precompileapp/assets 中的文件随后应出现在公共资产目录中,其文件名后缀为 md5hash 指纹,以帮助在客户端浏览器中过期/替换下载的资产,以备将来更改。跨度>
  • @sonna:如果你对此有信心,你应该发布一个正确的答案。
  • 我不确定他们是否要更改输出目录;这样它的public/images/example.png 而不是public/example.png;或者如果他们只是试图在开发中预编译资产,因为 public/assets/images 将不存在,除非资产是多个子目录,如 app/assets/images/images/example.png 或 app/assets/all/images/example.png 以在 Rails 中解析 Sprockets logical_path。
  • @sonna 我想更改资产在生产中编译到的目录,以便图像、字体、样式表和 javascript 都在子目录中

标签: ruby-on-rails asset-pipeline


【解决方案1】:

解决方案 #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

我希望这些解决方案能有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-28
    • 1970-01-01
    • 2011-01-09
    • 1970-01-01
    • 2013-12-27
    • 2014-08-18
    相关资源
    最近更新 更多