rails项目中有个目录 lib/tasks,里面定义了一个rake任务:

task hello: :hello do
puts “hello”
end

看到这里的时候,是不是可能会对 task 方法产生一些兴趣?

可以在rails项目的Gemfile中加入 pry这个强大的工具,然后一步步找到这个task方法的本质。

1,在task中加入断点:
binding.pry

2,断点中用 show-method 方法
用show-method按图索骥,可以层层揭开 task 的面纱。

[33] pry(main)>
[34] pry(main)> show-method taskFrom: /home/liukun/.rvm/gems/ruby-2.1.1@zhe800_zhaoshang/gems/rake-10.0.4/lib/rake/dsl_definition.rb @ line 31:
Owner: Rake::DSL
Visibility: private
Number of lines: 3def task(*args, &block)Rake::Task.define_task(*args, &block)
end
[35] pry(main)> show-method Rake::Task.define_taskFrom: /home/liukun/.rvm/gems/ruby-2.1.1@zhe800_zhaoshang/gems/rake-10.0.4/lib/rake/task.rb @ line 350:
Owner: #<Class:Rake::Task>
Visibility: public
Number of lines: 3def define_task(*args, &block)Rake.application.define_task(self, *args, &block)
end
[36] pry(main)> show-method Rake.application.define_taskFrom: /home/liukun/.rvm/gems/ruby-2.1.1@zhe800_zhaoshang/gems/rake-10.0.4/lib/rake/task_manager.rb @ line 23:
Owner: Rake::TaskManager
Visibility: public
Number of lines: 13def define_task(task_class, *args, &block)task_name, arg_names, deps = resolve_args(args)task_name = task_class.scope_name(@scope, task_name)deps = [deps] unless deps.respond_to?(:to_ary)deps = deps.collect {|d| d.to_s }task = intern(task_class, task_name)task.set_arg_names(arg_names) unless arg_names.empty?if Rake::TaskManager.record_task_metadataadd_location(task)task.add_description(get_description(task))endtask.enhance(deps, &block)
end
[37] pry(main)> 

3, environment的作用是什么?
用来通知Rake需要加载rails环境。
参考:
http://stackoverflow.com/questions/7044714/whats-the-environment-task-in-rake

4,进一步理解 environment
http://jasonseifer.com/2010/04/06/rake-tutorial

  task :turn_off_alarm doputs "Turned off alarm. Would have liked 5 more minutes, though."endtask :groom_myself doputs "Brushed teeth."puts "Showered."puts "Shaved."endtask :make_coffee docups = ENV["COFFEE_CUPS"] || 2puts "Made #{cups} cups of coffee. Shakes are gone."endtask :walk_dog doputs "Dog walked."endtask :ready_for_the_day => [:turn_off_alarm, :groom_myself, :make_coffee, :walk_dog] doputs "Ready for the day!"end

By running the ready_for_the_day task it notices that the turn_off_alarm, groom_myself, make_coffee, and walk_dog tasks are all prerequisites of the ready_for_the_day task. Then it runs them all in the appropriate order.

用pry阅读ruby源码--以task方法为例相关推荐

  1. 逐行阅读redux源码(二)combineReducers

    前情提要 逐行阅读redux源码(一)createStore 认识reducers 在我们开始学习源码之前,我们不妨先来看看何谓reducers: 如图所见,我们可以明白, reducer 是用来对初 ...

  2. C++Primer Plus (第六版)阅读笔记 + 源码分析【目录汇总】

    C++Primer Plus (第六版)阅读笔记 + 源码分析[第一章:预备知识] C++Primer Plus (第六版)阅读笔记 + 源码分析[第二章:开始学习C++] C++Primer Plu ...

  3. webuploader 怎么在react中_另辟蹊径搭建阅读React源码调试环境支持所有React版本细分文件断点调试...

    引言(为什么写这篇文章) 若要高效阅读和理解React源码,搭建调试环境是必不可少的一步.而常规方法:使用react.development.js和react-dom.development.js调试 ...

  4. 阅读react-redux源码(七) - 实现一个react-redux

    阅读react-redux源码 - 零 阅读react-redux源码 - 一 阅读react-redux源码(二) - createConnect.match函数的实现 阅读react-redux源 ...

  5. 阅读react-redux源码(六) - selectorFactory处理store更新

    阅读react-redux源码 - 零 阅读react-redux源码 - 一 阅读react-redux源码(二) - createConnect.match函数的实现 阅读react-redux源 ...

  6. 阅读react-redux源码(五) - connectAdvanced中store改变的事件转发、ref的处理和pure模式的处理

    阅读react-redux源码 - 零 阅读react-redux源码 - 一 阅读react-redux源码(二) - createConnect.match函数的实现 阅读react-redux源 ...

  7. 阅读react-redux源码(四) - connectAdvanced、wrapWithConnect、ConnectFunction和checkForUpdates

    阅读react-redux源码 - 零 阅读react-redux源码 - 一 阅读react-redux源码(二) - createConnect.match函数的实现 阅读react-redux源 ...

  8. 阅读react-redux源码(三) - mapStateToPropsFactories、mapDispatchToPropsFactories和mergePropsFactories

    阅读react-redux源码 - 零 阅读react-redux源码 - 一 阅读react-redux源码(二) - createConnect.match函数的实现 阅读react-redux源 ...

  9. 阅读react-redux源码(二) - createConnect、match函数的实现

    阅读react-redux源码 - 零 阅读react-redux源码 - 一 阅读react-redux源码(二) - createConnect.match函数的实现 上一节看了Provider组 ...

最新文章

  1. 数字信号处理与音频处理(使用Audition)
  2. 全国大学生智能汽车竞赛-百度线下赛道报名开始!
  3. 《Linux内核设计与实现》课程学习重点问题总结
  4. 张志华 机器学习 两门课程正确顺序及视频连接
  5. NYOJ 888 取石子(九)
  6. 趣谈设计模式 | 职责链模式(ChainOfResposibility):请求的转发处理
  7. mysql读锁和写锁
  8. gateway请求拦截_一种网关对用户请求进行统一拦截判断是否放行的方法与流程...
  9. ccf推荐期刊和会议目录_重磅快讯:大数据入选CCF推荐中文科技期刊目录!
  10. 虚拟机查看cpu型号_CentOS7安装KVM虚拟机
  11. 携程“线上摆摊”:1晚赚3105万
  12. 第五章:Redis pipeline流水线
  13. 流量清洗是什么意思?
  14. git push you are not allowed to upload merges
  15. 【读书笔记】投资中最简单的事-邱国鹭,别人恐惧我贪婪,别人贪婪我respect
  16. linux下安装drcom方法
  17. 图片验证码 java_java生成图片验证码
  18. 美林数据“智能反窃电分析应用”荣获大数据星河奖
  19. 主成分分析PCA+C代码
  20. 算法图解第十、十一章读书笔记

热门文章

  1. 疫情当前,云计算、大数据、AI将如何帮助人类打赢这场“战疫”?
  2. 我与搜狗输入法的情缘
  3. R语言 Error in file(file, “rt“) : 无法打开链结
  4. 硝烟中的scrum和XP——我们如何实施scrum读后笔记
  5. 薪酬管理专业术语大全
  6. power BI 天气数据爬取
  7. input改为number类型,去掉上下箭头
  8. 科研入门宝典(二):文献调研工作如何展开
  9. android圆形波纹按钮,android自定义View——圆形波纹扫描效果
  10. mac在终端查看本地ip