scribble

吕小荣

Blog Friends RSS About

提高 Ruby 程序员效率的 rc 文件

5 August, 2015
> ls -al ~/.*rc
-rw-r--r--  1 ryan  staff    67 Apr  1 23:09 /Users/ryan/.bashrc
-rw-------  1 ryan  staff   152 Aug  5 15:54 /Users/ryan/.gemrc
-rw-r--r--  1 ryan  staff   561 May  5 15:09 /Users/ryan/.htoprc
-rw-r--r--  1 ryan  staff   805 May  7 14:13 /Users/ryan/.inputrc
-rw-r--r--  1 ryan  staff   198 Aug  5 09:22 /Users/ryan/.irbrc
-rw-r--r--  1 ryan  staff    68 Apr 20 12:58 /Users/ryan/.mkshrc
-rw-r--r--  1 ryan  staff    42 Aug  4 17:26 /Users/ryan/.pryrc
-rw-r--r--  1 ryan  staff    31 Aug  5 12:34 /Users/ryan/.railsrc
-rw-------  1 ryan  staff  2776 Apr 29 16:20 /Users/ryan/.vimrc
-rw-r--r--  1 ryan  staff  3288 Jul 23 13:23 /Users/ryan/.zshrc

当终端里敲下这个 bash 命令时,会发现一堆隐藏的 dotfiles,其中又有很多 .xxxrc 风格的文件,比如 .bashrc .irbrc .pryrc .inputrc .zshrc .gemrc。 rc 文件代表什么意思呢?

What does “rc” mean in dot files?

The ‘rc’ suffix goes back to Unix’s grandparent, CTSS. It had a command-script feature called “runcom”. Early Unixes used ‘rc’ for the name of the operating system’s boot script, as a tribute to CTSS runcom.

这是 Stackoverflow 给出的一个解释,可以简单的理解为 Runtime Configuration。

Ruby 程序员如果能很好的利用 rc 文件,可以显著的提高工作效率。

1. ~/.zshrc

开发项目的时候免不了 bundle exec (why?),十分的啰嗦。

bundle exec rails c
bundle exec irb
bundle exec rails s
bundle exec cap production deploy
bundle exec annotate

如果你使用 oh my zsh,可以在 ~/.zshrc 中启用 bundler plugin。Zsh 会在 Rails 常用的开发命令前包一层 bundle exec,省事不少。这是我在 Railscast #201 Bundler) 学到的这一招。

# ~/.zshrc
# Which plugins would you like to load? (plugins can be found in ~/.oh-my-zsh/plugins/*)
# Custom plugins may be added to ~/.oh-my-zsh/custom/plugins/
# Example format: plugins=(rails git textmate ruby lighthouse)
# Add wisely, as too many plugins slow down shell startup.
plugins=(bundler git vi-mode)
rails c # Awesome! It's equal to `bundle exec rails c` after load bundler plugin in Zsh
rails s
cap
pry
puma
annotate
irb

2. ~/.irbrc

Debug 中经常会碰到 3+ 层混排的数据结构,比如 ActionController::Parameters。

[
  {a:1, b:2, c:3},
  {d:4, e:5, f:6, g:7},
  {h:8, i:
    {
      j:9,
      k:10
    }
  }
]

终端默认打印出来的排版非常不友好,每次都把自己的钛合金狗眼看瞎。

Without awesome print

如果你喜欢 awesome_print 这个 gem,可以在 ~/.irbrc 中加上这两行代码,从此世界变得美好起来。

# ~/.irbrc
# please install awesome_print before you require.
require 'awesome_print'
AwesomePrint.irb!

以后打开 irb/console 时,AwesomePrint 会帮你做排版, 查看 ActiveRecord 对象和多层嵌套的数据结构时都变得特别直观。

Awesome print

3. ~/.gemrc

每次安装 gem 时都会默认生成 rdoc/ri 文档,一个项目要依赖 30+ gem,安装文档耗费很多时间。大部分人没有查看 rdoc 文档的习惯,完全可以禁止安装文档。此外,中国地区访问 https://rubygems.org 不太稳定,大家喜欢 https://ruby.taobao.org 做默认的源。

方法一,每次安装附上这二坨参数 gem install rails –source ‘https://ruby.taobao.org’ –no-document 来实现以上两个功能。

方法二,你也可把这些偏好保存在 ~/.gemrc 做默认值,每次 gem install xxx 时会自动加载这些环境参数。

显然后者更方便一些。

---
:backtrace: false
:bulk_threshold: 1000
:sources:
- https://ruby.taobao.org
:update_sources: true
:verbose: true
benchmark: false
gem: "--no-document"

Ruby Gem enviroment 还有很多参数,就不一一介绍了,有兴趣的话可以去翻 文档

