什么是Gem与Bundler
Ruby开发者写脚本时,经常会用到各种现成的工具库,这些库在Ruby世界里被称为“gem”。比如你写个爬虫脚本想用Nokogiri解析HTML,或者用CSV库处理表格数据,这些都是通过gem来引入的。Gem就像是乐高积木,让开发者不用从零造轮子。
而Bundler是管理这些gem依赖的工具。你可能遇到过这种情况:在自己电脑上跑得好好的脚本,换台机器就报错,说某个gem找不到。这往往是因为环境不一致。Bundler通过Gemfile和Gemfile.lock锁死版本,确保大家用的是一套依赖。
初始化一个带Gem管理的脚本项目
假设你要写一个自动化导出GitHub仓库信息的小脚本,需要用到octokit.rb这个gem。先创建项目目录:
mkdir github_exporter
cd github_exporter
bundle init执行bundle init后会生成一个Gemfile,打开它,加入你需要的gem:
source "https://rubygems.org"
gem "octokit", "~> 4.0"然后运行bundle install,Bundler就会下载octokit及其所有依赖,并生成Gemfile.lock记录确切版本。
在脚本中使用gem
现在你可以写ruby脚本了,比如创建export.rb:
require "bundler/setup"
require "octokit"
client = Octokit::Client.new(access_token: ENV['GITHUB_TOKEN'])
repos = client.repos("your-username")
puts "你有 #{repos.count} 个公开仓库:"
repos.each do |repo|
puts "- #{repo.name}: #{repo.html_url}"
end注意第一行require 'bundler/setup',它会自动加载Gemfile里声明的gem,这样你就不需要手动gem install再require路径了。
不同环境下保持一致性
把项目交给同事或部署到服务器时,只要复制Gemfile和Gemfile.lock过去,运行bundle install,就能还原出一模一样的依赖环境。哪怕服务器上没装过Ruby,配合rbenv或RVM也能快速搭起匹配的版本。
有时候你只想临时试个新gem,可以不用写进Gemfile。直接命令行运行:
gem install pry
irb
> require 'pry'
> binding.pry这样就能在调试时插入断点,像用pry这样的工具就特别适合临时排查问题。
私有gem与源配置
公司内部可能有私有gem库,比如封装了统一的日志组件或API客户端。这时可以在Gemfile里指定私有源:
source 'https://rubygems.org'
gem 'public_gem'
source 'https://gems.internal.company.com' do
gem 'internal-tools'
endBundler会分别从不同源拉取对应的gem,既安全又灵活。
更新与维护依赖
定期更新gem很重要,既能获得新功能,也能修复安全漏洞。查看可更新的列表:
bundle outdated升级某个特定gem:
bundle update octokit升级后记得提交新的Gemfile.lock,团队其他人拉代码后就能同步到最新但一致的版本。