Sinatra::Application类没有定义'desc'方法。

14

运行任何rake命令时遇到的错误是:undefined method 'desc' for Sinatra::Application:Class

# app.rb
require 'sinatra'
require 'sinatra/activerecord'
require 'sinatra/contrib'

get '/' do
  puts "Hello World"
end

# config.ru
require "./app"
run Sinatra::Application

# Rakefile
require './app'
require 'sinatra/activerecord/rake'

# Gemfile
source 'https://rubygems.org'
ruby '2.0.0'

gem 'activerecord', '~> 4.0.2'
gem 'sinatra', '~> 1.4.4'
gem 'sinatra-activerecord', '~> 1.2.3'
gem 'sinatra-contrib', '~> 1.4.2'

完整跟踪:

/Users/j/.rvm/gems/ruby-2.0.0-p247/gems/sinatra-contrib-1.4.2/lib/sinatra/namespace.rb:269:in `method_missing'
/Users/j/.rvm/gems/ruby-2.0.0-p247/gems/sinatra-activerecord-1.2.3/lib/sinatra/activerecord/tasks.rake:4:in `block in <top (required)>'
/Users/j/.rvm/gems/ruby-2.0.0-p247/gems/sinatra-contrib-1.4.2/lib/sinatra/namespace.rb:126:in `class_eval'
/Users/j/.rvm/gems/ruby-2.0.0-p247/gems/sinatra-contrib-1.4.2/lib/sinatra/namespace.rb:126:in `block in new'
/Users/j/.rvm/gems/ruby-2.0.0-p247/gems/sinatra-contrib-1.4.2/lib/sinatra/namespace.rb:118:in `initialize'
/Users/j/.rvm/gems/ruby-2.0.0-p247/gems/sinatra-contrib-1.4.2/lib/sinatra/namespace.rb:118:in `new'
/Users/j/.rvm/gems/ruby-2.0.0-p247/gems/sinatra-contrib-1.4.2/lib/sinatra/namespace.rb:118:in `new'
/Users/j/.rvm/gems/ruby-2.0.0-p247/gems/sinatra-contrib-1.4.2/lib/sinatra/namespace.rb:142:in `namespace'
/Users/j/.rvm/gems/ruby-2.0.0-p247/gems/sinatra-1.4.4/lib/sinatra/base.rb:1972:in `block (2 levels) in delegate'
/Users/j/.rvm/gems/ruby-2.0.0-p247/gems/sinatra-activerecord-1.2.3/lib/sinatra/activerecord/tasks.rake:3:in `<top (required)>'
/Users/j/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-4.0.2/lib/active_support/dependencies.rb:223:in `load'
/Users/j/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-4.0.2/lib/active_support/dependencies.rb:223:in `block in load'
/Users/j/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-4.0.2/lib/active_support/dependencies.rb:214:in `load_dependency'
/Users/j/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-4.0.2/lib/active_support/dependencies.rb:223:in `load'
/Users/j/.rvm/gems/ruby-2.0.0-p247/gems/sinatra-activerecord-1.2.3/lib/sinatra/activerecord/rake.rb:77:in `<top (required)>'
/Users/j/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/site_ruby/2.0.0/rubygems/core_ext/kernel_require.rb:51:in `require'
/Users/j/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/site_ruby/2.0.0/rubygems/core_ext/kernel_require.rb:51:in `require'
/Users/j/.rvm/gems/ruby-2.0.0-p247/gems/backports-3.3.5/lib/backports/tools.rb:328:in `require_with_backports'
/Users/j/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-4.0.2/lib/active_support/dependencies.rb:229:in `block in require'
/Users/j/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-4.0.2/lib/active_support/dependencies.rb:214:in `load_dependency'
/Users/j/.rvm/gems/ruby-2.0.0-p247/gems/activesupport-4.0.2/lib/active_support/dependencies.rb:229:in `require'
/Users/j/Desktop/app/Rakefile:2:in `<top (required)>'
/Users/j/.rvm/gems/ruby-2.0.0-p247@global/gems/rake-10.1.0/lib/rake/rake_module.rb:25:in `load'
/Users/j/.rvm/gems/ruby-2.0.0-p247@global/gems/rake-10.1.0/lib/rake/rake_module.rb:25:in `load_rakefile'
/Users/j/.rvm/gems/ruby-2.0.0-p247@global/gems/rake-10.1.0/lib/rake/application.rb:637:in `raw_load_rakefile'
/Users/j/.rvm/gems/ruby-2.0.0-p247@global/gems/rake-10.1.0/lib/rake/application.rb:94:in `block in load_rakefile'
/Users/j/.rvm/gems/ruby-2.0.0-p247@global/gems/rake-10.1.0/lib/rake/application.rb:165:in `standard_exception_handling'
/Users/j/.rvm/gems/ruby-2.0.0-p247@global/gems/rake-10.1.0/lib/rake/application.rb:93:in `load_rakefile'
/Users/j/.rvm/gems/ruby-2.0.0-p247@global/gems/rake-10.1.0/lib/rake/application.rb:77:in `block in run'
/Users/j/.rvm/gems/ruby-2.0.0-p247@global/gems/rake-10.1.0/lib/rake/application.rb:165:in `standard_exception_handling'
/Users/j/.rvm/gems/ruby-2.0.0-p247@global/gems/rake-10.1.0/lib/rake/application.rb:75:in `run'
/Users/j/.rvm/gems/ruby-2.0.0-p247@global/gems/rake-10.1.0/bin/rake:33:in `<top (required)>'
/Users/j/.rvm/gems/ruby-2.0.0-p247@global/bin/rake:23:in `load'
/Users/j/.rvm/gems/ruby-2.0.0-p247@global/bin/rake:23:in `<main>'
/Users/j/.rvm/gems/ruby-2.0.0-p247/bin/ruby_executable_hooks:15:in `eval'
/Users/j/.rvm/gems/ruby-2.0.0-p247/bin/ruby_executable_hooks:15:in `<main>'

