Ruby on Rails 和 Rake 问题:未初始化的常量 Rake::DSL
Posted
技术标签:
【中文标题】Ruby on Rails 和 Rake 问题:未初始化的常量 Rake::DSL【英文标题】:Ruby on Rails and Rake problems: uninitialized constant 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 上查找了类似/相同的错误,并且人们遇到了这些错误。只是似乎没有人能解决这个问题!
我该如何解决这个问题?
【问题讨论】:
【参考方案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】:-
转到您的项目路径
输入
bundle install --path=vendor/bundle
输入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
它对我有用。
【讨论】:
以上是关于Ruby on Rails 和 Rake 问题:未初始化的常量 Rake::DSL的主要内容,如果未能解决你的问题,请参考以下文章
Ruby on Rails:运行 rake 命令时出现错误消息
如何在 ruby on rails 的亚马逊 aws 服务器中使用 gem 执行 rake 任务?
Ruby on Rails Rake在将rails项目从4.1.9更新到4.2.0后抛出“不正确的表名”错误