我正在尝试编写一个方法,该方法将对服务器上现有的文件执行一些文件操作。例如:从源复制到目标,符号链接文件,读取文件等。这里我需要处理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
答案 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/