programing

여러 파일을 통해 더 큰 프로젝트에 Sinatra 사용

abcjava 2023. 5. 31. 14:03
반응형

여러 파일을 통해 더 큰 프로젝트에 Sinatra 사용

Sinatra에서는 모든 경로 핸들러가 하나의 파일로 작성되는 것 같습니다. 제가 제대로 이해한다면 하나의 크고 작은 컨트롤러 역할을 합니다.별도의 독립 파일로 분할할 수 있는 방법이 없을까요? 그래서 누군가가 "/"를 부른다고 가정하면 - 하나의 동작이 실행되고 "/posts/2"와 같은 것이 수신되면 다른 동작 - 유사한 논리가 PHP에 적용됩니다.

여기 제가 사용하는 Sinatra 앱을 위한 기본 템플릿이 있습니다. (제가 운영하는 대형 앱에는 벤더의 보석을 제외하고 200개 이상의 파일이 있습니다. 75-100개의 명시적 경로를 포함합니다.이러한 경로 중 일부는 추가적인 50개 이상의 경로 패턴을 포함하는 Regexp 경로입니다.)사용하여 합니다.
thin -R config.ru start

편집: 저는 현재 아래의 리브리츠를 기반으로 만의 몽크 스켈레톤을 유지하고 있습니다.이를 사용하여 내 템플릿을 자신의 프로젝트의 기초로 복사하려면 다음과 같이 하십시오.

# Before creating your project
monk add riblits git://github.com/Phrogz/riblits.git

# Inside your empty project directory
monk init -s riblits

파일 레이아웃:

config.ru앱.스캐너도우미/init.dll부분 s.s.모델/init.dlluser.sys경로/init.dlllogin.sys본대의뷰/레이아웃.햄로그 인.햄을메인 햄

 
config.ru

root = ::File.dirname(__FILE__)
require ::File.join( root, 'app' )
run MyApp.new

 
앱.스캐너

# encoding: utf-8
require 'sinatra'
require 'haml'

class MyApp < Sinatra::Application
  enable :sessions

  configure :production do
    set :haml, { :ugly=>true }
    set :clean_trace, true
  end

  configure :development do
    # ...
  end

  helpers do
    include Rack::Utils
    alias_method :h, :escape_html
  end
end

require_relative 'models/init'
require_relative 'helpers/init'
require_relative 'routes/init'

 
조력자들/init.milit.

# encoding: utf-8
require_relative 'partials'
MyApp.helpers PartialPartials

require_relative 'nicebytes'
MyApp.helpers NiceBytes

 
도움을 주는 사람들/보조원들

# encoding: utf-8
module PartialPartials
  def spoof_request(uri,env_modifications={})
    call(env.merge("PATH_INFO" => uri).merge(env_modifications)).last.join
  end

  def partial( page, variables={} )
    haml page, {layout:false}, variables
  end
end

 
도우미/큐바이트 수

# encoding: utf-8
module NiceBytes
  K = 2.0**10
  M = 2.0**20
  G = 2.0**30
  T = 2.0**40
  def nice_bytes( bytes, max_digits=3 )
    value, suffix, precision = case bytes
      when 0...K
        [ bytes, 'B', 0 ]
      else
        value, suffix = case bytes
          when K...M then [ bytes / K, 'kiB' ]
          when M...G then [ bytes / M, 'MiB' ]
          when G...T then [ bytes / G, 'GiB' ]
          else            [ bytes / T, 'TiB' ]
        end
        used_digits = case value
          when   0...10   then 1
          when  10...100  then 2
          when 100...1000 then 3
          else 4
        end
        leftover_digits = max_digits - used_digits
        [ value, suffix, leftover_digits > 0 ? leftover_digits : 0 ]
    end
    "%.#{precision}f#{suffix}" % value
  end
  module_function :nice_bytes  # Allow NiceBytes.nice_bytes outside of Sinatra
end

 
모델/init.models

# encoding: utf-8
require 'sequel'
DB = Sequel.postgres 'dbname', user:'bduser', password:'dbpass', host:'localhost'
DB << "SET CLIENT_ENCODING TO 'UTF8';"

require_relative 'users'

 
models/user.models

# encoding: utf-8
class User < Sequel::Model
  # ...
