基本上,我的目标是在进入ROR项目时将rails版本作为提示段打印到终止符(terminal).

我已经找到了一种在terminator中将其显示为自定义段的方法,但我在提取rails版本时遇到了困难.为了提取ROR项目的rails版本,有一个名为Gemfile.lock的文件,其中有一个ruby Gem列表,以及它为应用程序安装的rails版本.

这就是Gemfile.lock的样子:

GEM
  remote: https://rubygems.org/
  specs:
    actioncable (7.0.3.1)
      actionpack (= 7.0.3.1)
      activesupport (= 7.0.3.1)
      nio4r (~> 2.0)
      websocket-driver (>= 0.6.1)
    actionmailbox (7.0.3.1)
      actionpack (= 7.0.3.1)
      activejob (= 7.0.3.1)
      activerecord (= 7.0.3.1)
      activestorage (= 7.0.3.1)
      activesupport (= 7.0.3.1)
      mail (>= 2.7.1)
      net-imap
      net-pop
      ....
      ....
      rails (7.0.3.1)
      actioncable (= 7.0.3.1)
      actionmailbox (= 7.0.3.1)
      actionmailer (= 7.0.3.1)
      actionpack (= 7.0.3.1)
      actiontext (= 7.0.3.1)
      actionview (= 7.0.3.1)
      activejob (= 7.0.3.1)
      activemodel (= 7.0.3.1)
     ....
     ....
DEPENDENCIES
  bootsnap
  capybara
  debug
  importmap-rails
  jbuilder
  puma (~> 5.0)
  rails (~> 7.0.3, >= 7.0.3.1)
  redis (~> 4.0)
  selenium-webdriver
  ....
  ....

我想提取的Ruby 是 rails (7.0.3.1)

我正在研究一个.zshrc文件来提取它,到目前为止,我已经提出了这个解决方案:

ver=`awk -F' ' '$1~/^rails/{print $0}' Gemfile.lock` 

这将产生以下输出

      rails-dom-testing (~> 2.0)
      rails-html-sanitizer (~> 1.0, >= 1.2.0)
      rails-dom-testing (~> 2.0)
      rails-html-sanitizer (~> 1.1, >= 1.2.0)
    rails (7.0.3.1)
    rails-dom-testing (2.0.3)
    rails-html-sanitizer (1.4.3)
  rails (~> 7.0.3, >= 7.0.3.1) 

正如你所见,有多个Ruby ,其中包括名称rails.但我只想提取这个gem rails (7.0.3.1)的版本,其中有一个前导的4个空格字符.

我正在寻找的预期输出就是这样的gem版本:7.0.3.1不带括号,返回为字符串类型.然后将其存储在一个变量中,然后我将在终端中以自定义提示段的形式打印出来,并使用如下自定义 colored颜色 :

local color="%F{#f7507b}"
# ver = ``
echo "%{$color%}$ver"

其中ver是存储了rails版本的变量.

我已经试了半天了,但运气不好,我也试过用[[:blank:]]&\s但它在这种情况下不起作用.我也try 过使用rails -v,它输出我们所在项目目录的rails版本,但在少数情况下也会出现错误,用户没有安装Gemfile中指定的ruby版本.

无论用户是否在其系统中安装了特定版本的ruby或rails,输出都应给出应用程序使用的rails版本.所以我认为从Gemfile.lock中提取rails版本是唯一的方法.但是,如果你有任何其他方法来解决这个问题,我洗耳恭听!

推荐答案

例如,使用gnu awk,您可以使用带有捕获组的模式.

图案匹配:

  • 从字符串开始匹配^[[:space:]]*个可选空格
  • rails[[:space:]]+匹配rails和1+空格
  • \(匹配(
  • 第1组中的([0-9][0-9.]*)个捕捉匹配一个数字和可选的点和数字
  • \)匹配)

例子:

gawk 'match($0, /^[[:space:]]*rails[[:space:]]+\(([0-9][0-9.]*)\)/, a) {
  print a[1]
}' Gemfile.lock

输出

7.0.3.1

awkmatch

awk '$1 == "rails" && match($2, /\([0-9][0-9.]*\)/) {
   print substr($2, RSTART+1, RLENGTH-2)
}' Gemfile.lock

Ruby-on-rails相关问答推荐

HTTP:MimeNegotiation::InvalidType(html不是有效的MIME类型):""

无法安装Ruby错误运行';__rvm_make-J4';,

如何在 JR gem 中指定每个资源的最大页面大小配置

如何从数组中提取值

从 rails 5 迁移到 rails 6

错误 NoMethodError:ActionView::Base:Class 的未定义方法 `debug_rjs='

Rails - 如何使用子对象的嵌套属性和强参数填充父对象ID?

如何在 Ruby 字符串中返回最后一个斜杠(/)之后的所有内容

Rails:如何小写非英文字符串?

有没有办法在模型而不是视图中使用复数()?

如何在 Linux 上使用 Ruby 2.0 改进独角兽进程之间的内存共享

具有条件的列的计数器缓存?

使用回形针调整图像大小

如何独立测试模型的回调方法?

Ruby on Rails 错误无法加载此类文件 - 更少

登录delay_job?

form_for 未定义的方法 `user_path'

如何对这个哈希数组进行分组?

Rails:在 link_to 中保留 GET 查询字符串参数

简单的 rails rake 任务拒绝运行并出现错误不知道如何构建任务,为什么?