【问题标题】:Ruby on Rails and Rake problems: uninitialized constant Rake::DSLRuby on Rails 和 Rake 问题:未初始化的常量 Rake::DSL
【发布时间】:2011-08-30 10:43:39
【问题描述】:

我遇到了一个非常令人沮丧的问题:Rake 很笨。

问题是这样产生的:

$ rails new test_app
$ rails generate scaffold new_scaffold field1:string field2:text

这两个都很好,但是当我这样做时,

$ rake db:migrate

我收到以下错误。

(in /home/mikhail/test_app)
rake aborted!
uninitialized constant Rake::DSL
/usr/lib/ruby/1.9.1/rake.rb:2482:in `const_missing'
/usr/lib/ruby/gems/1.9.1/gems/rake-0.9.0/lib/rake/tasklib.rb:8:in `<class:TaskLib>'
/usr/lib/ruby/gems/1.9.1/gems/rake-0.9.0/lib/rake/tasklib.rb:6:in `<module:Rake>'
/usr/lib/ruby/gems/1.9.1/gems/rake-0.9.0/lib/rake/tasklib.rb:3:in `<top (required)>'
/usr/lib/ruby/gems/1.9.1/gems/rake-0.9.0/lib/rake/rdoctask.rb:20:in `require'
/usr/lib/ruby/gems/1.9.1/gems/rake-0.9.0/lib/rake/rdoctask.rb:20:in `<top (required)>'
/usr/lib/ruby/gems/1.9.1/gems/railties-3.0.7/lib/rails/tasks/documentation.rake:1:in `require'
/usr/lib/ruby/gems/1.9.1/gems/railties-3.0.7/lib/rails/tasks/documentation.rake:1:in `<top (required)>'
/usr/lib/ruby/gems/1.9.1/gems/railties-3.0.7/lib/rails/tasks.rb:15:in `load'
/usr/lib/ruby/gems/1.9.1/gems/railties-3.0.7/lib/rails/tasks.rb:15:in `block in <top (required)>'
/usr/lib/ruby/gems/1.9.1/gems/railties-3.0.7/lib/rails/tasks.rb:6:in `each'
/usr/lib/ruby/gems/1.9.1/gems/railties-3.0.7/lib/rails/tasks.rb:6:in `<top (required)>'
/usr/lib/ruby/gems/1.9.1/gems/railties-3.0.7/lib/rails/application.rb:214:in `require'
/usr/lib/ruby/gems/1.9.1/gems/railties-3.0.7/lib/rails/application.rb:214:in `initialize_tasks'
/usr/lib/ruby/gems/1.9.1/gems/railties-3.0.7/lib/rails/application.rb:139:in `load_tasks'
/usr/lib/ruby/gems/1.9.1/gems/railties-3.0.7/lib/rails/application.rb:77:in `method_missing'
/home/mikhail/test_app/Rakefile:7:in `<top (required)>'
/usr/lib/ruby/1.9.1/rake.rb:2373:in `load'
/usr/lib/ruby/1.9.1/rake.rb:2373:in `raw_load_rakefile'
/usr/lib/ruby/1.9.1/rake.rb:2007:in `block in load_rakefile'
/usr/lib/ruby/1.9.1/rake.rb:2058:in `standard_exception_handling'
/usr/lib/ruby/1.9.1/rake.rb:2006:in `load_rakefile'
/usr/lib/ruby/1.9.1/rake.rb:1991:in `run'
/usr/bin/rake:31:in `<main>'

我在 Internet 上查找了类似/相同的错误,并且人们遇到了这些错误。只是似乎没有人能解决这个问题!

我该如何解决这个问题?

