2015-01-08 4 views
0

Я хочу чисто искать различные пути каталога, используя команды оболочки в файле rakefile, присваивать это значение переменной, а затем использовать эту переменную для создания каталогов (и использования в других задачах). Я поставил код sh в задание и сделал вызовы directory в зависимости от задачи (используя вызов file после directory). Однако я не могу использовать переменную где-нибудь вне задачи (даже с ее глобальным).Rakefile - зависимость параметров и каталогов от задачи

$my_root = String.new 

task :find_path do 
    sh %{git rev-parse --show-toplevel} do |pass, res| 
     if ! pass 
     puts "git rev-parse failed, are you in a git repo? (status = #{res.exitstatus})" 
     else 
     $my_root = res 
     end 
    end 
end 

$MY_DIR  = "#{$my_root}/some/sub/dir" 

desc "Create MY_DIR directory" 
directory $MY_DIR 
file $MY_DIR => :find_pmc_path 

Я получаю следующее сообщение об ошибке:

mkdir -p /some/sub/dir 
rake aborted! 

Когда я копать дальше, $ my_dir не получает назначенную правильно. Если я помещаю это назначение переменной в задачу, я получаю ошибку undefined method 'length' for nil:NilClass.

Как я могу найти информацию, назначить переменную и использовать ее в нескольких других задачах в файле rakefile?

+0

После экспериментов дальше, я понимаю, что 'ш 'не возвращает результат std_out команды. –

ответ

1

Это кажется хорошим прецедентом для namespace декларации:

namespace :top do 
    mydir = 'my_root' 
    task :find_path do 
    puts mydir 
    end 

    task :delete do 
    puts mydir 
    end 
end 

find_task:

rake top:find_path 
=> my_root 

удаления задачи:

rake top:delete 
=>my_root 
+0

Являются ли глобальные переменные видимыми только в пространстве имен (по сравнению со всем файлом rakefile)? Это кажется странным ... –