2014-05-19 1 views
0

Dans mon projet Rails, j'ai une liste spécifique de fichiers externes que je veux traiter en utilisant Rake. Mon objectif est d'être en mesure de spécifier le répertoire source de ces fichiers comme argument comme ceci:Rake: traitement de fichiers dans un répertoire source spécifié

rake foofiles:process[vendor/sources] 

Actuellement, je suis en spécifiant les noms de fichiers (et leurs chemins relatifs dans le répertoire source) à l'aide d'un FileList affecté à une constante:

REQUIRED_FILES = FileList[ 
    'blah.csv', 
    'subdir/something.csv', 
    'subdir/monkeys/foo.bar', 
    ... 
] 

Comment puis-je préfixer chacun de ces fichiers avec mon argument répertoire source afin que je puisse faire une tâche qui dépend de ces fichiers existants dans ce répertoire? (Idéalement rien ne se passerait sans tous ces fichiers étant présents)

Par exemple, si je la commande rake comme tapé ci-dessus, je dois ma tâche dépendre vendor/sources/blah.csv, vendor/sources/subdir/something.csv, vendor/sources/subdir/monkeys/foo.bar etc.

Edit: Ajouter un préfixe à chaque élément d'un tableau/liste est relativement trivial, je suis plus confus sur la façon de structurer mes tâches et leurs dépendances afin que je puisse accéder à l'argument du dossier source que j'ai fourni, puis utiliser le nouvelle liste de fichiers ajoutée en tant que dépendance pour la tâche de traitement qui effectue le travail.

La tâche principale est Invoqué va devoir ressembler à ceci si je veux la syntaxe je en haut:

namespace :foofiles do 

    task :process, [:source_directory] => [???, my_newly_prepended_file_list] do |t, args| 
    # Do stuff 
    end 

end 

Mais je ne sais pas comment fournir l'argument :source_directory à une tâche Cela fait l'ajout de la liste des fichiers ajoutés à la tâche :process en tant que dépendance.

+0

Que voulez-vous dire par « je besoin de ma tâche à dépendre de fournisseurs/sources/blah.csv, fournisseur/sources/subdir/something.csv, fournisseur/sources/subdir/singes/foo. barre etc "? Vous voulez que ces fichiers soient passés en argument de votre tâche rake, ou parlez-vous de dépendances entre des tâches rake, ou quelque chose de complètement différent? –

Répondre

0

J'ai fini juste en utilisant une variable d'environnement, il est beaucoup plus facile de travailler dans mon cas que l'argument intégré Rake mise en œuvre. De cette façon, je peux travailler avec la variable et construire mon FileList avec le chemin Prepended (de la manière Cameron a suggéré dans l'autre réponse) en dehors d'un bloc de tâche:

namespace :foofiles do 

    REQUIRED_FILES = [...] 
    source_directory = ENV['SOURCEDIR'] || 'vendor/sources' 

    source_files = FileList[REQUIRED_FILES.map { |relative_path| File.join source_directory, relative_path }] 
    # Note: FileList can take an array inside the square brackets without needing the splat (*) operator 

    task process: source_files do 
    ... 
    end 

end 

Alors maintenant, je peux l'appeler à partir du terminal comme celui-ci :

SOURCEDIR=some/folder rake foofiles:process 
1

Pourquoi ne pas simplement conserver un tableau des suffixes, puis ajouter l'argument au début de chaque élément dans le tableau, puis créer la liste de fichiers?

suffixes = [ 
    'blah.csv', 
    'subdir/something.csv', 
    'subdir/monkeys/foo.bar', 
] 

files = suffixes.map { |suffix| File.join(prefix, suffix) } 

file_list = FileList[*files] 

prefix est l'argument transmis.

+0

J'ai modifié ma question. Je suis plus confus au sujet de la structure globale des tâches/dépendances en ce qui concerne mon cas. – Inkling

Questions connexes