0

編集: TorqueBox を使用してアプリケーションを動作させたので、問題はトリニダードに関連していると思います。ただし、Sinatra アプリケーションを実行するための好ましい方法についての私の意見はまだ有効だと思います。

JRuby、Bundler、およびモジュラー スタイルを使用しています。ここに私のアプリケーションコードがあります:

# myapp.rb
class MyApp < Sinatra::Base
  configure :development do
    register Sinatra::Reloader
  end

  set :server, 'trinidad'
  set :environment, :development
  set :logging, true
  #...
end

# config.ru
require 'bundler/setup'

Bundler.require(:default)

$: << File.dirname(__FILE__)

require 'myapp'

run MyApp

# Gemfile
source 'http://rubygems.org'

gem 'rack'
gem 'sinatra', :require => 'sinatra/base'
gem 'sinatra-contrib', :require => 'sinatra/reloader'
gem 'coffee-script'
gem 'neography'
gem 'gon-sinatra'
gem 'sass'
gem 'trinidad'

アプリケーションを起動する適切な方法 (つまり、コマンドの種類) は何ですか? 私は Trinidad を使用しています。これは、JRuby アプリケーションに適したソリューションであると読んだためです (TorqueBox を動作させることができませんでした)。現在、「trinidad config.ru」でアプリを実行していますが、次の種類のエラー メッセージがスローされます。

application error
org.jruby.rack.RackInitializationException: no such file to load -- bundler/setup
    from org/jruby/RubyKernel.java:991:in `require'
    from /home/myhome/.rvm/rubies/jruby-1.7.0.preview1/lib/ruby/shared/rubygems/custom_require.rb:36:in `require'
    from /home/myhome/RubymineProjects/myapp/config.ru:1:in `(root)'
    from org/jruby/RubyBasicObject.java:1818:in `instance_eval'
    from jar:file:/home/myhome/.rvm/gems/jruby-1.7.0.preview1/gems/jruby-rack-1.1.9/lib/jruby-rack-1.1.9.jar!/vendor/rack-1.4.1/rack/builder.rb:51:in `initialize'
    from /home/myhome/RubymineProjects/myapp/config.ru:1:in `(root)'

    at org.jruby.rack.DefaultRackApplicationFactory$4.init(DefaultRackApplicationFactory.java:224)
    at org.jruby.rack.DefaultRackApplicationFactory.getApplication(DefaultRackApplicationFactory.java:58)
    at org.jruby.rack.PoolingRackApplicationFactory.createApplication(PoolingRackApplicationFactory.java:323)
    at org.jruby.rack.PoolingRackApplicationFactory.getApplication(PoolingRackApplicationFactory.java:171)
    at org.jruby.rack.DefaultRackDispatcher.getApplication(DefaultRackDispatcher.java:27)
    at org.jruby.rack.AbstractRackDispatcher.process(AbstractRackDispatcher.java:32)
    at org.jruby.rack.AbstractServlet.service(AbstractServlet.java:37)
    at org.jruby.rack.AbstractServlet.service(AbstractServlet.java:43)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1001)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
    at java.lang.Thread.run(Thread.java:722)
Caused by: org.jruby.exceptions.RaiseException: (LoadError) no such file to load -- bundler/setup
    at org.jruby.RubyKernel.require(org/jruby/RubyKernel.java:991)
    at Kernel.require(/home/myhome/.rvm/rubies/jruby-1.7.0.preview1/lib/ruby/shared/rubygems/custom_require.rb:36)
    at RUBY.(root)(/home/myhome/RubymineProjects/myapp/config.ru:1)
    at org.jruby.RubyBasicObject.instance_eval(org/jruby/RubyBasicObject.java:1818)
    at RUBY.initialize(jar:file:/home/myhome/.rvm/gems/jruby-1.7.0.preview1/gems/jruby-rack-1.1.9/lib/jruby-rack-1.1.9.jar!/vendor/rack-1.4.1/rack/builder.rb:51)
    at RUBY.(root)(/home/myhome/RubymineProjects/myapp/config.ru:1)
ignoring null application

Trinidad and Rack のバージョン 1.4.1、JRuby の 1.7.0.preview1、および Sinatra の 1.3.3 を使用しています。

「bundle exec trinidad config.ru」を実行すると、次のエラーが発生します。