end

 
routes/init.message

# encoding: utf-8
require_relative 'login'
require_relative 'main'

 
항로/항공편

# encoding: utf-8
class MyApp < Sinatra::Application
  get "/login" do
    @title  = "Login"
    haml :login
  end

  post "/login" do
    # Define your own check_login
    if user = check_login
      session[ :user ] = user.pk
      redirect '/'
    else
      redirect '/login'
    end
  end

  get "/logout" do
    session[:user] = session[:pass] = nil
    redirect '/'
  end
end

 
항로/주요 항로

# encoding: utf-8
class MyApp < Sinatra::Application
  get "/" do
    @title = "Welcome to MyApp"        
    haml :main
  end
end

 
견해/의견

!!! XML
!!! 1.1
%html(xmlns="http://www.w3.org/1999/xhtml")
  %head
    %title= @title
    %link(rel="icon" type="image/png" href="/favicon.png")
    %meta(http-equiv="X-UA-Compatible" content="IE=8")
    %meta(http-equiv="Content-Script-Type" content="text/javascript" )
    %meta(http-equiv="Content-Style-Type" content="text/css" )
    %meta(http-equiv="Content-Type" content="text/html; charset=utf-8" )
    %meta(http-equiv="expires" content="0" )
    %meta(name="author" content="MeWho")
  %body{id:@action}
    %h1= @title
    #content= yield

그렇고 말고요.이러한 예를 보려면 여기에 설명된 Monk gem을 다운로드하는 것이 좋습니다.

https://github.com/monkrb/monk

rubygems.org 을 통해 '자동 설치'할 수 있습니다.보석을 얻으면 위에 링크된 지침을 사용하여 샘플 앱을 생성합니다.

본인이 원하지 않는 한 실제 개발에 몽크를 사용할 필요가 없습니다(사실 현재는 아닐 수도 있다고 생각합니다).요점은 원하는 경우 MVC 스타일(별도의 컨트롤러와 같은 경로 파일)로 앱을 쉽게 구성할 수 있는 방법을 확인하는 것입니다.

Mongk가 처리하는 방식을 살펴보면 매우 간단합니다. 주로 별도의 디렉토리에 파일을 요구하는 문제입니다. (root_path를 정의해야 합니다.)

Dir[root_path("app/**/*.rb")].each do |file|
    require file
end

Google에서 "Sinatra 상용판"을 검색하여 다른 사람들이 어떻게 Sinatra 애플리케이션을 배치하는지에 대한 아이디어를 얻으십시오.그것으로부터 여러분은 아마도 여러분의 필요에 맞는 것을 찾거나 단순히 여러분만의 것을 만들 수 있을 것입니다.그것은 하기에 그리 어렵지 않습니다.당신이 더 많은 시나트라 앱을 개발함에 따라, 당신은 당신의 상용판에 추가할 수 있습니다.

다음은 제가 만든 모든 프로젝트에 사용한 것입니다.

https://github.com/rziehl/sinatra-boilerplate

오래된 질문인 건 알지만 아무도 파드리노를 언급하지 않았다는 게 믿어지지 않아요. 시나트라 위에 파드리노를 프레임워크로 사용하거나 관심 있는 보석만 조각조각 추가할 수 있습니다.엉덩이 열 개나 차!

대규모 프로젝트를 위한 Sinatra의 모듈화의 핵심은 기본 도구를 사용하는 방법을 배우는 것입니다.

SitePoint에는 모듈식 시나트라 앱과 도우미를 볼 수 있는 매우 좋은 튜토리얼이 있습니다.하지만 당신은 한 가지 중요한 세부 사항에 특별한 주의를 기울여야 합니다.당신은 여러 개의 시나트라 앱을 보관하고 Rackup과 함께 탑재합니다.기본 앱을 작성하는 방법을 알게 되면 해당 튜토리얼의 config.ru 파일을 보고 독립적인 시나트라 앱을 탑재하는 방법을 관찰합니다.

Rack과 함께 Sinaatra를 실행하는 법을 배우면 모듈화 전략의 완전히 새로운 세계가 열릴 것입니다.이것은 분명히 정말 유용한 것을 시도하도록 유도합니다. 이제하위 응용 프로그램에 대해 개별 Gems를 보유하는 것에 의존할 수 있습니다. 이를 통해 모듈을 쉽게 버전화할 수 있습니다.

