什么意思' bin' in' $ bin / rails?'

时间:2014-07-31 21:57:03

标签: ruby-on-rails ruby .bash-profile

我正在尝试按照“入门引擎”Rails指南的教程进行操作,并发现:

$ bin/rails plugin new blorgh --mountable

当我在终端上输入时,我得到:

bash: bin/rails: No such file or directory

当我尝试$ rails时,它可以正常工作。

我一直在使用命令行几个月,还有Rails。我知道$符号,但我对此之后“bin”的含义感到困惑。我习惯在$之后输入“Rails”,但本教程说使用“bin”......

bin/是什么意思?

3 个答案:

答案 0 :(得分:8)

TL;博士

运行bundle install --binstubs它会起作用。你只需要做一次,Bundler会记住你要求它(对于那个项目)。

更长的答案

当您使用bundle --binstubs安装捆绑包时,Bundler会将所有特定于捆绑包的binstub安装到bin/子目录(相对于Gemfile),而不是将它们放入gemset的全局binstub路径中。

您通常会这样做:

  1. 确保您运行的rails binstub是Gemfile中的那个(而不是以后与Bundler分开安装到gemset中的其他版本),并且
  2. 改进执行时间(因为除了减去一个子进程调用之外,它在功能上等同于bundle exec rails)。
  3. Global binstubs vs Bundler binstubs

    如果您输入which rails,您将获得类似/usr/local/rvm/gems/jruby-1.7.18/bin/rails的长路径,其内容为:cat `which rails`

    #!/usr/bin/env jruby_executable_hooks
    #
    # This file was generated by RubyGems.
    #
    # The application 'railties' is installed as part of a gem, and
    # this file is here to facilitate running it.
    #
    
    require 'rubygems'
    
    version = ">= 0"
    
    if ARGV.first
      str = ARGV.first
      str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding
      if str =~ /\A_(.*)_\z/
        version = $1
        ARGV.shift
      end
    end
    
    gem 'railties', version
    load Gem.bin_path('railties', 'rails', version)
    

    运行bundler --binstubs后,如果您cat bin/rails,您将获得类似的内容:

    #!/usr/bin/env jruby
    #
    # 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')
    

    关键区别在于bin/版本设置了BUNDLE_GEMFILE环境变量,它需要bundler/setup,这就是告诉Bundler用gem路径做的事情。 bin/rails脚本具有捆绑器感知功能,并且知道您的Gemfile,因此它可以立即为您的环境做好准备。

    我通常建议对gemset版本使用--binstubsbin/x调用。

答案 1 :(得分:0)

考虑这种情况:

我有一个使用Rails版本4.0.0的应用程序。 我的目标是将其升级到Rails 4.1.9。为此,我尝试逐步升级:首先升级到4.0.13,然后升级到4.1,最后升级到4.1.9。

一切顺利。所有的测试都是使用RSpec传递的。

最后,我尝试使用rails s运行我的服务器。 Booom! Ruby崩溃了。 然后,我使用了bin/rails s。一切都很顺利。

所以我认为如果您在系统中设置了不同版本的rails,使用bin/rails选项会更安全。

P.S。为了确保我的假设是正确的,我删除了除4.1.9之外的所有rails版本,然后我尝试用rails s重新运行服务器。这次没有崩溃。

希望这澄清。

答案 2 :(得分:-2)

在基于unix的操作系统中通过shell运行可执行文件时,将首先搜索系统路径。要查看$PATH中的所有目录,请在终端提示符下尝试:

echo $PATH

rails可执行文件将出现在其中一个列出的目录中。

编辑 - 以下文字完全错误,道歉

或者,您可以从rails目录的根目录运行bin目录中的可执行文件。要做到这一点,也就是说,为了确保您运行的是本地可执行文件而不是$PATH中的可执行文件,您需要'。'在命令之前。所以,

./bin/rails

bin/rails