2015-06-30 2 views
0

Как написать задачу rake для запуска установки пакета в другом проекте? У меня есть создать проект с помощью только грабли, и письменные задания, как этотrake task для выполнения установки пакета в другом проекте

task :bundle do 
    projects.each do |name, repo| 
    if Dir.exists?("../#{name}") 
     exec("cd ../#{name} && bin/bundle install") 
    end 
    end 
end 

Но когда я запускаю это я получаю:

Using rake 10.3.2 
Using bundler 1.9.6 
Bundle complete! 1 Gemfile dependency, 2 gems now installed. 
Use `bundle show [gemname]` to see where a bundled gem is installed. 

Что выглядит хорошо на первом, но на самом деле bundle install для текущий проект только для рейка, а не проект целевых рельсов.

Я также попытался вернуться клещами

puts `cd ../#{name} && bin/bundle install` 

Но он сделал то же самое. Я также попробовал только bundle install вместо bin/bundle install, но это не сработало.

Когда я запускаю его на команду, как непосредственно он делает то, что я ожидал:

Using rake 10.4.2 
Using CFPropertyList 2.3.1 
... 
... 
Using turbolinks 2.5.3 
Using uglifier 2.7.1 
Bundle complete! 34 Gemfile dependencies, 120 gems now installed. 
Use `bundle show [gemname]` to see where a bundled gem is installed. 

Как я могу получить это сделать правильно bundle install?

ответ

1

Пара вещей, чтобы отметить на этом

bin/bundle будет работать только если bundle файлы существует в bin каталоге

  • существует ряд различных методов для выполнения команд в оболочке
    • exec('echo "Hello World"') - запускает команду и заменяет ее текущим процессом.
    • system('echo "Hello World"') - запускает команду в субоболочке и фиксирует код состояния выхода
    • `echo "hello world"` - запускает команду в субоболочке и захватывает весь вывод в STDOUT и STDERR, но не код состояния выхода.

К, почему он не работает

Вы должны предоставить Bundler с чистой окружающей средой, так что знает, что вы пакетирование другого проекта. окружайте команды в рамках вашей рейк-задачи с помощью блока Bundler.with_clean_env следующим образом:

task :bundle do 
    Bundler.with_clean_env do 
    projects.each do |name, repo| 
     if Dir.exists?("../#{name}") 
     exec("cd ../#{name} && bundle install") 
     end 
    end 
    end 
end