ruby 为什么“rails new”会创建一个项目,而这个项目也有bin/rails可执行文件?

zengzsys  于 12个月前  发布在  Ruby
关注(0)|答案(2)|浏览(84)

我正在向Rails世界迈出第一步。我在一个容器中开发,在那里我有ruby解释器工作。
官方文档说我需要gem install rails,然后创建一个新项目。新项目也有bin/rails,与我的“全局”rails可执行文件的版本完全相同。这太令人困惑了
我猜rails只需要搭建一个新项目,对吗?如果是的话,我能以一种不需要“全局”rails gem的方式安装rails吗?像一个 backbone Github仓库?
例如:在PHP中,通常你只需要一个composer.json文件(= Gemfile),并为一个给定的框架做一个composer installbundle install),以获得一个 backbone ,你可以在那里工作,包括通常的可执行文件,安装在本地。

gt0wga4j

gt0wga4j1#

运行rails时,您运行的是当前安装的最新版本。你可以同时安装多个gem版本,例如,这是我目前为rails安装的gem版本(我的一个ruby版本):

$ gem list | ag "^rails\s"
rails (7.1.0, 7.0.4.3, 7.0.4.2, 7.0.4.1, 6.1.7.6, 6.1.7.3, 6.1.7, 6.1.6, 6.1.5, 6.1.4.6, 6.1.4.1, 6.1.4, 6.1.0.rc1, 6.0.6.1, 6.0.3.4, 6.0.0, 5.2.8.1, 5.0.7.2, 4.2.11.3)

运行rails可以获得最新版本:

$ rails -v
Rails 7.1.0

如果我有一个几年前的项目,它需要使用rails v5.2.8.1bin/rails确保您使用正确版本的rails。

$ cd ~/code/SO/rails_five 
$ bin/rails -v
Rails 5.2.8.1

# depending on your shell config (rbenv), this does automagically work (although, super slow for some reason)
$ rails -v
Rails 5.2.8.1

bin/rails-相当于bundle exec rails,它的存在是为了确保使用你的项目的每个人都使用正确的rails版本,包括几年后的你。全局版本一直在变化。
如果你有一百万个rails版本,有特殊的语法来指定你想在新项目中使用的版本:

$ rails _5.2.8.1_ new rails_five

通常你只需要一个composer.json文件(= Gemfile)
作为一个php的局外人,在我开始我的项目之前,我应该知道“composer.json”里面有什么吗?您可以创建一个目录和一个包含一些gem的Gemfile,然后运行bundle install-现在该怎么办?Rails项目有着rails new生成的结构-你不想手动完成所有这些,bundle install只安装gem(也就是下载它们),它不生成项目结构,如果这有意义的话。
对于rails,您可以执行以下操作:

gem install rails
rails new my_project
cd my_project
# use bin/rails from now on for years to come

https://bundler.io/v2.4/man/bundle-binstubs.1.html

4zcjmb1e

4zcjmb1e2#

bin/rails就是binstub。Binstub是围绕可执行文件的 Package 器脚本,其目的是在将调用分派到原始可执行文件之前准备环境。
由rails生成的binstub看起来像:

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

config/boot.rb只是使用Bundler从Gemfile中解析正确的依赖关系:

ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../Gemfile", __dir__)

require "bundler/setup" # Set up gems listed in the Gemfile.
require "bootsnap/setup" # Speed up boot time by caching expensive operations.

rails/commands是Rails CLI。
这确保了即使您从项目目录外部调用binstub,它仍然以相同的方式工作。
如果是的话,我能以一种不需要“全局”rails gem的方式安装rails吗?
你可以。但是这样做没有什么意义,你有更好的事情要担心。
如果您生成一个Gemfile并使用Bundler安装gem,它们通常会安装在gem路径中(位置取决于Ruby的安装/配置方式)。这与运行gem install rails完全相同。Bundler只是使依赖项解析的工作更容易,因为它将尝试找到与gem文件中的其他gem不冲突的版本。
虽然您可以配置Replayer将gem安装到项目中的一个文件夹中,但这并不常见。在Ruby中,不使用Bundler(如CLI工具)调用gem是很正常的。
与PHP不同,您可以简单地使用下划线调用包的正确版本(如果需要)。在容器中,这一点甚至更不重要,因为你不会有多个版本。

相关问题