2016-12-29 3 views
3

Ich baue eine cli mein Juwel Projekte Bootstrap up Einstellung Minitest, zu schützen, travis, git etc ...Pass Lambda als Argument Aufgabe rechen

Ich plante auf Rake verwenden, weil Ich mag, wie Es behandelt Abhängigkeiten, Shell-Befehle und Bereinigung.

Zuerst erstelle ich die Verzeichnisstruktur eines "Typs" des Projekts (Edelstein, Gli, Methadon in diesem Fall), dann Rendern aller erb Dateien im Verzeichnis template für Projekt.

Wie gezeigt methadone => gem und gli => gem aber methadone !=> gli. Das bedeutet, methadone benötigt alle Dateien von gem, kann jedoch neue Dateien/Verzeichnisse hinzufügen und auch vorhandene Dateien/Verzeichnisse ändern.

Ich mag, wie einfach es für mich ist, diese Abhängigkeiten mit Rake-Aufgaben auszudrücken.

Aber ich finde es seltsam, dass ich den gleichen Code in 3 verschiedenen Orten zu schreiben, wie unten dargestellt:

Code:

require 'rake' 
require 'rake/clean' 

desc "Bootstrap gem" 
task :gem, [:project_name] do |t, args| 
    Project.new(t.name, args.project_name).bootstrap 
end 

desc "Bootstrap methadone" 
task :methadone, [:project_name] => :gem do |t, args| 
    Project.new(t.name, args.project_name).bootstrap 
end 

desc "Bootstrap gli" 
task :gli, [:project_name] => :gem do |t, args| 
    Project.new(t.name, args.project_name).bootstrap 
end 

class Project 
    attr_reader :project_name, :template_name 
    def initialize template_name, project_name 
    @project_name = project_name 
    @template_name = template_name 
    end 

    def bootstrap 
    create_project_dirs 
    render 
    end 

    def create_project_dirs 
    puts "Copying dirs from #{template_dir} to #{project_dir}" 
    end 

    def render 
    puts "Rendering #{project_name} templates..." 
    end 

    def template_dir 
    File.expand_path(File.join(__dir__, "templates", template_name)) 
    end 

    def project_dir 
    File.expand_path(File.join(__dir__, project_name)) 
    end 
end 



CLEAN.include('templates') 

template_files = %w(templates/gem/foo.erb templates/gem/bar.erb templates/methadone/foo.erb templates/gli/foo.erb) 
template_files.each do |f| 
    file f do |t| 
    path = t.name 
    mkdir_p File.dirname path 
    touch path 
    end 
end 

desc "Setup tmp project" 
task :setup => template_files 

Strukturdatei:

$ tree . 
. 
├── Rakefile 
├── some.rake 
└── templates 
    ├── gem 
    │   ├── bar.erb 
    │   └── foo.erb 
    ├── gli 
    │   └── foo.erb 
    └── methadone 
     └── foo.erb 

4 directories, 6 files 

Ist es möglich, eine Rake-Aufgabe zu machen, die im Kontext der Aufgabe ausgeführt werden kann, die sie aufgerufen hat, und Args nehmen?

Dann denke ich, dass ich eine neue Aufgabe haben könnte wie:

desc "Bootstrap gem" 
task :gem, [:project_name] => :bootstrap ?? 

desc "Bootstrap methadone" 
task :methadone, [:project_name] => [:gem, :bootstrap] 

desc "Bootstrap gli" 
task :gli, [:project_name] =>[:gem, :bootstrap] 

task :bootstrap ?? 
    Project.new(t.name, args.project_name).bootstrap 
end 

Ausgang:

$ rake methadone['some_gem'] 
Copying dirs from /Users/max/Dropbox/work/tmp/devify_dependency/templates/gem to /Users/max/Dropbox/work/tmp/devify_dependency/some_gem 
Rendering some_gem templates... 
Copying dirs from /Users/max/Dropbox/work/tmp/devify_dependency/templates/methadone to /Users/max/Dropbox/work/tmp/devify_dependency/some_gem 
Rendering some_gem templates... 

Aber wie es steht, weiß ich nicht, wie :bootstrap über die Aufgaben zu erzählen, die sie aufgerufen oder wie man die Argumente von der Aufgabe, die es nannte, übergibt.

Antwort

2

Wenn ich richtig verstanden, was Sie erreichen wollen, ist es ein sehr einfaches Refactoring:

BOOTSTRAP = lambda do |t, args| 
    Project.new(t.name, args.project_name).bootstrap 
end 

desc "Bootstrap gem" 
task :gem, [:project_name], &BOOTSTRAP 

desc "Bootstrap methadone" 
task :methadone, [:project_name], &BOOTSTRAP 

desc "Bootstrap gli" 
task :gli, [:project_name] => :gem, &BOOTSTRAP