【问题标题】:What happens when we type "rails" or "ruby" from terminal?当我们从终端输入“rails”或“ruby”时会发生什么?
【发布时间】:2020-03-23 18:47:04
【问题描述】:

完整的初学者问题,但我想知道当我在终端中输入rails g draft:resource ... 之类的内容时会发生什么。我知道最终结果,但我不明白它为什么会起作用。

换句话说,我到底在做什么?我在调用 Rails 程序吗? (如果是这样,这个程序在哪里?为什么我可以在没有 CD 的任何地方调用它?)

非常相似,为什么我也可以ruby -version?安装 Ruby 和 Rails 后,我的计算机发生了哪些变化,使我的终端现在能够理解这些命令?究竟执行了什么?

谢谢!

【问题讨论】:

    标签: ruby-on-rails ruby command-line-interface


    【解决方案1】:

    想知道当我在终端中输入诸如 rails g draft:resource ... 之类的内容时会发生什么

    调用rails 是调用您从https://guides.rubygems.org/ 安装的开源软件包rails 公开的命令行界面(CLI),可能是通过名为gem 的命令行工具(即gem install rails)。

    g 是单词 generate 的别名,是此 CLI 的子命令,它根据以下参数(draft:resource 等)生成一些代码。它只是rails 软件包的另一部分。你可以在这里查看源代码:https://github.com/rails/rails/blob/master/railties/lib/rails/commands.rb#L6

    为什么我也可以做 ruby​​ -version?

    在某个时候,ruby 已安装(通常通过 rvm 或 rbenv)。在您的终端上,您可以通过在您的命令之前输入command -vwhich 来了解您的命令正在调用什么程序,然后从那里深入挖掘。

    $ which ruby
    /Users/avinashmoondra/.rbenv/shims/ruby
    $ which rails
    /Users/avinashmoondra/.rbenv/shims/rails
    

    例如这些是等价的:

    $ /Users/avinashmoondra/.rbenv/shims/ruby -v
    ruby 2.6.4p104 (2019-08-28 revision 67798) [x86_64-darwin18]
    $ ruby -v
    ruby 2.6.4p104 (2019-08-28 revision 67798) [x86_64-darwin18]
    

    安装 Rails 需要 Ruby(和 SQLite3),请参阅:https://guides.rubyonrails.org/getting_started.html#installing-rails。如果您使用的是 rbenv,一个 ruby​​ 版本管理器,您将获得与上述类似的结果。

    安装 Ruby 和 Rails 后,我的计算机发生了哪些变化,使我的终端现在可以理解这些命令?

    在 rbenv 文档中有解释,这里:https://github.com/rbenv/rbenv#how-it-works。总结:在高层次上,rbenv 使用注入 PATH 的 shim 可执行文件拦截 Ruby 命令,确定您的应用程序指定了哪个 Ruby 版本,并将您的命令传递给正确的 Ruby 安装。 p>

    【讨论】:

    • 很好的答案!如果您不介意,还有几个问题:1) rails 暴露的 CLI 是什么?这是运行程序并向其传递参数的 shell 脚本的一种快捷方式吗? 2)当我们安装Ruby时,会安装一堆文件。当我们输入“ruby -v”时,调用的是什么?一个 .exe,一个脚本,...?
    • (1) Rails 公开的 CLI 是基于 Thor 的 Ruby 程序,Thor 是一个 gem(另一个 Ruby 程序)。 whatisthor.com 详细说明了它如何公开可执行文件,并进行 CLI 选项解析。 github.com/rails/rails/blob/master/railties/lib/rails/command/… 是 Rails 的入口点。 (2) 输入cat /Users/avinashmoondra/.rbenv/shims/ruby 将打印出该文件的内容——在我的环境中,这是一个可执行的bash 脚本。最终调用exec "/usr/local/Cellar/rbenv/1.1.2/libexec/rbenv" exec "$program" "$@"。一层又一层的软件!
    猜你喜欢
    • 1970-01-01
    • 2016-11-29
    • 2014-03-31
    • 1970-01-01
    • 1970-01-01
    • 2011-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多