新手问题 小白问题, 太让我崩溃啊! 新建的项目, rake test 失败出错.

zw963 · 2012年06月25日 · 最后由 zw963 回复于 2012年06月26日 · 6057 次阅读

我直接说我的过程吧。

我现在希望重新构建 Agile 第四版之中的购物车。

  • 首先通过 gem 升级到 rails 3.2.6, (其他版本一样,出错)
Gems included by the bundle:
  * actionmailer (3.2.6)
  * actionpack (3.2.6)
  * activemodel (3.2.6)
  * activerecord (3.2.6)
  * activeresource (3.2.6)
  * activesupport (3.2.6)
  * arel (3.0.2)
  * builder (3.0.0)
  * bundler (1.1.4)
  * coffee-rails (3.2.2)
  * coffee-script (2.2.0)
  * coffee-script-source (1.3.3)
  * erubis (2.7.0)
  * execjs (1.4.0)
  * hike (1.2.1)
  * i18n (0.6.0)
  * journey (1.0.4)
  * jquery-rails (2.0.2)
  * json (1.7.3)
  * libv8 (3.3.10.4)
  * mail (2.4.4)
  * mime-types (1.19)
  * multi_json (1.3.6)
  * polyglot (0.3.3)
  * rack (1.4.1)
  * rack-cache (1.2)
  * rack-ssl (1.3.2)
  * rack-test (0.6.1)
  * rails (3.2.6)
  * railties (3.2.6)
  * rake (0.9.2.2)
  * rdoc (3.12)
  * sass (3.1.19)
  * sass-rails (3.2.5)
  * sprockets (2.1.3)
  * sqlite3 (1.3.6)
  * therubyracer (0.10.1)
  * thor (0.15.3)
  * tilt (1.3.3)
  * treetop (1.4.10)
  * tzinfo (0.3.33)
  * uglifier (1.2.5)
  • 运行rails new depot, 正常

  • 运行rails g scaffold Product title:string description:text image_url:string price:decimal

  • 运行rake db:migrate


运行rake test, 下面就出错了...

rake aborted!
stack level too deep

Tasks: TOP => test:units
(See full trace by running task with --trace)

运行bundle exec rake test, 输出为无限错误循环。


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 Rails::SubTestTask#ruby called at /root/.rvm/gems/ruby-1.9.2-p320@global/gems/rake-0.9.2.2/lib/rake/file_utils_ext.rb:39:in `ruby'
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 Object#ruby called at /root/.rvm/gems/ruby-1.9.2-p320@global/gems/rake-0.9.2.2/lib/rake/file_utils_ext.rb:39:in `ruby'
WARNING: DSL method Object#ruby called at /root/.rvm/gems/ruby-1.9.2-p320@global/gems/rake-0.9.2.2/lib/rake/file_utils_ext.rb:39:in `ruby'
WARNING: DSL method Object#ruby called at /root/.rvm/gems/ruby-1.9.2-p320@global/gems/rake-0.9.2.2/lib/rake/file_utils_ext.rb:39:in `ruby'
WARNING: DSL method Object#ruby called at /root/.rvm/gems/ruby-1.9.2-p320@global/gems/rake-0.9.2.2/lib/rake/file_utils_ext.rb:39:in `ruby'
WARNING: DSL method Object#ruby called at /root/.rvm/gems/ruby-1.9.2-p320@global/gems/rake-0.9.2.2/lib/rake/file_utils_ext.rb:39:in `ruby'
WARNING: DSL method Object#ruby called at /root/.rvm/gems/ruby-1.9.2-p320@global/gems/rake-0.9.2.2/lib/rake/file_utils_ext.rb:39:in `ruby'
WARNING: DSL method Object#ruby call

. . .

如果在 Rakefile 中加入include Rake::DSL, 再次运行 bundle exec rake test, 则错误输出结果为:

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 Rails::SubTestTask#ruby called at /root/.rvm/gems/ruby-1.9.2-p320@global/gems/rake-0.9.2.2/lib/rake/file_utils_ext.rb:39:in `ruby'
rake aborted!
stack level too deep