앱에 보석 모듈을 사용하는 힘을 과소평가하지 마십시오.잘 구분된 환경에서 실험 변경사항을 쉽게 테스트하고 쉽게 배포할 수 있습니다.뭔가 잘못되면 되돌리기도 쉽습니다.

코드를 구성하는 방법은 수천 가지가 있으므로 Rails와 유사한 레이아웃을 얻는 것은 문제가 되지 않습니다.그러나 자신의 구조를 사용자 정의하는 방법에 대한 몇 가지 좋은 게시물도 있습니다.그 게시물은 대부분의 웹 개발자들의 다른 빈번한 요구를 다루고 있습니다.

시간이 되신다면 루비 기반 웹 애플리케이션의 공통점인 랙에 대해 자세히 알아보시기 바랍니다.작업 방식에 미치는 영향은 훨씬 적을 수 있지만 대부분의 사용자가 애플리케이션에서 수행하는 특정 작업은 항상 랙 미들웨어에 더 적합합니다.

한 프로젝트를 제 접근 은 동한사이다프방호은법스는하팅를일트로젝양서에를 사용하는 입니다.sinatra/namespace다음과 같은 방식으로:

server.sys

require "sinatra"
require "sinatra/namespace"

if [ENV["LOGNAME"], ENV["USER"]] == [nil, "naki"]
    require "sinatra/reloader"
    register Sinatra::Reloader
    set :port, 8719
else
    set :environment, :production
end

for server in Dir.glob "server_*.rb"
    require_relative server
end

get "/" do
    "this route is useless"
end

server_some project.dll

module SomeProject
    def self.foo bar
       ...
    end
    ...
end

namespace "/someproject" do
    set :views, settings.root
    get "" do
        redirect request.env["REQUEST_PATH"] + "/"
    end
    get "/" do
        haml :view_someproject
    end
    post "/foo" do
        ...
        SomeProject.foo ...
    end
end

view_some project.haml

!!!
%html
    ...

제가 사용한 하위 프로젝트에 대한 또 다른 세부 사항은 어떤 종류의 글로벌 변수에 그들의 이름, 설명 및 경로를 추가하는 것이었습니다."/"가이드 홈페이지를 만들려고 하는데, 저는 지금 스니펫을 가지고 있지 않습니다.

여기서 문서 읽기:

시나트라 확장

Sinatra는 애플리케이션을 Ruby Modules로 분해할 수 있으며, Sinatra "register" 방법이나 "helper" 방법을 통해 다음과 같이 가져올 수 있습니다.

조력자들

require 'sinatra/base'

module Sinatra
  module Sample
    module Helpers

      def require_logged_in()
        redirect('/login') unless session[:authenticated]
      end

    end
  end
end

경로 지정/foo.foo.foo.foo.foo.foo

require 'sinatra/base'

module Sinatra
  module Sample
    module Routing
      module Foos

        def self.registered(app)           
          app.get '/foos/:id' do
            # invoke a helper
            require_logged_in

            # load a foo, or whatever
            erb :foos_view, :locals => { :foo => some_loaded_foo }
          end   
        end  

      end
    end     
  end
end

앱.스캐너

#!/usr/bin/env ruby

require 'sinatra'

require_relative 'routing/foos'

class SampleApp < Sinatra::Base

  helpers Sinatra::Sample::Helpers

  register Sinatra::Sample::Routing::Foos

end

몽크가 저를 위해 일하지 않았을 때, 저는 직접 템플릿 작업을 시작했습니다.

생각해보면, 파일 세트를 묶는 것은 특별한 것이 없습니다.스님의 철학은 2011년 초 레드닷 루비콘프 때 제게 설명이 되었고, 그들은 특히 거의 유지되지 않는 지금은 스님을 사용하는 것이 정말 선택적이라고 말했습니다.

이것은 ActiveRecord를 사용하려는 사람들에게 좋은 시작입니다.

심플 시나트라 MVC

https://github.com/katgironpe/simple-sinatra-mvc

언급URL : https://stackoverflow.com/questions/5015471/using-sinatra-for-larger-projects-via-multiple-files

반응형