如何在Ruby中更有效地编写远程/本地服务器文件操作方法?

时间:2016-09-01 19:45:51

标签: ruby

我正在尝试编写一个方法,该方法将对服务器上现有的文件执行一些文件操作。例如:从源复制到目标,符号链接文件,读取文件等。这里我需要处理2个场景,即服务器可以是本地的或远程的。

在远程服务器方案中,我连接到服务器(使用net / ssh),然后使用exec方法运行shell命令。对于本地服务器,因为我不需要建立任何连接,所以我使用Ruby FileUtils方法。我已粘贴这段代码供您参考。

我想检查是否有人可以建议我更有效地编写此方法。

def create_link
 begin
   if self.particular_file_exists?
     if !@ssh.local
       @ssh.exec!("ln -s file1 file1-dump")
     else
       FileUtils.ln_sf("file1", "file1-dump")
    end
  end
  rescue => e
    $LOG.log(2, "Error occurred")
  end
end

2 个答案:

答案 0 :(得分:2)

我无法谈论性能优化,但我认为这是一个更易于维护/可扩展的代码。在每个该死的方法中,你都不需要所有那些本地/远程分支机构。相反,将环境特定的行为提取到他们自己的对象中并将工作委托给他们。像这样:

class FileManipulator
  attr_reader :handler

  def initialize(ssh)
    @handler = ssh? RemoteHandler.new(ssh) : LocalHandler.new
  end

  def create_link
    handler.create_link if handler.particular_file_exists?
  rescue => e
    $LOG.log(2, "Error occurred")
  end

  RemoteHandler = Struct.new(:ssh) do
    def create_link
      ssh.exec!("ln -s file1 file1-dump")
    end
  end

  LocalHandler = Struct.new do
    def create_link
      FileUtils.ln_sf("file1", "file1-dump")
    end
  end
end

答案 1 :(得分:1)

快速编辑:

def create_link
  return unless self.particular_file_exists?
  if @ssh.local
    FileUtils.ln_sf "file1", "file1-dump"
  else
    @ssh.exec! "ln -s file1 file1-dump"
  end
rescue
  $LOG.warn "Error occurred"
end

对于更深层次的想法,您应该问https://codereview.stackexchange.com/