Ruby 如何一次运行多个rake任务?

Ruby 如何一次运行多个rake任务?,ruby,rake,rake-task,Ruby,Rake,Rake Task,我正在使用一个Rake任务,它运行多个抓取脚本,并将一个站点的35个不同城市的类别数据导出到35个不同的CSV文件 我遇到的问题是,当我从文件夹的根目录运行master Rake任务时,它会在父目录“resultsForCity.csv”中创建一个新文件,而不是查看给定子文件夹中的当前csv文件并向其中添加数据。为了解决这个问题,我认为我应该让我的主Rake任务(在父目录中)运行从属Rake任务,然后运行刮片脚本,但这也不起作用 但是,如果我将cdcd放入其中一个城市文件夹并从那里运行scrap

我正在使用一个Rake任务,它运行多个抓取脚本,并将一个站点的35个不同城市的类别数据导出到35个不同的CSV文件

我遇到的问题是,当我从文件夹的根目录运行master Rake任务时,它会在父目录“resultsForCity.csv”中创建一个新文件,而不是查看给定子文件夹中的当前csv文件并向其中添加数据。为了解决这个问题,我认为我应该让我的主Rake任务(在父目录中)运行从属Rake任务,然后运行刮片脚本,但这也不起作用

但是,如果我将cd
cd
放入其中一个城市文件夹并从那里运行scraper或Rake任务,它会将数据添加到该子文件夹中相应的CSV文件中。我是否没有明确定义依赖关系或其他东西

我尝试过的事情:

  • 我已经尝试在我的主rake任务中要求每个单独的rakefile
  • 尝试迭代所有文件并加载rake任务,但收到堆栈太深的错误
  • 已尝试在Stackoverflow上搜索7天
以下是我的Rake任务代码:

require "rake"

task default: %w[getData]


task :getData do 

        Rake::FileList.new("**/*.rb*").each do |file| 

         ruby file 

        end 

end 
这是我的代码:

require "nokogiri"

require "open-uri"

require "csv"

url = "http:// example.com/atlanta"

doc = Nokogiri::HTML(open(url))


CSV.open("resultsForAtlanta.csv", "wb") do |csv|

    doc.css(".tile-title").each do |item|
        csv << [item.text.tr("[()]+0-9", ""), item.text.tr("^0-9$", "")] 
    end 

    doc.css(".tile-subcategory").each do |tile|
        csv << [tile.text.tr("[()]+0-9", ""), tile.text.tr("^0-9$", "")]
    end 



end 
需要“nokogiri”
需要“打开uri”
需要“csv”
url=“http://example.com/atlanta”
doc=Nokogiri::HTML(打开(url))
CSV.open(“resultsForAtlanta.CSV”、“wb”)do | CSV|
css文件(“.tile title”)。每个do |项|

csv如果让scraper脚本获取输出文件名并使用目录结构帮助您构建输出文件名,该怎么办

假设你有一个目录树,比如

Atlanta/scraper.rb
LosAngeles/scraper.rb
...
如果scraper.rb是您的刮取脚本,您应该能够像这样编写任务:

task :getData do
  Rake::FileList.new("**/scraper.rb").each do |scraper_script|
    dir = File.dirname(file)
    city = File.basename(dir)
    csv_file = File.join(dir, "resultsFor#{city}.csv")
    ruby [scraper_script, csv_file].join(" ")
  end
end 
然后,您的Ruby脚本可以像这样从命令行中获取文件名:

CSV.open(ARGV[1], "wb") do |csv|
   ...
end

这不是一个真正的Nokogiri或CSV问题。虽然它们在您调用的代码中使用,但它们与并行运行它们的问题无关,因此将它们放在标记中不是必要的,甚至不是一个好主意。