在Sinatra中使用多个公共目录

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有两个或更多公共目的地来提供静态物品

iai*_*ain 3

我认为可能有几个选项,但以下是我如何让一个小应用程序从两个位置(扩展程序和主应用程序的公共文件夹)提供静态文件:

\n\n

目录布局

\n\n
root/\n  app.rb\n  public/images/foo.jpg\n  lib/sinatra/\n       gemapp.rb\n       gemapp/public/images/bar.jpg\n
Run Code Online (Sandbox Code Playgroud)\n\n

扩展名\xc2\xa0

\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\n
Run Code Online (Sandbox Code Playgroud)\n\n

主要应用程序

\n\n
require \'sinatra\'\n\nrequire_relative "./lib/sinatra/gemapp.rb"\n\nget "/" do\n  "home"\nend\n
Run Code Online (Sandbox Code Playgroud)\n\n

它对我来说文件服务很好。

\n