Как я могу динамически включать модули во вложенные каталоги? - PullRequest
0 голосов
/ 19 января 2012

Я хочу динамически загружать код путем обхода структуры каталогов и динамически загружать все найденные там модули.

Цель этого - запустить серию проверок.Если проверка верхнего уровня завершится неудачно, любые дочерние проверки не будут запущены.

Я думал, что объект контроллера может сканировать каталоги, создавать иерархию модулей и затем принимать решения о том, следует лиОбход определенной части дерева, основанный на успехе / неудаче проверок более высокого уровня.

Например, у меня может быть серия проверок, которые я хочу выполнить с регулярным выражением, однако ни одна из проверок не должназапускаться, если регулярное выражение не существует или пусто.В этом случае каталог верхнего уровня будет содержать только проверку exists, а дочерний каталог будет содержать все другие проверки, которые будут выполняться, если существует регулярное выражение.

Возможность определять эти проверки в отдельных файлахи создание необходимой иерархии было бы чрезвычайно полезно для простоты добавления дополнительных проверок позже, вместо того, чтобы взламывать существующий класс и добавлять методы.

Есть ли способ, которым приложение может динамически сканировать каталог, сохраняяимена файлов в коллекции, а затем использовать элементы этой коллекции в требовании?Я так не думаю.А как насчет нагрузки?

Есть ли способ добиться такого дизайна?Или я думаю обо всем этом неправильно, и мне следует подумать о какой-то другой методологии?

1 Ответ

1 голос
/ 19 января 2012

Ваш запрос очень выполним, но ни один язык не сделает это автоматически. Вы должны написать код, чтобы погрузиться в каталоги, определить наличие тестов, а затем решить, следует ли углубляться в детали.

Руби поможет вам, хотя. Существует модуль Find, который входит в стандартную библиотеку. Это из его документов:

The Find module supports the top-down traversal of a set of file paths.

For example, to total the size of all files under your home directory,
ignoring anything in a "dot" directory (e.g. $HOME/.ssh):

      require 'find'

      total_size = 0

      Find.find(ENV["HOME"]) do |path|
        if FileTest.directory?(path)
          if File.basename(path)[0] == ?.
            Find.prune       # Don't look any further into this directory.
          else
            next
          end
        else
          total_size += FileTest.size(path)
        end
      end

Из этого кода вы будете искать подписи файлов и вложенных папок, чтобы решить, стоит ли углубляться в детали. Для каждого найденного файла, который вам нужен, используйте require для его загрузки.

Вы можете найти другие примеры в интернете, показывающие, как люди используют Find. Также модуль Dir имеет аналогичные функциональные возможности, используя glob, только вы должны указать ему, куда спускаться, а затем можете перебирать возвращаемые результаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...