用pry阅读ruby源码--以task方法为例
来源:互联网 发布:联想笔记本网络驱动 编辑:程序博客网 时间:2024/04/28 02:24
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::DSLVisibility: privateNumber 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: publicNumber 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::TaskManagerVisibility: publicNumber 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_metadata add_location(task) task.add_description(get_description(task)) end task.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 do puts "Turned off alarm. Would have liked 5 more minutes, though." end task :groom_myself do puts "Brushed teeth." puts "Showered." puts "Shaved." end task :make_coffee do cups = ENV["COFFEE_CUPS"] || 2 puts "Made #{cups} cups of coffee. Shakes are gone." end task :walk_dog do puts "Dog walked." end task :ready_for_the_day => [:turn_off_alarm, :groom_myself, :make_coffee, :walk_dog] do puts "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.
0 0
- 用pry阅读ruby源码--以task方法为例
- 查找ruby方法(以rails为例)
- Spark源码阅读笔记:Spark的Task
- Windows下ruby的pry安装和配置
- 如何阅读源代码(以X264为例)
- 阅读源码的方法
- LINUX源码阅读方法
- LINUX源码阅读方法
- 源码阅读的方法
- 源码阅读系列:源码阅读方法
- QTimer源码分析(以Windows下实现为例)
- libevent源码分析 以epoll模型为例
- Android源码目录结构,以Android2.1为例
- 设计模式之迭代器模式---以JDK源码为例
- Hadoop源码学习-以创建目录为例
- 愚人节:Ruby源码编译为WinXP批处理文件
- 不以ActiveRecord为基类的ruby类
- jQuery-源码阅读,init()方法
- podfile 常见语法2
- HDU 1.3.8 As Easy As A+B
- Java Socket通信小结
- 第二周项目-小试循环
- 股神巴菲特对股市本质的形象解释
- 用pry阅读ruby源码--以task方法为例
- HDU 2.1.1 最小公倍数
- 欢迎使用CSDN-markdown编辑器
- 第2周项目3—小试循环(5)
- java学习日记——java中的多态
- HDU 2.1.2 How many prime numbers
- Android 中的依赖注入框架
- 转载 最大熵模型介绍及实现
- Mac上安装和卸载Mysql