从混乱到清晰:在 Rails 中减少依赖

发布: (2025年12月21日 GMT+8 00:51)
7 min read
原文: Dev.to

I’m happy to translate the article for you, but I don’t have the ability to retrieve the full text from external links. Could you please paste the content you’d like translated (excluding any code blocks or URLs you want to keep unchanged)? Once I have the text, I’ll provide the Simplified‑Chinese translation while preserving the original formatting.

少即是多:在 Rails 中选择必备的 Gems

在 Ruby on Rails 21 年的历程中,如今我们拥有一个非常丰富的生态系统,成千上万的解决方案被打包成 gems。面对如此多的选择,我们有时会倾向于添加 gems 来解决所有问题,我认为这是一个常见的错误。

为什么在没有必要的情况下安装数百个 gems 是有问题的?

  • 每个 gem 都会增加 依赖 并在长期内带来 潜在的安全漏洞
  • 不必要的 gems 会使应用 变慢,并且在长期内 难以维护

“少即是多”的理念是只安装 真正必需 的 gems,那些真正为你的 Gemfile “付租金”的 gems。

如何做到?

在添加 gem 之前,问自己以下问题:

  • 真的需要吗? Rails 已经能解决这个问题了吗?
  • 这个 gem 仍在维护吗? 最近一次更新是什么时候?它是否得到维护?
  • 能用简单代码解决吗? 有时 30 行代码比一个未知且没有测试的 gem 更好。
  • 收益是否超过成本? 考虑复杂度、依赖和维护。

这些思考有助于避免滥用 bundle add hello_world

Source:

我认为已经成熟的 Gems

这并非绝对真理;还有其他有效的选择。请使用最适合你项目的方案。

1. RuboCop

# Gemfile
gem 'rubocop',      require: false
gem 'rubocop-rails', require: false
gem 'rubocop-rspec', require: false

RuboCop 是 Ruby 代码规范化的基石。它会检查不良实践、代码不一致以及风格违规,且可以通过 .rubocop.yml 高度配置。

对团队的影响

  • 消除关于代码风格的争论,让 code review 更专注于业务逻辑。
  • 方便新开发者快速融入。

基础配置(.rubocop.yml

inherit_from: .rubocop_todo.yml

AllCops:
  TargetRubyVersion: 3.1
  NewCops: enable

Style/Documentation:
  Enabled: false

Metrics/LineLength:
  Max: 120

2. RSpec

RSpec 是 Rails 生态中最流行的测试框架。它拥有友好的语法和强大的功能,用于测试类和方法。常配合的补充 gems 有:

  • FactoryBot – 生成测试数据。
  • Faker – 生成伪造数据。
  • SimpleCov – 测试覆盖率分析。

2.1. FactoryBot

# spec/factories/users.rb
FactoryBot.define do
  factory :user do
    name    { Faker::Name.name }
    email   { Faker::Internet.email }
    phone   { Faker::PhoneNumber.phone_number }
    address { Faker::Address.full_address }

    trait :admin do
      role { 'admin' }
    end

    trait :with_posts do
      after(:create) do |user|
        create_list(:post, 3, user: user)
      end
    end
  end
end

# 在测试中使用:
let(:user)           { create(:user) }
let(:admin)          { create(:user, :admin) }
let(:user_with_posts){ create(:user, :with_posts) }

FactoryBot 简化并统一了测试数据的创建,提供了灵活性、可读性和一致性。

2.2. Faker

为测试和 QA 环境的 seeds 生成随机伪造数据。与 FactoryBot 配合使用,可避免使用真实或敏感数据。

2.3. SimpleCov

分析应用的测试覆盖率,指出哪些代码尚未被测试。

# spec/spec_helper.rb 或 test/test_helper.rb
require 'simplecov'
SimpleCov.start 'rails' do
  add_filter '/spec/'
  add_filter '/config/'
  add_filter '/vendor/'

  minimum_coverage 90
  refuse_coverage_drop
end

3. Bullet

在开发环境中使用,Bullet gem 能识别与数据库查询相关的性能问题,如 N+1 queries 和加载但未使用的关联。它会在问题进入生产环境前提醒开发者。

4. Brakeman

Brakeman 是一款针对 Rails 应用的静态安全分析工具,能够检测诸如:

  • SQL 注入
  • 跨站脚本 (XSS)
  • 命令注入
  • 不安全的重定向
  • 不安全的会话处理

运行扫描后,你会得到报告,帮助在代码上线前修复这些安全漏洞。

结论

采用审慎的方式选择 gem 可以降低攻击面,提升性能并简化维护。始终问自己,这个 gem 是否带来真正的好处以证明其依赖成本的合理性。如果答案是“是”,就加入它;否则,倾向于使用简单且原生于 Rails 的解决方案。

5. Pry

交互式调试工具,用于 Ruby,取代默认的控制台。它允许在任意位置使用 binding.pry 暂停代码执行,能够实时检查变量、执行代码并浏览 stack trace

额外选项

一些有趣的额外选项:

  • Better Errors & Binding of Caller – 用 交互式且详细的界面 替代 Rails 默认的错误页面,能够在浏览器中查看 stack trace、检查变量并直接探索先前的调用上下文。
  • Sidekiq – 在后台进行异步任务处理(发送电子邮件、文件处理、外部请求) 脱离应用主流程,高效且可扩展。
  • Devise – 为需要此功能的项目提供完整的身份验证解决方案。

结论

Rails 已经解决了很多问题,所以在添加任何 gem 之前,问问自己:Rails 已经解决了这个问题了吗? 大多数情况下,答案是

这不是要重新发明轮子,而是要评估添加 gem 是否真的有必要。一个 精简的 Gemfile 能让应用更快,依赖更少,更新更容易,安全风险也更低。

  • 从简单开始。
  • 尽可能保持简单。
  • 只有在需求真实且持续时才添加新 gem。
Back to Blog

相关文章

阅读更多 »

停止 Slopware

https://ficd.sh/blog/your-project-sucks/ 评论链接: https://news.ycombinator.com/item?id=46366285 点数: 55 评论数: 77