我的第一关rake文件

早就想找个机会写写rake文件,但是接触到的项目都不怎么需要,所以一直也没有去学习一下。这两天一个项目需要把客户给的很多excel文件导入到数据库中(我用的好似MySQL),到网上找了一些工具,感觉都不好,因为客户的excel格式比较乱(特别是日期的格式,竟然是中文数字和阿拉伯数字都有的...),所以就想干脆仔细写一个算了。这是正好想到可以顺便学习一下rake,于是就动手啦。

网上关于rake的文章有不少。如果想快速上手,那么Rails Envy的[url=http://www.railsenvy.com/2007/6/11/ruby-on-rails-rake-tutorial#rails_models]Ruby on Rails Rake Tutorial[/url]是绝佳的入门教程;如果想从更高的角度理解rake,那么当然要看Martin Fowler大大的[url=http://martinfowler.com/articles/rake.html]Using the Rake Build Language[/url]了。

好了,看完了入门教程,开始动手!先去看看rails项目根目录下的Rakefile这个文件,里面就是require了一大堆东西,没什么意思,有用的反而是文件开头的注释:

# Add your own tasks in files placed in lib/tasks ending in .rake,
# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.

明白了吧,把rake文件写成.rake扩展名的,然后放到lib/tasks下面,rails就可以自动加载你的rake文件了。于是到lib/tasks下面创建我的文件data.rake:

require "lib/data_importer.rb"

namespace :eva do
desc 'Import init data from csv files.'
task :import_data => :environment do
DataImporter.import_teachers
end
end

以上代码非常容易理解,这也多亏了ruby强大的DSL能力。我就是创建了一个名为import_data的任务,然后在这个任务里面调用我自己写的DataImporter中的方法把excel中的数据导入到数据库中。

namespace用来为任务创建一个名字空间,这样我写的import_data任务就是eva:import_data,别人也可以在其它名字空间下创建相同名字的任务。rake db:migrate中的db就是这么个名字空间。

而:import_data => :environment这里声明了任务间的依赖关系,也就是import_data依赖于enviroment。那么enviroment是什么呢?执行一下rake --tasks查看所有的rake任务,没有叫这个名字的任务啊。怎么回事儿呢?其实你可以在RUBY_ROOT/lib/ruby/gems/1.8/gems/rails-<version>/lib/tasks下面找到一个rails自带的所有rake文件,打开其中的misc.rake,内容如下:

task :default => :test
task :environment do
require(File.join(RAILS_ROOT, 'config', 'environment'))
end

那么environment任务实际上是把当前rails项目的整个环境加载进来,这样就可以使用model啊、ActionSupport啊之类的东西了。

那么为什么这个任务在rake --tasks中没有显示呢?那是因为这个任务没有响应的描述(可以理解为注释)。看看misc.rake和我的rake文件的区别就能发现,我的rake文件在任务前面有一行desc语句,它用来描述任务是做什么的,只有加了描述的任务才会在rake --tasks产生的列表中出现。

有人可能会问,这不是很让人迷惑吗?可以显示这些任务,同时描述部分显示为空就好了啊。其实不然,从逻辑上看,不加desc的task应该是程序内部使用的,不应该被其它人使用,例如environment这个task,用来加载rails环境,如果显示在rake --tasks中,万一被别人滥用了,就不好了,所以最好不要显示,干脆让别人不知道有这个东东。这样一来,意在让别人使用的task可以加desc,不想让别人使用的task不加desc(可以加单纯的注释),岂不是两全其美?
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值