Tasks: TOP => test:units
(See full trace by running task with --trace)

添加 trace 参数后,bundle exec rake test -t , 输出结果:

** Invoke test (first_time)
** Execute test
** Invoke test:run (first_time)
** Execute test:run
** Invoke test:units (first_time)
** Invoke test:prepare (first_time)
** Invoke db:test:prepare (first_time)
** Invoke db:abort_if_pending_migrations (first_time)
** Invoke environment (first_time)
** Execute environment
** Execute db:abort_if_pending_migrations
** Execute db:test:prepare
** Invoke db:test:load (first_time)
** Invoke db:test:purge (first_time)
** Invoke environment 
** Execute db:test:purge
** Execute db:test:load
** Invoke db:test:load_schema (first_time)
** Invoke db:test:purge 
** Execute db:test:load_schema
** Invoke db:schema:load (first_time)
** Invoke environment 
** Execute db:schema:load
** Execute test:prepare
** Execute test:units
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 Rails::SubTestTask#ruby called at /root/.rvm/gems/ruby-1.9.2-p320@global/gems/rake-0.9.2.2/lib/rake/file_utils_ext.rb:39:in `ruby'
rake aborted!
stack level too deep
/root/.rvm/gems/ruby-1.9.2-p320@global/gems/rake-0.9.2.2/lib/rake/task.rb:162
Tasks: TOP => test:units

最让人崩溃的是:同样的示例,几个月前,同样的命令,新建的项目 (当时具体的 gem 版本不清楚), 但是有一点我可以确认,rake test是可以运行的。当时还使用autotest之类的自动化测试来着!!

太让人崩溃啦!! 谁来告诉我怎么回事儿??

p.s. 其他 rake 任务貌似一切正常,就是 rake test, 另外,我的需求就是要让 test 跑起来,请大家帮我看看,是否新版本不再使用 rake test 这样的命令,又或者我缺少了某个版本的 gem. 总之,我犯的完全可能是低级小白错误,还望大家指点!

这不是只有 warning 吗? errors 在哪里?

try

bundle exec rake db:migrate

追踪一下错误到哪里。

Rake DSL methods is deprecated. Google 一下 第一筆結果:Global access to Rake DSL method is depreciated

加上 --trace 看一下具体错误是什么:

bundle exec rake test --trace

#1 楼 @azhao

我已经更新内容,麻烦再看下。刚开始是警告,但是最终还是会报错的。

#2 楼 @Teddy rake db:migrate 一直没问题啊。就是 test.

#3 楼 @zgm #5 楼 @ashchan 已经更新问题,增加了 trace 信息,麻烦看下。

#4 楼 @Juanito 昨晚我上 so 看了好多有关这个提示的问答。按照他们的方法也改了,不过都不行,我估计可能是我犯了什么超级小白的错误?例如缺少什么 gem 之类的。

#6 楼 @zw963 我倒是觉得,如果你有时间,手快的话,说不定是一个给 Rails core team 提交 patch 的机会。

把你的代码开源到 github 上,或许能帮你 debug 一下。

似乎之前碰到过类似的问题。莫名其妙就解决了。 ** Invoke db:abort_if_pending_migrations (first_time) 看往后这一段似乎是死循环了 之前rake db:migrate成功了吗?手动rake db:test:prepare一下试试看? 或者切换 Ruby/Rails 版本试试?

#7 楼 @lgn21st 真没想过。 #8 楼 @daqing 那太谢谢你啦。https://github.com/zw963/depot1.git 其实我没有做什么啊,没有一行我自己的代码。rake test 还有 rake cucumber 就不成功。

#9 楼 @southwolf

rake db:migrate 当然成功啦。 rake db:test:prepare 没有提示,应该没问题?

我换过 3.2.1 , 3.1.0 , 3.2.6 三个版本都一样。也在两个电脑上试过,问题依旧。(难道跟系统有关?我是 slackware , 可是我用的是 rvm, 应该跟系统无关啊)

#11 楼 @zw963 我裝了 rails version 3.2.6,

