从rake任务中运行工头

时间:2014-11-28 13:12:59

标签: ruby-on-rails ruby ruby-on-rails-4 rake foreman

我有以下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命令在shell中工作正常,但是当我运行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>'

Forman明确指出:

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

那么如何才能运行此任务?

4 个答案:

答案 0 :(得分:3)

如果必须通过rake使其工作,请尝试通过反引号更改shell-out以使用系统范围的foreman二进制文件的硬编码路径

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

您只需使用'which'或'locate'或类似工具来确定在Bundler上下文之外工作的路径。如果您使用的是rbenv,那么这可能就足够了:

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

我希望这有助于你前进。

答案 1 :(得分:2)

不确定这是否有效,但您可以显式导出与shell关联的环境变量,然后调用foreman。 FWIW,我不认为这是推荐的,并建议使用bash脚本作为@dax建议。

步骤

  1. 从shell中获取$PATH和其他环境变量

    printenv >> shell.env
    
  2. 从rails环境中获取环境变量

    namespace :foreman_test do
      task :dev do
        `printenv >> rails.env`
      end
    end
    
  3. 比较两者并找出已更改的环境变量,并在system调用中的rake任务中设置它们

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

答案 2 :(得分:1)

如果必须是rake任务,请尝试此操作(来自this answer):

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

如果它没有 作为rake任务,我有一个简单的bash脚本可以启动一个运行良好的特定项目:

#!/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)

答案 3 :(得分:0)

一点点下线,这就是我如何起诉chruby:

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'