回溯指向哪里? - Marek Lipka
添加了回溯和Gemfile。 - jamesfzhang
1
./app里面有什么? - phoet
请参见以下链接: https://dev59.com/_Ivda4cB1Zd3GeqPb6Oy#66110634 - CodePint
2个回答

24

2
我正在使用Sinatra来模拟Rails应用程序中的外部API进行测试,并且在我的Gemfile中默认情况下全局需要sinatrasinatra-contrib,这也导致了同样的问题。这确实解决了它!谢谢 :) - mltsy

17
Sinatra namespace extension在Sinatra contrib中与Rake自己的命名空间支持产生了冲突。它们都定义了一个namespace方法,并且Sinatra contrib版本被(错误地)从Sinatra-ActiveRecord Rake tasks中调用。
如果您不使用来自Sinatra-contrib的命名空间,则最简单的解决方案是仅引用您需要的那些扩展;例如,更改
require 'sinatra/contrib'

require 'sinatra/whatever'
require 'sinatra/anotherextension'
如果您正在使用Sinatra名称空间,那么我认为您可以通过转移到模块化样式应用程序来解决这个问题。将您的app.rb更改为类似以下内容的内容:
require 'sinatra/base' # note this has changed from just 'sinatra'
require 'sinatra/activerecord'
require 'sinatra/contrib'

class MyApp < Sinatra::Base
  register Sinatra::Contrib

  get '/' do
    "Hello World"
  end

  # other routes etc. as needed
end

然后在你的config.ru文件中,你需要使用run MyApp而不是run Sinatra::Application(当然你可以,并且应该给你的类起一个更好的名字)。这避免了两个namespace方法的冲突,因为Sinatra版本仅在你的应用程序类中可用,而不在顶层级别可用。


我正在运行一个模块化应用程序,但忘记了 sinatra/base 的特定要求。谢谢,救了我! - aledalgrande

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接