注意Rake Task中invoke方法跟execute方法的不同
2015-01-04 15:24
363 查看
平时如果跟Rake Task有过接触的同学都会知道,当我们需要在一个Task里边调用另一个Task的时候,我们可以使用
准备一个say hello的task,代码:
接下来在命令行中执行rake task:
假设我们一个循环,需要调用上边的task共5次,那么我们可能会这么写:
Ok, 让我们尝试着运行这个
结果就是,'Hello, World!'只打印了一次,也就是说,我们的
经过搜索,从StackOverflow找到了这个问题的相关描述,详见:How do I execute Rake tasks with arguments multiple times?
按照答案中的描述,我们有两种修改方案。第一种就是将上述代码进行修改:
再次运行,这次总算得到期待结果了:
而第二种方法则会稍微麻烦一点:
再次执行rake task, 同样能够得到预期结果:
Rake::Task source code
Rake::Task['task_name'].invoke的方式。但是在今天的实践中,才知道
Rake::Task#invoke在默认情况下在整个运行过程中将只会被调用一次而已。话不多说,动手演示:
准备一个say hello的task,代码:
# lib/tasks/demo.rake namespace :demo do desc "Print 'Hello' string" task :say_hello do puts "Hello, World!" end end
接下来在命令行中执行rake task:
$ rake demo:say_hello => Hello, World!
假设我们一个循环,需要调用上边的task共5次,那么我们可能会这么写:
namespace :demo do # .... desc "Print 'Hello, World!' five times" task :say_five_hello do 5.times do Rake::Task['demo:say_hello'].invoke end end end
Ok, 让我们尝试着运行这个
say_five_hello的task,是不是真的会打印5次'Hello, World!'呢?
$ rake demo:say_five_hello => Hello, World!
结果就是,'Hello, World!'只打印了一次,也就是说,我们的
Rake::Task['demo:say_hello']只被运行了一次。
经过搜索,从StackOverflow找到了这个问题的相关描述,详见:How do I execute Rake tasks with arguments multiple times?
按照答案中的描述,我们有两种修改方案。第一种就是将上述代码进行修改:
namespace :demo do # ... desc "Print 'Hello, World!' five times" task :say_five_hello do 5.times do Rake::Task['demo:say_hello'].execute end end end
再次运行,这次总算得到期待结果了:
$ rake demo:say_five_hello => Hello, World!Hello, World!
Hello, World!
Hello, World!
Hello, World!
而第二种方法则会稍微麻烦一点:
namespace :demo do # ... desc "Print 'Hello, World!' five times" task :say_five_hello do 5.times do Rake::Task['demo:say_hello'].reenable Rake::Task['demo:say_hello'].invoke end end end
再次执行rake task, 同样能够得到预期结果:
$ rake demo:say_five_hello => Hello, World!Hello, World!
Hello, World!
Hello, World!
Hello, World!
未完待续
针对重复调用的行为上的不同只是invoke以及
execute方法之间的一个基本差异而已,那第一种方案跟第二种方案的差异又有什么不同?在带参数的情况下,又该如何考虑两个方法之间的差异?
Rake::Task source code
相关文章推荐
- 注意Rake Task中invoke方法跟execute方法的不同
- 注意Rake Task中invoke方法跟execute方法的不同
- conn.execute、rs.open、command.execute方法用法大大不同
- BeginInvoke、ThreadPool、Task三类异步方法的区别和速度比较
- struts2.0-注意事项1则-action中setter-getter方法与bean class文件的getter-setter不同!!
- 使用PreparedStatement的execute方法需要注意的问题
- 需要注意的subList方法!和substring是不一样的!从源码解释他们的不同。
- SSIS 无视 Execute Package task 控件的错误, 不会导致整个package报错的方法
- ThinkPHP多个数据库 配置文件怎么写呀? 特别注意两个数据库的表前缀不同时,怎么写表前缀,两种方法!!
- 不同浏览器中nextSibling方法注意事项
- BeginInvoke、ThreadPool、Task三类异步方法的区别和速度比较
- 返回多个不同类型参数的值(out)可变参数一维数组( params )把值从方法中带出(ref) 方法递归(方法自己调用自己与循坏类似注意return每次只能跳出一个方法))
- Activity singleTask需要注意onResume()方法内获取Intent
- 不同线程间通信,使用Control的Invoke和BeginInvoke的方法
- JAVA中两个不同对象的equals方法使用注意点
- (NYoj 325 zb的生日 和 456 邮票分你一半) 两个一样的题目不同的处理方法。(注意看题目中参数的较小值)
- 用Spring和EHCache实现方法结果缓存所注意的问题
- 创建Text文件,使用不同的编码会造成生成乱码的现象和解决方法
- 通过一条sql语句访问不同数据库服务器中的数据库对象的方法(转载)
- [原创]oracle9i连接asp.net方法及注意点