备注:

  • 很多同学还在使用 “—no-rdoc —no-ri” 参数来禁止安装文档,最新的 RubyGems 已废弃这两个参数,新的参数是 “—-> no-document”。 查看文档

    -​-[no-]rdoc - Generate RDoc for installed gems Use -​-document instead

    -​-[no-]ri - Generate ri data for installed gems. Use -​-document instead

    -​-[no-]document [TYPES] - Generate documentation for installed gems List the > documentation types you wish to generate. For example: rdoc,ri

  • 当有多个 source 时,每次安装都会去两个源检查最新版本,反而会让安装过程变得更漫长。

4. ~/.railsrc

做外包或者经常创建新项目的同学应该会有这种需求:当使用 rails new appname 创建一个新项目时,希望 Rails generator 能顺带完成以下常规工作。

  • 暂时不执行 bundle install(等修改完 Gemfile 再执行);
  • 不使用 Minitest;
  • 在 config/database.yml 中使用 MySQL 做默认数据库。

这些都可以通过修改 ~/.railsrc 来实现:

--skip-bundle #skips bundle install on generating a new rails app
--skip-test-unit #skips making the test unit folders if you prefer rspec
--database=mysql #defaults my development database to MySQL instead of SQLite3 in config/database.yml

如果你搭配模板(Rails generators template),甚至可以让 rails new 初始化项目时采用你喜欢的技术栈,节省大量时间。比如每次 rails new 时,我都想实现以下 5 个功能:

  1. 暂时跳过 bundle install(放到第4步去执行);

  2. 把项目 Gemfile 的 source 修改为 ruby.taobao.org;

  3. 引入常用 Gem
    • 在 development group 引入 capistrano / annotate / better_errors / quite_assets
    • 在 test group 引入 minitest / mocha / factory_girl
    • 在 default group 引入 puma / sidekiq / kaminari
  4. 执行 bundle install;

  5. 使用 MySQL 做默认数据库。

使用以下二个配置文件可以实现。

~/.railsrc

--skip-bundle
--database=mysql
--template='~/template.rb'

~/template.rb

# template.rb
# 替换默认的 source 为淘宝的源
# 'source "http://ruby.taobao.org"' => 'source "https://ruby.taobao.org"'
gsub_file 'Gemfile', /^source.*$/, "source 'https://ruby.taobao.org'"

# 删除不用的 Gem
gsub_file "Gemfile", /^gem\s+["']sqlite3["'].*$/,''
gsub_file "Gemfile", /^gem\s+["']turbolinks["'].*$/,''

# 安装常用的 Gem
gem 'newrelic_rpm'
gem 'puma'

gem_group :development do
  gem 'capistrano'          , require: false
  gem 'capistrano-bundler',   require: false
  gem 'capistrano-rails',     require: false
  gem 'capistrano-rvm',       require: false
  gem 'capistrano3-puma',     require: false
  gem 'capistrano-sidekiq',   require: false
  gem 'annotate',             require: false
  gem 'better_errors'
  gem 'quiet_assets'
end

gem_group :test do
  gem 'minitest'
  gem 'mocha', require: false
end

gem_group :development, :test do
  gem 'pry-rails'
  gem 'pry-byebug'
  gem 'pry-stack_explorer'
  gem 'awesome_print'
  gem 'factory_girl_rails'
end

# 修改完 Gemfile 后执行 bundle install
run "bundle install"

Rails generators template 能干的事情很多,超乎你的想象,我整理了几个比较好玩的 Rails Generators Templates 供参考。

如果你想 DIY 自己的模板,语法可以参考 Creating and Customizing Rails Generators & Templates

5. ~/.inputrc

如果你是 Vim 党,丧心病狂到要在 MySQL console 和 Rails console 中使用 Vim,可以创建 ~/.inputrc 文件来开启 console 的 vi mode。

# Best goddamn inputrc in the whole world.
# Author: Seth House <[email protected]>

# Woo!
set editing-mode vi

# Adds punctuation as word delimiters
set bind-tty-special-chars off

# Completion Options
set page-completions on
set completion-ignore-case on
set completion-query-items 200
set show-all-if-ambiguous on
set show-all-if-unmodified on
set visible-stats on

# Useful stuff for UTF-8
set meta-flag on
set input-meta on
set output-meta on
set convert-meta off

$if mode=vi
    set keymap vi-command
    "gg": beginning-of-history
    "G": end-of-history

    set keymap vi-insert
    "\C-l": clear-screen
    "\C-w": backward-kill-word
    # auto-complete from the history
    "\C-p": history-search-backward
    "\C-n": history-search-forward
$endif

# file for clear-screen to work
set keymap vi

I am working at SAP Jam Team. We are hiring Senior Ruby developer.

–eof