Bundler和错误的binstubs?

时间:2014-04-19 04:40:02

标签: ruby bundler

我运行rails sbundle exec rails s并收到此警告:

Bundler is using a binstub that was created for a different gem.
This is deprecated, in future versions you may need to `bundle binstub rails` to work around a system/bundle conflict.

这是什么意思?通过查看bundler站点,我对binstubs的理解是你可以为它们设置可执行文件,因此你可以bundle exec blabla而不是运行bin/blabla。所以这个错误说我的bundler没有设置到正确的binstub?

当我运行bundle binstub rails时,我得到了这个输出

rails has no executables, but you may want one from a gem it depends on.
  railties has: rails
  bundler has: bundle, bundler

我不明白我的系统试图告诉我什么,它没有破坏任何东西,但我预感到如果我不解决它可能会变成一个更大的问题

ruby 2.0.0p247

哪个红宝石

/Users/evan/.rvm/rubies/ruby-2.0.0-p247/bin/ruby

哪个捆绑包

/Users/evan/.rvm/gems/ruby-2.0.0-p247/bin/bundler

Rails 4.0.2

编辑:

所以,如果我在nag消息中运行命令:

  bundle config --delete bin    # Turn off Bundler's stub generator
  rake rails:update:bin         # Use the new Rails 4 executables

我最终因uninitialized constant Bundler命令出现bundle exec错误,我发现修复此问题的唯一方法是重新运行bundle install --binstubs,它会在开始时收回唠叨消息这篇文章。

5 个答案:

答案 0 :(得分:25)

对我有用的是

rm -rf bin/*

然后打开一个新的终端会话和

bundle exec spring binstub --all

答案 1 :(得分:8)

我的解决方案: - 其他解决方案对我不起作用。


在您的Rails目录中:

mv /usr/bin/rails /usr/bin/rails.old
bundle config --delete bin
rm -rf bin

# for rails 4.x:
rake rails:update:bin

# for rails 3.x:
bundle install --binstubs

# if you're using rbenv
rbenv rehash
rm -rf ~/.rbenv/plugins/{rbenv-bundle-exec,rbenv-gemset,bundler}

还要确保将bin / rails添加到路径中:

PATH=./bin:$PATH
祝你好运。

答案 2 :(得分:1)

更新红宝石但不更新相关宝石时,可能会出现此错误。

要检查这是否是您的情况,请尝试在新的空目录中创建一个新的rails应用程序(以确保RVM不会自动加载任何gemset)

make /tmp/test && cd test && rails new test

如果此操作失败,说明找不到合适的'rails',那么只需运行

即可
gem update

并覆盖任何冲突的rails。

答案 3 :(得分:1)

gem uninstall bundler
gem install bundler

卸载我所有版本的Bundler,然后安装最新版本为我修复了它。我安装了多个版本的bundler,所以当我运行bundle exec rails s时,我认为使用了错误的Bundler,给了我警告信息。

重新安装Bundler后可能需要生成新的存根,但我没有。

答案 4 :(得分:-1)

我可以通过使用bin/rails

查看git log -p bin/rails的提交历史记录来解决此问题

当前产生错误的内容是:

#!/usr/bin/env ruby
#
# This file was generated by Bundler.
#
# The application 'rails' is installed as part of a gem, and
# this file is here to facilitate running it.
#

require 'pathname'
ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../Gemfile",
  Pathname.new(__FILE__).realpath)

require 'rubygems'
require 'bundler/setup'

load Gem.bin_path('railties', 'rails')

原始的非错误内容是:

#!/usr/bin/env ruby
APP_PATH = File.expand_path('../../config/application',  __FILE__)
require_relative '../config/boot'
require 'rails/commands'

当我恢复原始bin / rails内容时,警告消息消失。以前的尝试在所有uninitialized constant Bundler命令上都返回了bundle exec个错误,但现在它们可以正常工作。值得注意的是,原始内容似乎正是rails new blabla在rails 4.0.x中生成的内容。

不过,我想知道为什么第一个代码块会导致问题,因为它正是bundle install --binstubs生成的内容。

编辑:事实证明这个解决方案不起作用。在启动时将此修复程序推送到heroku登台服务器和heroku错误:所有bin/rails命令抛出uninitialized constant Bundler并且heroku以bin/rails server .....启动,因此这不是一个真正的修复。

EDIT2:

如果我将这两行添加到第二个块(原始bin / rails内容),则所有bin/rails命令都会再次运行:

require 'rubygems'
require 'bundler/setup'

我的猜测是,第二行是解决我遇到的捆绑错误的原因。

有趣的是,当我尝试编辑此帖子中的第一个代码块以尝试调试哪一行抛出警告时,我所做的任何更改都会导致所有rails命令失败,除了OP中的唠叨。怪异。

解决我的问题的最终bin/rails

#!/usr/bin/env ruby
APP_PATH = File.expand_path('../../config/application',  __FILE__)
require_relative '../config/boot'
require 'rubygems'
require 'bundler/setup'
require 'rails/commands'

欢迎那些发现这一点的人提供更多见解!