Ładowanie plików rake i uruchamianie zadań z innych plików

Obecnie staram się podzielić moje pliki rake, aby lepiej je zorganizować. W tym celu dodałem folder rake do katalogu assets, który zawiera jeden plik rake dla każdej grupy zadań.

Ponieważ pochodzę z PHP, mam tylko bardzo podstawową znajomość Ruby/Rake i nie mogę uruchomić domyślnej akcji w moich przestrzeniach nazw po załadowaniu pliku.

The commented out Rake :: Task ... - string inside app:init rzuca błąd w CL na mnie:

rake aborted! 
uninitialized constant TASK

Oto przestrzeń nazw / Klasa (jeśli jest to właściwe słowo).

task :default => [ 'app:init' ]
namespace :app do

    rake_dir   = "#{Dir.pwd}/assets/rake/"
    rake_files = FileList.new( "#{rake_dir}*" )

    desc "Loads rake modules (Default action)"
    task :init do
        puts "\t Importing rake files for processing"

        puts "\t loading..."
        rake_files.each() { |rake|
            puts "\t #{rake}"
            require rake
            # @link rubular.com
            name = rake.split( rake_dir ).last.gsub( /.rb\z/, '' )
            puts "\t #{name}"
            #Rake :: Task[ "#{name}:default" ].invoke
        }
    end
end
Z góry dziękuję.

Edit: przynajmniej mogę być pewien, że plik zostanie załadowany, ponieważ zwykły puts "file loaded" na początku tych plików odbija się echem. Problem wygląda na to, że tylko polega na tym, że akcja :default dla przestrzeni nazw w załadowanym pliku rake nie ładuje się.

Author: kaiser, 2012-12-07

3 answers

Jeśli twoim celem jest załadowanie zadań rake z zewnętrznego pliku, możesz to zrobić w następujący sposób. Po pierwsze, powiedzmy, że masz zadanie rake w pliku o nazwie <project>/lib/tasks/hello.rake, który wygląda tak:

desc "Say hello"
task :hello do 
  puts "Hello World!"
end

Następnie możesz utworzyć prosty Rakefile w swoim katalogu <project>, aby załadować go w następujący sposób:

Dir.glob('lib/tasks/*.rake').each { |r| load r}

desc "Say goodbye"
task :goodbye do
  puts "See you later!"
end

Oczywiście spowoduje to załadowanie wszystkich plików kończących się rozszerzeniem rake. Możesz po prostu załadować hello.rake w następujący sposób:

load './lib/tasks/hello.rake'

desc "Say goodbye"
task :goodbye do
  puts "See you later!"
end

Aby zobaczyć wszystkie załadowane zadania użyj rake -T. Zauważ, że Używałem lib/tasks, ponieważ jest to standardowe podejście stosowane przez aplikacje Rails. Możesz użyć assets lub cokolwiek wolisz, chociaż ja wolę lib/tasks nawet w projektach innych niż Rails. Mam również tendencję do oddzielania plików zadań na podstawie ich przestrzeni nazw.

 35
Author: Aaron Massey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-27 22:35:37

Możesz umieścić swoje zadania w folderze rakelib/, który domyślnie ładuje się rake lub dodać określony folder w swoim Rakefile Poprzez:

Rake.add_rakelib 'lib/tasks'
 41
Author: splattael,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-06 09:05:58

Zawsze możesz użyć Rake.add_rakelib 'tasks', jak powiedział @splattael. Jedno musisz wiedzieć, pliki w katalogu 'zadania' muszą mieć rozszerzenie '.grabie "zamiast".rb', inaczej rake nie załaduje go za Ciebie.

Przykładowy plik:

Po wykonaniu wszystkich powyższych czynności użyj rake -T, aby sprawdzić, czy rake załadował Twoje zadania z powodzeniem.

 4
Author: Xiao Hanyu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-04 10:15:36