不再支持对Rake DSL方法的全局访问


86

我正在研究Ruby on Rails 3教程,并在命令行中键入了以下内容:

rake db:migrate

产生了以下警告。

WARNING: Global access to Rake DSL methods is deprecated.  Please Include
    ...  Rake::DSL into classes and modules which use the Rake DSL methods.

WARNING: DSL method DemoApp::Application#task called at /Users/imac/.rvm/gems/ruby-1.9.2-p180@rails3tutorial/gems/railties-3.0.7/lib/rails/application.rb:215:in `initialize_tasks'

我不确定该怎么做或如何使用它。我不知道Rake有其他命令。

我该如何解决这个问题?

Answers:


64

我在堆栈溢出问题Ruby on Rails和Rake问题中发现了这一点:未初始化的常量Rake :: DSL。它指的是@DHH推文。

将以下内容放入您的Gemfile中

gem "rake", "0.8.7"

您可能会看到类似

rake aborted!
You have already activated Rake 0.9.1 ...

我的目录中仍然有Rake 0.9.1的副本,因此删除了它。

您可以通过运行以下命令来“删除” Rake 0.9.1:

gem uninstall rake -v=0.9.1

如果您安装了gem的多个版本,则会提示您选择一个版本。

清除0.9.1后,我跑了

bundle update rake

终于能够创建我的数据库文件了。我正在使用rake db:create,但它也应该适用rake db:migrate

希望对您有所帮助。


5
那对我没有用。我必须实际删除rake 0.9.1> gem卸载rake -v = 0.9.1,然后>捆绑更新感谢Antonio

1
我同意安东尼奥-当我说要删除0.9.1的耙子时,我是说使用gem uninstall rake -v=0.9.1。我的不清楚的错误。感谢您对安东尼奥的澄清!干杯,布莱恩
布赖恩·布赖恩

13
当可以使较新的库工作时,我认为故意使用旧的库不是很好,请参阅下面的评论。
Smar

2
一种更简单的解决方案是下面NPatel提出的解决方案。只需向Rakefile添加一行即可。
Slobodan Kovacevic

我没有这个决议的运气。卸载rake 0.9.1或0.9.2然后运行捆绑软件更新后,它仍然出现相同的错误。
马克

111

新增中 include Rake::DSL在应用程序load_tasks被调用之前到Rakefile中对我来说也可行。

因此,在上述用户的情况下,DemoApp::Application.load_tasks在Rakefile中之前。


谢谢。修复了我的“警告:不建议使用Rake DSL方法的全局访问。” 问题。
Slobodan Kovacevic

这是解决此问题的正确方法吗?
马克

2
@Marc,这是我知道的唯一无需升级到Rails 3.0.8或更高版本的修复程序。该版本已解决该问题:github.com/rails/rails/commit/…。如果您找到更好的解决方法,请告诉我。另外,根据警告,我认为这是正确的解决方法。
Patelify 2011年

1
这是我的解决方案。我更喜欢简单地添加一行,而不是玩与Rake版本配合使用的游戏。
jaydel 2011年

2
这对我来说适用于1.9.2,对Rails 3.0.7适用于Rake 0.9.2
Steven Chanin

5

我在Windows上使用安装程序遇到了同样的问题。Ruby 1.9.2和Rails 3.0.9。这是我所做的:

bundle update rake
bundle show rake

完成之后,我运行了rake 0.9.2。

然后,我更新了应用程序根文件夹中的Rakefile,如下所示:

require File.expand_path('../config/application', __FILE__)
require 'rake'
# If you named your application something other than SampleApp, change that below
module ::SampleApp
    class Application
        include Rake::DSL
    end
end

module ::RakeFileUtils
    extend Rake::FileUtilsExt
end

SampleApp::Application.load_tasks

如评论中所述,请确保您的应用名称在上面的两行中正确。


1
为了使heroku rake db:migrate命令起作用,我还必须添加require 'rake/dsl_definition'到rakefile中(在require'rake'行上方)。
LikeMaBell

进行所有这些操作对我来说都是有效的,但不是必需的。NPatel的建议处理得很好。
Scott Swezey 2011年

0

如果您在更高版本的Rails(例如3. +)上看到此消息,则可能还需要使用RVM http://beginrescueend.com/来验证您的环境是否干净。并为您的项目创建特定的ruby和gemset。

在每个项目的基础上使用.rvmrc文件,这将确保您不会在项目中使用较旧的系统gem。以前咬过我。

这样可以避免产生Rakefiles之类的麻烦。


0

捆绑执行rake db:migrate将解决您的ruby版本问题


仅当您在Gemfile中有rake的有效版本,并且键入“ rake”使用PATH中安装的某些不同版本时,此方法才有效
RyanHennig 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.