在 ruby 上实现 DSL 以生成嵌套文件夹和文件结构

Implementing a DSL on ruby to generate nested folders and files structure

我正在开发自定义 DSL 以在树状结构中生成文件夹和文件

DSL (folders_tree.rb)

FoldersFilesGenerator::DSL.setup do
  root_folder_1 do

    root_folder_file_1

    subfolder_1 do

     subfolder_file_1
     subfolder_file_2

       sub_subfolder do
         ...
       end
    end

    subfolder_2 do
      ...
    end
    root_folder_file_2
  end

  root_folder_2 do
    ...
  end
end

发电机

PATH = 'path/to/folders_tree.rb'

#FoldersFilesGenerator::Generator.new.generate
def generate
  instance_eval(File.read(PATH), File.basename(PATH), 0)
end

DSL 处理器

module FoldersFilesGenerator
  class DSL

    attr_accessor :current_path

    def self.setup(*args, &block)
      new.instance_eval &block
    end

    def initialize
      @current_path = 'initial/root/folder'
    end

    def method_missing(m, *args, &block)
      if block_given?
        #need help here
        self.current_path = renew_path(@current_path)
        FileUtils.mkdir_p current_path #create nested folder
        instance_eval(&block)
      else
        FileCreator.create(m, @current_path) #create file on a current tree level
      end
    end


  private

  def renew_path(current_path)

  end

  end
end

我假设我的工作路径只有在我深入研究或出现在我的 DSL 块树结构上时才会改变,所以我需要用 renew_path 方法重新分配我的 current_path,但我完全搞砸了我的代码在这里。请帮忙。

解决方案可以完全不同。我只需要我的 DSL 像我描述的那样工作。

谢谢。

不确定您想要renew_path做什么。它应该像这样简单:

if block_given?
  remembered_path = current_path
  self.current_path = File.join(current_path, m.to_s)
  FileUtils.mkdir_p current_path #create nested folder
  instance_eval(&block)
  self.current_path = remembered_path
else