关于ruby on rails:从rake任务中运行foreman

Running foreman from a rake task

我有以下rake任务:

1
2
3
4
5
6
7
8
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时,我得到以下错误:

1
2
/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>'

福尔曼特别声明:

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

那么我怎样才能让这个任务运行呢?


如果必须通过rake使其工作,请尝试通过backtick更改shell,以使用到系统范围的forman二进制文件的硬编码路径。

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

您只需要使用"哪个"或"定位"或类似的工具来确定在Bundler上下文之外工作的路径。如果您使用的是rbenv,那么这就足够了:

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

我希望这能帮助你前进。


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

步骤

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

    1
    printenv >> shell.env
  • 从Rails环境中获取环境变量

    1
    2
    3
    4
    5
    namespace :foreman_test do
      task :dev do
        `printenv >> rails.env`
      end
    end
  • 比较这两个变量,找出变化的环境变量,并在system调用中的rake任务中设置它们。

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

  • 如果必须是rake任务,请尝试此操作(根据此答案):

    1
    2
    3
    4
    5
    namespace :foreman do
      task :dev do
        sh"foreman start -f Procfile.dev"
      end
    end

    如果它不一定是rake任务,那么我有一个简单的bash脚本来启动一个运行良好的特定项目:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #!/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)


    沿着这条线往下走一点,我就是这样起诉Chruby的:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    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'