ber*_*kes 6 assets public sinatra
我的sinatra应用程序包含在gem中.这意味着资产(css/js)存在于gem中.该应用程序动态写入生成的图像并为其提供服务; 目前正在写入公共目录并为其提供服务.
我更喜欢不在gem目录中编写生成的图像,而是在实现此gem的web应用程序下编写某些类型的"缓存"目录.
Gem安装在/var/www/TE/shared/gems/ruby/1.8/gems/tubemp-0.6.0,所以资产是在例如/var/www/TE/shared/gems/ruby/1.8/gems/tubemp-0.6.0/lib/public/css/.
Gem部署在一个简单的机架应用程序中/var/www/TE/current/,所以我更愿意编写和提供缩略图/var/www/TE/current/public.
但是,自定义public-dir的设置只允许设置一个目录:
set :public_folder, File.join(Dir.pwd, "public")
Run Code Online (Sandbox Code Playgroud)
打破资产服务; Dir.pwd是Rack应用程序的目录.公共现在是Rack-app下的目录,但这不是资产所在的地方:它们生活在宝石中的"公共"之下.
set :public_folder, File.join(gemdir, "public")
Run Code Online (Sandbox Code Playgroud)
中断生成的缩略图的服务.
我可以重写应用程序,因此它通过Sinatra服务资产或缩略图,但这似乎是一些开销.
这是唯一的方法吗?或者有没有办法让Sinatra有两个或更多公共目的地来提供静态物品?
我认为可能有几个选项,但以下是我如何让一个小应用程序从两个位置(扩展程序和主应用程序的公共文件夹)提供静态文件:
\n\nroot/\n app.rb\n public/images/foo.jpg\n lib/sinatra/\n gemapp.rb\n gemapp/public/images/bar.jpg\nRun Code Online (Sandbox Code Playgroud)\n\n# lib/sinatra/gemapp.rb\nmodule Sinatra\n module GemApp\n def self.registered(app)\n\n app.set :gem_images, File.expand_path( "gemapp/public/images", File.dirname(__FILE__))\n\n app.get "/images/:file" do |file|\n send_file File.join( settings.gem_images, file)\n end\n\n app.get "/gemapp" do\n "running"\n end\n end\n end\n register GemApp\nend\nRun Code Online (Sandbox Code Playgroud)\n\nrequire \'sinatra\'\n\nrequire_relative "./lib/sinatra/gemapp.rb"\n\nget "/" do\n "home"\nend\nRun Code Online (Sandbox Code Playgroud)\n\n它对我来说文件服务很好。
\n