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.