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脚本
台阶
$PATH
和其他环境变量
printenv >> shell.env
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'