application error
org.jruby.rack.RackInitializationException: Valid types are [:development, :runtime], 
    from /home/myhome/.rvm/rubies/jruby-1.7.0.preview1/lib/ruby/shared/rubygems/dependency.rb:45:in `initialize'
    from /home/myhome/.rvm/rubies/jruby-1.7.0.preview1/lib/ruby/shared/rubygems/specification.rb:821:in `add_dependency_with_type'
    from :1:in `'
    from :1:in `'
    from org/jruby/RubyKernel.java:1037:in `eval'
    from org/jruby/RubyArray.java:1611:in `each'
    from org/jruby/RubyArray.java:1611:in `each'
    from org/jruby/RubyEnumerable.java:649:in `find_all'
    from org/jruby/RubyKernel.java:991:in `require'
    from org/jruby/RubyKernel.java:991:in `require'
    from org/jruby/RubyKernel.java:991:in `require'

    at org.jruby.rack.DefaultRackApplicationFactory.createApplication(DefaultRackApplicationFactory.java:235)
    at org.jruby.rack.DefaultRackApplicationFactory.newApplication(DefaultRackApplicationFactory.java:49)
    at org.jruby.rack.DefaultRackApplicationFactory.getApplication(DefaultRackApplicationFactory.java:57)
    at org.jruby.rack.PoolingRackApplicationFactory.createApplication(PoolingRackApplicationFactory.java:323)
    at org.jruby.rack.PoolingRackApplicationFactory.getApplication(PoolingRackApplicationFactory.java:171)
    at org.jruby.rack.DefaultRackDispatcher.getApplication(DefaultRackDispatcher.java:27)
    at org.jruby.rack.AbstractRackDispatcher.process(AbstractRackDispatcher.java:32)
    at org.jruby.rack.AbstractServlet.service(AbstractServlet.java:37)
    at org.jruby.rack.AbstractServlet.service(AbstractServlet.java:43)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1001)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
    at java.lang.Thread.run(Thread.java:722)
Caused by: org.jruby.exceptions.RaiseException: (ArgumentError) Valid types are [:development, :runtime], 
    at Gem::Dependency.initialize(/home/myhome/.rvm/rubies/jruby-1.7.0.preview1/lib/ruby/shared/rubygems/dependency.rb:45)
    at Gem::Specification.add_dependency_with_type(/home/myhome/.rvm/rubies/jruby-1.7.0.preview1/lib/ruby/shared/rubygems/specification.rb:821)
    at RUBY.(:1)
    at RUBY.(:1)
    at org.jruby.RubyKernel.eval(org/jruby/RubyKernel.java:1037)
    at org.jruby.RubyArray.each(org/jruby/RubyArray.java:1611)
    at org.jruby.RubyArray.each(org/jruby/RubyArray.java:1611)
    at org.jruby.RubyEnumerable.find_all(org/jruby/RubyEnumerable.java:649)
    at org.jruby.RubyKernel.require(org/jruby/RubyKernel.java:991)
    at org.jruby.RubyKernel.require(org/jruby/RubyKernel.java:991)
    at org.jruby.RubyKernel.require(org/jruby/RubyKernel.java:991)
ignoring null application
4

2 に答える 2

1

rubygemsはデフォルトではロードされません(少なくともjruby --1.8では)。したがって、JRuby(実際にはJRuby-Rack)が別の「ランタイム」(一種の新しい)でアプリをロードするときに、 config.rurequire 'rubygems'の上に追加します。デフォルトでは、rubyプロセスですが同じJVMプロセス内にあります。または、を使用して実行することもできますrackup -s trinidad

于 2012-08-21T13:14:51.767 に答える
0

ラック構成とアプリケーションを呼び出す CLI コマンドに関しては、kares が正しいです。Torquebox を使用していない場合は、「-s trinidad」で「rackup」を使用する方法です。

ラック構成内からアプリケーションを呼び出すための Ruby コマンドに関しては、次のようにします。これがあなたの状況に当てはまるかどうか、これがあなたが探しているものであるかどうかはわかりませんが、HTTP ハンドラーに関係なく役立ちます:

Sinatra::Base をミックスする MyApp があります。そのクラスをトリミングして環境を構成するだけにし、ページロードごとに「実行前」と「実行後」を実行します...ただし、実際には呼び出しを処理および取得/投稿しません。次に、アプリケーション全体で特定のパスを処理する特殊なクラスを作成できます。これは Rack::Builder の map() メソッドを使用しています...

require 'myapp'
require 'mylanding'
require 'myauthentication'
require 'myautocomplete'
require 'mysearch'

#de run MyApp

map "/" do
    run MyLanding    #de Catch-all, which would have "get '/*' do" in it too.
end

map "/authentication/" do
    run MyAuthentication
end

map "/autocomplete/" do
    run MyAutocomplete
end

map "/search/" do
    run MySearch
end

次に、各 My* クラス内で、次のようにします。

class MyLanding < MyApp
  get "/*" do
    ..handle landing.. or see what's in the splat.
  end
end

class MyAuthentication < MyApp
  get "/sign/in" do
    ..present sign-in..
  end
  post "/sign/in" do
    ..handle sign-in..
  end
end

等...

サブクラスには、すべてのページロードの全体的な MyApp 処理がありますが、ルートを追加して、たとえば /authentication/sign/in が MyAuthentication の /sign/in によって処理されるようにします。これは、すべて同じ基盤である MyApp を使用して、ある程度焦点を絞ったサブアプリケーションを持つクールな方法です。

于 2013-03-06T13:48:52.117 に答える