gpt4 book ai didi

ruby-on-rails - 为什么我不需要使用 Rails binstub 来运行正确的版本?

转载 作者:太空宇宙 更新时间:2023-11-03 16:41:36 30 4
gpt4 key购买 nike

我曾经认为您需要使用自动生成的 Rails binstub 才能加载正确的版本,否则您可能会不小心加载错误的版本。

但是,我发现无论如何都会加载正确版本的 Rails。

考虑以下场景:

# System context
$ ruby --version
ruby 2.4.3p205 (2017-12-14 revision 61247) [x86_64-darwin17]
$ which ruby
/Users/sean/.rbenv/shims/ruby
$ rbenv versions
system
* 2.4.3 (set by /Users/sean/.rbenv/version)

# Install three different versions of Rails
$ gem install rails
$ gem install rails -v 4.2.10
$ gem install rails -v 3.2.22.5
$ gem list | grep rails
rails (5.1.4, 4.2.10, 3.2.22.5)

# Globally, I’m using Rails 5.1.4
$ rails --version

# Creating a new app using Rails 4.2.1
$ rails _4.2.10_ new foo_app
$ cd foo_app
$ which rails
/Users/sean/.rbenv/shims/rails
$ rails --version
Rails 4.2.1

# Creating a new app using Rails 3.2.22.5
$ rails _3.2.22.5_ new bar_app
$ cd bar_app
$ which rails
/Users/sean/.rbenv/shims/rails
$ rails --version
Rails 3.2.22.5

如何加载正确的版本,而不是每次都加载最新版本的 Rails?如果工具链足够智能,可以加载正确版本的 Rails,为什么 Rails 会为自己生成一个 binstub?我对工具链有什么误解?

(我在这里使用“工具链”这个词是因为我不确定这种魔法发生在哪里:Ruby、Bundler、rbenv 或 Rails。)

https://github.com/rbenv/rbenv/wiki/Understanding-binstubs

对于上下文,这是从版本 4.2.10 自动生成的 Rails binstub——它非常代表 Rails 4 和 5 binstub,如下所示:

#!/usr/bin/env ruby
begin
load File.expand_path('../spring', __FILE__)
rescue LoadError => e
raise unless e.message.include?('spring')
end
APP_PATH = File.expand_path('../../config/application', __FILE__)
require_relative '../config/boot'
require 'rails/commands'

最佳答案

您实际上在不知不觉中使用了 binstub。

让我们来探究一下这是为什么。

首先,从 Rails 4 应用程序中删除 GemfileGemfile.lock,尝试再次运行 rails,您会看到这个错误:

$ cd foo_app
$ rails --version
Rails 4.2.1
$ rm Gemfile Gemfile.lock
/Users/sean/.rbenv/versions/2.4.3/lib/ruby/gems/2.4.0/gems/bundler-1.16.0/lib/bundler/shared_helpers.rb:34:in `default_gemfile': Could not locate Gemfile (Bundler::GemfileNotFound)
from /Users/sean/.rbenv/versions/2.4.3/lib/ruby/gems/2.4.0/gems/bundler-1.16.0/lib/bundler/shared_helpers.rb:39:in `default_lockfile'
from /Users/sean/.rbenv/versions/2.4.3/lib/ruby/gems/2.4.0/gems/bundler-1.16.0/lib/bundler.rb:318:in `default_lockfile'
from /Users/sean/Desktop/apps/foo_app/bin/spring:10:in `<top (required)>'
from bin/rails:3:in `load'
from bin/rails:3:in `<main>'

令人惊讶的是,即使您没有明确运行 bin/rails,看起来 binstubs 也在运行。

现在,从一个干净的 Rails 4 应用程序重新开始,这一次,删除 bin 文件夹而不是 Gemfiles,您会注意到您现在运行的是 Rails 5:

$ cd .. && rm -rf foo_app && rails _4.2.10_ new foo_app && cd foo_app
$ rails --version
Rails 4.2.1
$ rm -rf bin
$ rails --version
Rails 5.1.4

我不确定这种魔力在哪里发生:Ruby、RubyGems、Bundler、rbenv 或 Rails — 但您不需要通过其 binstub 显式执行 Rails,因为这两种方式都在发生。

关于ruby-on-rails - 为什么我不需要使用 Rails binstub 来运行正确的版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48359057/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com