6

我的 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 部署在一个简单的 rack-app 中/var/www/TE/current/,所以我更愿意从/var/www/TE/current/public.

但是,自定义公共目录的设置只允许设置一个目录:

set :public_folder, File.join(Dir.pwd, "public")

中断资产服务;Dir.pwd 是 Rack 应用程序的目录。Public 现在是 Rack-app 下的目录,但这不是资产所在的位置:它们位于 gem 中的“public”下。

set :public_folder, File.join(gemdir, "public")

中断生成的缩略图的服务。

我可以重写应用程序,使其通过 Sinatra 为资产或缩略图提供服务,但这似乎有些开销。

这是唯一的方法吗?或者有没有办法给 Sinatra 两个或更多公共目录来提供其静态项目

4

1 回答 1

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

它为我提供了很好的文件。

于 2013-05-01T14:05:38.137 回答