【问题讨论】:

    标签: ruby-on-rails rake


    【解决方案1】:

    之前的tweet from DHH。 Rake .9.0 破坏了 Rails 和其他一些东西,你需要:

    gem "rake", "0.8.7"
    

    在您的 Gemfile 中。

    【讨论】:

    • 这对我有用。我需要先做bundle update rake。然后我检查了bundle show rake。它应该说 0.8.7。然后rake db:migrate.
    • 或者更好:gem "rake", "!= 0.9.0"。这避免了损坏的 0.9.0 版本,但是一旦发布了较新的版本,就会更新到更新版本(稍后删除它不会有坏处,但保留它也不应该有坏处)。
    • @Spiralis 我也遇到了版本 0.9.2 的问题。因此,您可能需要为几个版本添加该行。
    • 这个解决方案工作对我有用。像@dharmatech 一样,我在heroku rake db:migrate 中提出了这个问题,这似乎解决了它。记得在继续之前将这些更改添加并提交到 git ;)
    • 这可能适用于 Rails,但我还必须执行 sudo gem install rake 以确保我从命令行调用的 rake 版本不是 0.8.7。
    【解决方案2】:

    我在上一个答案之后做了一些研究(对不起,我必须在它之前做)。

    Rake gem 0.9.2 解决了所有问题。我按照以下步骤操作:

    • 我安装了gem install rake -v=0.9.2(我有 0.9.1 gem)
    • 删除了带有gem uninstall rake -v=0.9.1的0.9.1
    • 更新为bundle update
    • 然后db:migrate 显示警告,WARNING: Global access to Rake DSL methods is deprecated. Please....

      通过将以下内容添加到 Rake 文件中已解决。

      module ::YourApplicationName  
        class Application
          include Rake::DSL
        end
      end
      
    • 我省略了@databyte 建议的module ::RakeFileUtils extend Rake::FileUtilsExtend 选项。

    这意味着 Rake gem 0.9.2 工作正常!

    【讨论】:

    • 按照前三个步骤,我没有收到任何警告,所以没有打扰其余的,谢谢你的建议!
    • 这求我问...为什么我要破解 Rake 以保留该功能? Rake 想要做什么,我现在应该使用什么?
    • @Arrumaco,Rake 文件的目录是什么?
    • 值得注意的是,RakeFile 的添加应该在 require 'rake' 之前 - 让我失望了 :)
    • 同样的问题,但我已经有了 rake (0.9.2, 0.8.7)。重新安装 0.9.2 似乎可以解决问题:1)gem uninstall rake -v=0.9.2 2)gem install rake -v=0.9.2
    【解决方案3】:

    浏览 Railstutorial (demo_app) 的第 2 章并遇到这个问题。我尝试了此处列出的所有其他答案,但在我这样做之前无法让它工作:

    把它放在你的 Rakefile 上面 require 'rake':

    require 'rake/dsl_definition'
    

    通过How to fix the uninitialized constant Rake::DSL problem on Heroku?

    我还重新提交并将所有文件推送到 Github 和 Heroku。

    【讨论】:

    • 这似乎是最好的答案,因为从 0.9.2 降级到 0.8.7 会破坏一些 gem 依赖项,具体取决于每种情况,例如我的 :) 谢谢!
    • 它对我不起作用。执行 rake db:create 时,我得到“没有要加载的文件 -- rake/dsl_definition”
    【解决方案4】:

    我需要做的就是使用:

    gem install rake
    

    我已经有 0.9.2 版本,只需要安装。

    【讨论】:

    • 哇,它对我有用。但是你能解释一下为什么我必须安装 rake 而我的 rake 应该已经安装了吗?
    • 我还不是真正的专家,但我的理解是在您的 PC 上“安装”gem 和在 gem 注册表中“安装”它们之间存在差异 - 我怀疑这是因为Ruby 安装需要知道哪些 gem 在您的 PC 上。也许这在未来可以自动化,或者已经在某些 Ruby 发行版中自动化......
    【解决方案5】:

    重新安装 rake gem,它应该可以正常工作:

    gem uninstall rake -v=0.9.2 
    gem install rake -v=0.9.2
    

    如果没有,请在 Gemfile 中指定版本“0.8.7”。

    【讨论】:

    • 这种方法对我有用,我更喜欢不必降级版本..
    • 也为我工作,仅适用于 rake -v 0.9.2.2
    【解决方案6】:

    如果不使用 Bundler:

    sudo gem install rake -v 0.8.7
    sudo gem uninstall rake
    

    然后选择卸载0.9.0。

    【讨论】:

    • 这在没有捆绑程序的情况下为我修复了它(rails 2.3.8)。曾尝试安装 rake 0.9.2 但这并没有解决问题。安装 0.8.7 并卸载 0.9.2 最终对我有用。
    【解决方案7】:

    如果你像我一样卡在 rake 0.8.7 上,而你使用的是 Rails 3.2.x,那么 railties 会增加对 Rake::DSL 的要求

    要解决这个问题,您应该在 Rakefile 的顶部添加:

    module Rake
      module DSL
      end
    end
    

    【讨论】:

      【解决方案8】:

      我通过以下步骤解决了同样的问题:

      在 Gemfile 中:

      gem 'rake', '0.9.2'
      

      然后在控制台上运行:

      sudo bundle update rake
      

      然后在 Rakefile 中添加以下行:

      require 'rake/dsl_definition'
      include Rake::DSL
      

      【讨论】:

        【解决方案9】:

        Rails 3.1.rc1 已更新。对于您自己的 Rakefile,您可以在调用 load_tasks 之前添加它。

        module ::YourApplicationName
          class Application
            include Rake::DSL
          end
        end
        
        module ::RakeFileUtils
          extend Rake::FileUtilsExt
        end
        

        https://gist.github.com/4cd2bbe68f98f2f0249f

        更新:还注意到这里也已经回答了:Undefined method 'task' using Rake 0.9.0

        【讨论】:

          【解决方案10】:

          我遇到了同样的问题,不得不使用 rake 0.8.7 gem 而不是 0.9.0。

          【讨论】:

            【解决方案11】:

            我是 Windows XP 用户,我遇到了同样的问题。

            我在 gemfile 中输入 gem "rake", "0.8.7",然后在命令窗口中输入以下内容。

            bundle update rake
            

            这解决了我的问题。

            【讨论】:

            • 今天也为我工作。只是想在 Win7 上编写 rails 代码。
            【解决方案12】:
            1. 转到您的项目路径
            2. 输入bundle install --path=vendor/bundle
            3. 输入bundle exec rake db:migrate

            要启动服务器类型bundle exec rails s。使用 bundle exec ,您将确保为您的项目使用正确的 gem(必需版本)。 如果您使用git 并为bundle exec 创建别名,我还建议您将vendor/bundle 添加到.gitignore。如果您使用zsh,您可以关注this approach

            【讨论】:

              【解决方案13】:

              与上面的 Branstar 相同 - 感谢 Branstar!

              • 操作系统:Windows Vista
              • 级别:Ruby on Rails 的新手
              • 我已经安装了 Ruby 1.9.2

              我按照 Running Rails 3 on Windows 中的说明进行操作。

              一直到“rake db:migrate”部分给了我与原始帖子相同的输出。

              我跑了:

              gem install rake
              

              我又跑了:

              rake db:migrate
              

              然后我就能够启动 Ruby on Rails 服务器并准备好一切。

              再次感谢布兰斯塔 :-)

              【讨论】:

                【解决方案14】:

                我为你 (mikhailvs) 感到难过。我已经疯了差不多一整天了。我什至卸载了 Ruby 及其所有依赖文件并关闭了我的电脑,但我仍然遇到了同样的问题。

                我从错误消息中得到的是 Rake 0.9.2 的问题。好像没有完全安装。所以我不得不重新安装gem install rake -v=0.9.2

                我不确定我是否安装了 rake –v0.9.1。因此,为了确保我的安全,我尝试使用 gem uninstall rake -v=0.9.1 删除那个旧版本。但是向我显示了错误消息

                ERROR:  While executing gem ... (Gem::InstallError)
                    cannot uninstall, check `gem list -d rake`
                

                好的,所以我检查了我 PC 上的所有 Rake 目录,发现我只有 Rake 0.9.2。 然后为了检查一切是否正常,我使用rake db:migrate 进行了迁移。它奏效了:)

                我认为我没有 Rake 0.9.1,因为我全新安装了 Ruby(rubyinstaller-1.9.2-p180 - 在我的 Windows 7 系统上)和所有 gem。与此同时,Rake 0.9.2 尚未完全安装。

                【讨论】:

                  【解决方案15】:

                  使用 "gem uninstall rake" 卸载对我有用,我安装了 2 个版本,所以我开玩笑地重新安装了。

                  “rake db:create”,确保数据库存在 然后 "rake db:migrate" 完成交易。

                  【讨论】:

                    【解决方案16】:

                    我在使用 Rake 0.9.2.2 时遇到了同样的问题。我通过使用 bundle exec 解决了这个问题。

                    【讨论】:

                      【解决方案17】:

                      对于 Rails 2.3 编辑 lib/tasks/rspec.rake 喜欢在这个提交中为我工作:

                      https://github.com/dchelimsky/rspec-rails/pull/11/files

                      【讨论】:

                        【解决方案18】:

                        安装 rake 0.8.7 并卸载 0.9.2.2

                        $ gem install rake -v 0.8.7
                        $ gem uninstall rake -v 0.9.2.2
                        

                        现在使用

                        $ bundle exec rake db:migrate
                        

                        我认为这会对你有所帮助 ;)

                        【讨论】:

                          【解决方案19】:

                          运行

                          bundle exec rake db:migrate
                          

                          它对我有用。

                          【讨论】:

                            猜你喜欢
                            • 2011-09-10
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 2011-09-05
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            相关资源
                            最近更新 更多