rails new depot
rails g scaffold Product title:string description:text image_url:string price:decimal
rake db:migrate

木有問題。

#12 楼 @Juanito

实在抱歉,看来我的帖子编辑存在严重问题。

错误是出在 rake test , 麻烦你再试试

#11 楼 @zw963 我把你的项目下载后,一切正常运行,无报错。建议把 rake 改为 gem 'rake', '0.9.2.0' 试试。还有 include Rake::DSL 在 application.rb 添加的吧?

ruby 换 1.9.3 试试

git clone https://github.com/zw963/depot1.git
cd depot1/

rvm 1.9.3-p0
rvm gemset create depot
rvm gemset use depot

bundle install
rake db:migrate
rake test

rvm 1.9.2-p290
rvm gemset create depot
rvm gemset use depot

bundle install

rake test
rake test:units
rake test:functionals

我这边没有问题

我没装 ruby-1.9.2-p320 大家谁有 ruby-1.9.2-p320 可以试试

#15 楼 @Rei 1.9.3 也一样

#16 楼 @ery 你的 rvm 是不是安装有很多早期版本的 gem 了,说下你拥有的 rake 版本 (所有), 还有就是你的 rvm 版本。(我的是:rake 0.9.2.2, 刚才降到 0.9.2, 貌似照旧,rvm 是 1.14.3, 全新安装,没有早期的 gem)

再问下,你甚至没有添加任何include Rake::DSL, 就成功了吗?

#18 楼 @zw963 你做了什么特别的配置吗?可以新建一个 Rails 3.2.6 的项目对比看看。

不用添加 include Rake::DSL 应该就能跑啊。

$ rvm 1.9.2@depot

$ ruby -v
ruby 1.9.2p290 (2011-07-09 revision 32553) [i686-linux]

$ rvm -v
rvm 1.9.2 by Wayne E. Seguin ....

$ rake --version
rake, version 0.9.2.2

$ gem list | grep rake
rake (0.9.2.2)

$ rvm 1.9.3@depot

$ ruby -v
ruby 1.9.3p0 (2011-10-30 revision 33570) [i686-linux]

$ rake --version
rake, version 0.9.2.2

$ gem list | grep rake
rake (0.9.2.2)

没有添加任何include Rake::DSL 就成功了!

#19 楼 @Rei

唯一特殊的配置就是:去掉了 Gemfile 当中,therubyracer 那一行之前的注释。

剩下的要说有啥不一样,那就是我在.bashrc 内设定了

export RUBYLIB=$HOME/bin/ruby/lib
export RUBYOPT=-raddition

其实就是__~/bin/ruby/lib/addtion.rb, 里面启动加载了个人以前整理的类,以及初始加载了一些 Ruby 默认没有混入的库,我先去试试,去掉以上选项正常不。

#20 楼 @ery

我想知道你安装的所有 rake 版本。

gem list rake 的结果。

#22 楼 @zw963 我更新了之前的回复

$ gem list | grep rake
rake (0.9.2.2)

楼主我建议你装个 ruby 1.9.3 试试

#1 楼 @azhao #2 楼 @Teddy #3 楼 @zgm #4 楼 @Juanito #5 楼 @ashchan #7 楼 @lgn21st #8 楼 @daqing #9 楼 @southwolf #14 楼 @leekelby #15 楼 @Rei #20 楼 @ery

嗨~ 各位 XD 们,谢谢你们的热心帮忙,问题已经解决。果然是 .bashrc 内设定的问题。我注释掉之后,就正常了。事实上,在我安装 rvm 的时候,rvm 有提示,设定 RUBYOPT, 有可能会影响 rvm 的使用, 事实是,我没把这句话当回事儿。

这就是血的教训啊!! 引以为戒...

#25 楼 @zw963 恭喜................

#26 楼 @ery #19 楼 @Rei

貌似我又误解了... 跟我设定 RUBYOPT 无关,其实是因为我在启动 Ruby 解释器时,通过 RUBYOPT 混入了 FileUtils 模块,注释掉就 OK 了,Rake 的代码应该是有 bug 的。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号