如何将资产编译到图像、样式表和 javascript 目录中?
How can I have assets compiled into image, stylesheet, and javascript directories?
资产管道将所有内容放入同一目录。图像、样式表和 javascript 都进入 /public/assets(尽管子目录受到尊重)。
有没有办法将它们复制到 /public/assets/images、public/assets/stylesheets 和 public/assets/javascripts 中?
更令人困惑的是 rails 指南中的这一行:
http://guides.rubyonrails.org/asset_pipeline.html#coding-links-to-assets
In regular views you can access images in the public/assets/images directory like this:
但是 rails 不使用或创建 public/assets/images 目录。
解决方案 #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"]
正在返回
资产文件夹中的所有子目录,因此为什么没有
public/assets
文件夹中的子目录,当 Sprocket 计算其摘要时
资产。
为了重新添加那些子目录,我们必须修改当前的
Rails Sprockets 的配置环境; IE。
Rails.application.config.configure
。但是,Sprockets::Paths
即
包含在 Sprockets::Configuration
中
Rails.application.config.configure
屈服于不允许 public 访问
它的内部 @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
我希望这些解决方案对您有所帮助。
资产管道将所有内容放入同一目录。图像、样式表和 javascript 都进入 /public/assets(尽管子目录受到尊重)。
有没有办法将它们复制到 /public/assets/images、public/assets/stylesheets 和 public/assets/javascripts 中?
更令人困惑的是 rails 指南中的这一行:
http://guides.rubyonrails.org/asset_pipeline.html#coding-links-to-assets
In regular views you can access images in the public/assets/images directory like this:
但是 rails 不使用或创建 public/assets/images 目录。
解决方案 #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"]
正在返回
资产文件夹中的所有子目录,因此为什么没有
public/assets
文件夹中的子目录,当 Sprocket 计算其摘要时
资产。
为了重新添加那些子目录,我们必须修改当前的
Rails Sprockets 的配置环境; IE。
Rails.application.config.configure
。但是,Sprockets::Paths
即
包含在 Sprockets::Configuration
中
Rails.application.config.configure
屈服于不允许 public 访问
它的内部 @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
我希望这些解决方案对您有所帮助。