Refatorando algumas tasks dos Rakefiles, precisei executar algumas tarefas de transferência de arquivos via FTP. Tentei usar os módulos socket e net, mas por qualquer motivo eles não estão funcionando no Windows.
Para contornar temporariamente o problema, resolvi usar o cliente FTP limitado que vem com o Windows, e acabei gostando da gambiarra final:
def ftp host, user, pwd raise "Block expected." unless block_given? File.open 'ftp.tmp', 'w' do |f| f.puts "open #{host}", user, pwd yield(f) f.puts 'quit' end system "ftp -s:ftp.tmp && del ftp.tmp" end
Este método foca a simplicidade do código que o chamará, e para isso, espera que seja fornecido um bloco que definirá os comandos FTP:
task :exemplo do ftp "meuservidor.com.br", "login", "senha" do |cmd| cmd.puts "mkdir /home/henrique/tmp" cmd.puts "cd /home/henrique/tmp" cmd.puts "put arquivo.txt" end end
Por limitações do cliente FTP, não é possível fazer um código interativo a partir de uma única conexão, como por exemplo, executar tarefas distintas dependendo do conteúdo verificado em um diretório remoto.
É um snippet bem simples, mas tem se mostrado muito útil por aqui! Quando descobrir porque o socket não funciona eu publico a solução.







