Ruby on rails 从耙子任务中运行领班

Ruby on rails 从耙子任务中运行领班,ruby-on-rails,ruby,ruby-on-rails-4,rake,foreman,Ruby On Rails,Ruby,Ruby On Rails 4,Rake,Foreman,我有以下任务: 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/bundl

我有以下任务:

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>'

那么如何运行此任务呢?

如果它必须是一个rake任务,请尝试(从以下位置):

如果它不一定是一个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)
#/bin/bash
导出项目_DIR=`pwd`
出口端口=$1
来源“$HOME/.rvm/scripts/rvm”
取消设置捆绑文件
取消设置束路径
未设置的RUBYOPT
取消GEM_家酒店
取消设置GEM_路径
(cd&exec领班启动-p$端口)

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

台阶

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

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

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

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

  • 如果必须通过rake使其工作,请尝试通过backtick更改shell,以使用系统范围的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
    

    我希望这能帮助你向前迈进。

    再往下走一点,下面是我如何起诉克鲁比的:

    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'
    

    谢谢,我想我更喜欢把所有的东西都放在任务中(已经有很多了)。不幸的是,在任务中使用
    sh
    system
    会导致相同的错误。可能警告是不要在项目gemfile中安装-是否已安装/是否尝试在全局gemfile中安装?系统绝对可用。我可以在没有bundle exec的情况下运行
    foreman start-f Procfile.dev
    ,它运行得很好。谢谢你的回答。请您解释一下为什么从rake任务运行它会失败?考虑到任务不依赖于
    :environment
    为什么它要通过bundle执行?@Pedr一种解释是,您使用
    --binstubs
    初始化了回购,因此当您执行
    rake taskname
    时,实际上使用的是
    bin/rake
    ,默认情况下会选择您的
    GEMFILE
    。不管怎样,我的解决方案有效吗?我不使用垃圾桶。我改用
    be
    别名。我试过运行
    rake
    be-rake
    bin/rake
    。所有这些都会导致我上面描述的相同错误。我现在无法测试,但我会尽快尝试。@Pedr如果您以
    be-rake
    的身份运行它,您已经在调用bundler,这意味着项目的Gemfile将被引用。既然您提到了使用
    bin/rake
    ,我认为可以安全地假设
    rake
    也将引用
    bin/rake
    。因此,在任何一种情况下,都会引用您的GEM文件。由于系统调用将启动一个新的子流程,因此在子流程中导出变量/重置变量是安全的。
    $ rbenv which rake
    /home/name/.rbenv/versions/1.9.3-p448/bin/rake
    
    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'