【问题标题】:Running rake task on remote app, use file from local machine在远程应用程序上运行 rake 任务,使用本地机器上的文件
【发布时间】:2016-12-02 05:02:41
【问题描述】:

如何通过 rake 任务参数将 csv 文件或文件流或类似的内容传递给我在远程应用程序上运行的 rake 任务?

所以我可以在文件中获取该文件的内容并对其进行处理。文件不大。

更新

我尝试了 Luc 的建议:

desc 'Test task'
namespace :app do
  task :pipe_file => [:environment] do |t, args|
    puts "START"

    File.open('my_temp_file', 'w') do |f2|
      while line = STDIN.gets
        f2.puts line
      end
    end

    puts "DONE"
  end
end

所以当我跑步时:

cat tst.csv | bundle exec rake app:pipe_file

什么都没有发生,打印空白行

【问题讨论】:

标签: ruby-on-rails ruby rake


【解决方案1】:

您可以将文件的内容通过管道传输到您的 rake 任务:

cat my_file | heroku run rake my_task

然后在您的任务中,您需要从阅读 STDIN 开始:

STDIN.binmode
tmp_file = Tempfile.new('temp_file_prefix',  Rails.root.join('tmp'))
tmp_file.write(STDIN.read)
tmp_file.close
Process tmp_file here.
puts tmp_file.path
tmp_file.unlink

希望对你有帮助!

【讨论】:

  • 嘿,我喜欢你的想法,有没有办法先在本地测试它?我尝试将您建议的代码放入我的任务中并像这样cat my_file | bundle exec rake my_namespace:task 执行,但没有打印任何内容。我能做错什么?
  • 您不会打印任何内容,但应该使用文件内容创建一个文件 my_temp_file。当您远程运行命令时,将在远程机器上执行代码的位置创建文件。你可以只使用文件 my_temp_file 因为它是一个 local_file 在技巧之后。
  • 很好奇,如果在处理完文件后要删除文件,那么将 STDIN 写入文件有什么好处。为什么不直接将 STDIN 保存到变量中?读取/写入 STDIN 到文件是否使用相同或更少的内存?
  • 读取 stdin 比将其保存到文件更好。在这里,我提供了代码,因此您可以保持其余任务不变,并像读取本地文件一样读取文件。但是从内存的角度来看,最好只读取标准输入并从那里进行处理。 (只保存内存中需要的)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-04
  • 1970-01-01
  • 1970-01-01
  • 2014-12-05
  • 2010-11-24
  • 2011-06-17
  • 2018-07-18
相关资源
最近更新 更多