我的sinatra应用程序包含在宝石中。这意味着资产(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")
打破资产服务; Dir.pwd是Rack应用程序的目录。公众现在是Rack-app下的目录,但这不是资产所在的地方:他们生活在宝石的“公共”之下。
set :public_folder, File.join(gemdir, "public")
中断生成的缩略图的服务。
我可以重写应用程序,因此它通过Sinatra服务资产或缩略图,但这似乎是一些开销。
这是唯一的方法吗?或者有没有办法让Sinatra有两个或更多公共目的地来自serve its static items?
答案 0 :(得分:3)
我认为可能有一些选项,但是这里有一个小应用程序来从两个地方提供静态文件,扩展名和主应用程序的公共文件夹:
root/
app.rb
public/images/foo.jpg
lib/sinatra/
gemapp.rb
gemapp/public/images/bar.jpg
# lib/sinatra/gemapp.rb
module Sinatra
module GemApp
def self.registered(app)
app.set :gem_images, File.expand_path( "gemapp/public/images", File.dirname(__FILE__))
app.get "/images/:file" do |file|
send_file File.join( settings.gem_images, file)
end
app.get "/gemapp" do
"running"
end
end
end
register GemApp
end
require 'sinatra'
require_relative "./lib/sinatra/gemapp.rb"
get "/" do
"home"
end
它为我提供的文件很好。