2012-09-30 12 views
7

Il mio obiettivo è copiare un set di file specificato da un pattern nella directory di destinazione. I file nella directory sorgente possono avere sottodirectory.Copia i file mantenendo la struttura delle directory con rake

ho provato:

cp_r(Dir.glob('**/*.html'), @target_dir): 

e

cp_r(FileList['**/*.html'], @target_dir): 

ma né lavoro.

funziona solo quando faccio qualcosa di simile:

cp_r(Dir['.'], @target_dir): 

Ma ho bisogno di copiare solo i file * .html non altro.

ho bisogno di quello che

cp --parents 

comando non

Qualche consiglio con metodi/Rake di Ruby esistenti?

UPDATE Sembra che la cosa più facile da fare con Ant, non sia possibile con lo stack Ruby/Rake - potrebbe essere necessario esaminare qualcos'altro. Non voglio scrivere codice personalizzato per farlo funzionare in Ruby. Ho appena pensato a Ruby/Rake come soluzione appropriata per questo.

UPDATE 2 Questo è come lo faccio con Ant

<target name="buildeweb" description="Builds web site" depends="clean"> 
    <mkdir dir="${build.dir.web}" /> 

    <copy todir="${build.dir.web}" verbose="true"> 
     <fileset dir="${source.dir.web}"> 
      <include name="**/*.html" /> 
      <include name="**/*.htm" /> 
     </fileset> 
    </copy> 

    <chmod perm="a+x"> 
     <fileset dir="${build.dir.web}"> 
      <include name="**/*.html" /> 
      <include name="**/*.htm" /> 
     </fileset> 
    </chmod> 
</target> 
+0

Si potrebbe copiare tutto, quindi eliminare quelli che non sono .html. Sarebbe più facile, dal momento che non hai bisogno di smanettare con i percorsi. – d11wtq

+0

@ d11wtq, questa non è una buona soluzione perché in questo caso è necessario fare due cose aggiuntive: copiare i file non necessari, quindi eliminare i file non necessari. – Vladimir

risposta

5

Se volete puro Ruby, si può fare questo (con un piccolo aiuto da fileutils nella libreria standard).

require 'fileutils' 

Dir.glob('**/*.html').each do |file| 
    dir, filename = File.dirname(file), File.basename(file) 
    dest = File.join(@target_dir, dir) 
    FileUtils.mkdir_p(dest) 
    FileUtils.copy_file(file, File.join(dest,filename)) 
end 
+1

Ciao @ Mark, voglio pura soluzione Ruby, sì. Ma mi piacerebbe un approccio dichiarativo più pulito. Ho pensato che tale automazione sia possibile con lo stack Ruby/Rake senza scrivere codice personalizzato. Vorrei qualcosa di più dichiarativo come: cp_r (, target) senza la necessità di scrivere metodi strani. Sembra che sia impossibile con Std. Stack di Ruby/Rake - e potrei aver bisogno di ripiegare su bash o Ant. – Vladimir

0

non ho sentito parlare di cp --parents, ma se lo fa ciò che si vuole allora non c'è vergogna nel usando solo dalla vostra Rakefile , in questo modo:

system("cp --parents #{your} #{args}") 
+0

Ciao @ David, grazie per il consiglio. Non ne ho mai sentito parlare prima di ieri :-) Vorrei una soluzione più pulita che non ha bisogno di chiamare comandi di sistema ma lavorare in puro Ruby, ho pensato che questo potesse essere risolto in Ruby - altrimenti posso scrivere bash script invece. – Vladimir

0

Questo potrebbe essere utile:

# copy "files" to "dest" with any sub-folders after "src_root". 
def copy_and_preserve files, dest, src_root 
    files.each {|f| 
    f.slice! src_root # the files without src_root dir 
    dest_dir = File.dirname(File.join(dest, f)) 
    FileUtils.mkdir_p dest_dir # make dest dir 
    FileUtils.cp(File.join(src_root, f), dest_dir, {:verbose => true}) 
    } 
end