2010-03-21 2 views
20

Lors de la création de pierres précieuses, je l'ai souvent une structure de répertoires comme ceci:Cleanest/One-liner façon d'exiger tous les fichiers dans le répertoire Ruby?

|--lib 
    |-- helpers.rb 
    `-- helpers 
     |-- helper_a.rb 
     `-- helper_b.rb 

A l'intérieur du helpers.rb, je suis juste require -ment les fichiers dans le répertoire helpers. Mais je dois faire des choses comme ceci:

$:.push(File.dirname(__FILE__) + '/helpers') 
require 'helper_a' 
require 'helper_b' 

Y at-il un moyen de faire cette ligne, donc je ne dois ajouter? Je suis juste venu avec ce très rapide:

dir = File.join(File.dirname(__FILE__), "helpers") 
Dir.entries(dir)[2..-1].each { |file| require "#{dir}/#{file[0..-4]}" } 

Mais c'est deux lignes et moche. Quelles astuces astucieuses avez-vous faites pour en faire un seul paquebot?

+1

en double de http://stackoverflow.com/questions/735073/best- way-to-require-all-files-from-a-directory-in-ruby - utilise 'Dir ["/chemin/vers/répertoire/*. rb "]. chaque {| fichier | require file} ' –

+0

Encore plus agréable, utilisez la gemme require_all mentionnée dans cette question. – clacke

Répondre

50
project_root = File.dirname(File.absolute_path(__FILE__)) 
Dir.glob(project_root + '/helpers/*') {|file| require file} 

Ou au golf un peu plus:

Dir.glob(project_root + '/helpers/*', &method(:require)) 
+0

ouais, c'est malade. Merci mec. –

+0

Je n'aurais pas pensé à la méthode # to_proc, sympa! – severin

+0

J'aurais besoin de comprendre les caractères génériques ... mais +1 et merci pour le temps que vous m'avez sauvé ...: D – Stefan

0

Salut la manière la plus propre que je l'ai découvert est d'utiliser Dir.glob avec des cartes sauvages.

Mettez ce qui suit dans votre rakefile:

gem.files = Dir.glob('lib/**/ *.rb') 

Il faut travailler un régal.

+2

Cela n'a pas répondu à la question concernant l'utilisation de require. – phatmann

3

J'aime require_relative:

Dir.glob('lib/**/*.rb') { |f| require_relative f } 

La méthode `& (: require_relative) astuce ne fonctionne pas avec require_relative. Je reçois:

`require_relative': cannot infer basepath (LoadError) 

Mais il ne sauve les tracas de l'informatique project_root

J'utilise ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-darwin12.5.0]

+0

en relation: https://bugs.ruby-lang.org/issues/4487 – quinn

0
# helpers.rb 
Dir[__dir__ + '/helpers/*'].each &method(:require) 
Questions connexes