2012-09-30 3 views
7

Mon but est de copier un ensemble de fichiers spécifié par un modèle dans le répertoire cible. Les fichiers du répertoire source peuvent avoir des sous-répertoires.Copier des fichiers en conservant la structure du répertoire avec rake

J'ai essayé:

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

et

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

mais ni travail.

il ne fonctionne que quand je fais quelque chose comme:

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

Mais je dois copier uniquement les fichiers * .html pas quoi que ce soit d'autre.

J'ai besoin ce que

cp --parents 

commande ne

Tout conseil en utilisant des méthodes existantes Ruby/Rake?

MISE À JOUR Cela ressemble à quelque chose qui est plus facile à faire avec Ant, n'est pas possible avec Ruby/Rake pile - peut-être que je devrais regarder dans autre chose. Je ne veux pas écrire de code personnalisé pour le faire fonctionner dans Ruby. J'ai juste pensé à Ruby/Rake comme solution appropriée pour cela.

MISE À JOUR 2 Voici comment je le fais avec 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

Vous pouvez copier tout, puis supprimez ceux qui ne sont pas .html. Ce serait plus facile, puisque vous n'avez pas besoin de jouer avec les chemins. – d11wtq

+0

@ d11wtq, ce n'est pas une bonne solution car dans ce cas, vous devez faire deux choses supplémentaires: copier les fichiers inutiles, puis supprimer les fichiers inutiles. – Vladimir

Répondre

5

Si vous voulez pur Ruby, vous pouvez le faire (avec un peu d'aide de FileUtils dans la bibliothèque 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

Salut @Mark, je veux une solution Ruby pure, oui. Mais j'aimerais une approche déclarative plus propre. J'ai pensé qu'une telle automatisation est possible avec Ruby/Rake stack sans écrire de code personnalisé. Je voudrais quelque chose de plus déclaratif comme: cp_r (, target) sans avoir besoin d'écrire des méthodes bizarres. On dirait que c'est impossible avec Std. Ruby/Rake stack - et je devrais peut-être me replier sur bash ou sur Ant. – Vladimir

0

Je ne l'ai pas entendu parler de cp --parents, mais si elle fait ce que vous voulez alors il n'y a pas de honte à juste à l'utiliser à partir de votre Rakefile , comme ceci:

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

Salut @David, merci pour vos conseils. Je n'en ai pas entendu parler avant hier aussi :-) Je voudrais une solution plus propre qui n'a pas besoin d'appeler les commandes système mais qui fonctionne en Ruby pur, je pensais que cela pouvait être résolu en Ruby - sinon je peux écrire bash script à la place. – Vladimir

0

Cela pourrait être 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 
Questions connexes