Как связать установку через системный вызов CLI / Ruby? - PullRequest
5 голосов
/ 22 ноября 2011

Можно ли запустить установку пакета из системного вызова ruby?

Я пытаюсь установить гемы и запустить тесты для проекта по другому пути ...

Например,Команда:

"cd /some/other/project && bundle install && gem list && rspec spec"

В идеале я хочу просто запустить тесты через файл rake в одном проекте, убедившись, что установлены соответствующие гемы для этого проекта.

Кажется, что CDработает правильно, если я запускаю:

"cd /some/other/project && pwd"

Это дает правильный путь.Но если я делаю пакетную установку && gem environment, кажется, что он устанавливает gems для текущей папки и не использует Gemfile из другого проекта, и впоследствии спецификация rspec не работает.

Подводя итогкаков наилучший способ запустить, например, rspec spec, для другого проекта в пределах rakefile, также обеспечивающего доступность соответствующих гемов?

Ответы [ 3 ]

6 голосов
/ 20 сентября 2012

На самом деле похоже, что официальный способ добиться такого поведения выглядит так:

Bundler.with_clean_env do
  system "shell out"
end    

Я нашел ответ в группах Google: https://groups.google.com/d/msg/ruby-bundler/UufhzrliWfo/d51B_zARksUJ

0 голосов
/ 31 января 2014

В дополнение к ответу Канггуру, вам может понадобиться сделать

bundle install --deployment

, чтобы Bundler.with_clean_env не запутался в rvm.Это устанавливает копии всех ваших драгоценных камней в .vendor / bundle в корне вашего проекта, который затем выбирается командой Bundler.with_clean_env.

(Я бы поставил это как комментарий, но я этого не делаюрепутация более 50)

0 голосов
/ 17 августа 2012

Edit: Я думаю, у меня есть это выяснить. посмотрите, работает ли это для вас:

#@pwd is the "working directory of the execution...

Dir.chdir @pwd do
  so = ""
  vars = {
         "BUNDLE_GEMFILE" => nil,
         "BUNDLE_BIN_PATH" => nil,
         "RUBYOPT" => nil,
         "rvm_" => nil,
         "RACK_ENV" => nil,
         "RAILS_ENV" => nil,
         "PWD" => @pwd 
       }
  options = {
            :chdir=>@pwd
          }
  Open3.popen3(vars, cmd, options) do |stdin, stdout, stderr|
    stdin.close_write
    so = stdout.read
    so = stderr.read if so.nil? || so == ""
  end

  so
end

Исходное сообщение: Я рву на себе волосы этим. Я думаю, что это как-то связано с переменными среды установки пакета exec | install | update при запуске приложения, я попробовал

bash -c "cd ../other/; bundle install; and it fails" Я пытался использовать open3.popen ("установка пакета",: chdir => "../ other")

Если это утешает, ты не сумасшедший, но я не могу понять, как это исправить.

я тоже пробовал open3.popen ("установка пакета", {: chdir => "../ other",: unsetenv_others => false}) но это в итоге приводит к удалению RVM из системного пути;

...