Запуск мастера из рейк-задачи

У меня есть следующая задача Rake:

namespace :foreman do
  task :dev do
    `foreman start -f Procfile.dev`
  end
end

desc "Run Foreman using Procfile.dev"
task :foreman => 'foreman:dev'

Команда forman отлично работает с оболочкой, однако, когда я запускаю rake foreman, я получаю следующую ошибку:

/Users/me/.gem/ruby/2.0.0/gems/bundler-1.5.2/lib/bundler/rubygems_integration.rb:240:in `block in replace_gem': foreman is not part of the bundle. Add it to Gemfile. (Gem::LoadError)
    from /Users/me/.gem/ruby/2.0.0/bin/foreman:22:in `<main>'

Форман конкретно заявляет:

Ruby users should take care not to install foreman in their project Gemfile

Как я могу запустить эту задачу?

Ответ 1

Если вы должны заставить его работать с помощью рейка, попробуйте изменить оболочку с помощью обратного вызова, чтобы использовать жестко закодированный путь к системному двоичному файлу мастера

`/global/path/to/foreman start -f Procfile.dev`

Вам просто нужно использовать "which" или "найти" или аналогичный инструмент для определения пути, который работает вне вашего контекста связки. Если вы используете rbenv, тогда этого может быть достаточно:

$ rbenv which rake
/home/name/.rbenv/versions/1.9.3-p448/bin/rake

Я надеюсь, что это поможет вам двигаться вперед.

Ответ 2

Не уверен, что это сработает, но вы можете явно экспортировать переменные среды, связанные с вашей оболочкой, а затем сделать вызов foreman. FWIW, я не думаю, что это рекомендуется, и предложит использовать bash script, как предлагает @dax.

Шаги

  • Получите $PATH и другие переменные среды из вашей оболочки

    printenv >> shell.env
    
  • Получить переменные среды из среды рельсов

    namespace :foreman_test do
      task :dev do
        `printenv >> rails.env`
      end
    end
    
  • Сравните эти два и выясните измененные переменные среды и настройте их в своей команде rake в вызове system

    namespace :foreman do
      task :dev do
        `export PATH=/original/path:/value && GEM_DIR=/some/folder && foreman start -f Procfile.dev`
      end
    end
    

Ответ 3

если это должна быть задача рейка, попробуйте это (от этого ответа):

namespace :foreman do
  task :dev do
    sh "foreman start -f Procfile.dev"
  end
end

если это не должно быть задачей rake, у меня есть простой bash script, чтобы начать для конкретного проекта, который работает хорошо:

#!/bin/bash

export PROJECT_DIR=`pwd`
export PORT=$1

source "$HOME/.rvm/scripts/rvm"

unset BUNDLE_GEMFILE
unset BUNDLE_BIN_PATH
unset RUBYOPT
unset GEM_HOME
unset GEM_PATH

(cd <project full path> && exec foreman start -p $PORT)

Ответ 4

Небольшой путь вниз по линии, и вот как я это делаю в суде: [/p >

namespace :foreman do
  task :dev do
    # 1. Load .bash_profile to ensure chruby is available
    # 2. Switch the ruby version to the one defined in .ruby-version
    # 3. Start foreman
    system %(
      source ~/.bash_profile
      chruby "$(cat .ruby-version)"
      foreman start --procfile Procfile.dev
    )
  end
end

desc "Run Foreman using Procfile.dev"
task :foreman => 'foreman:dev'