使用 packs-rails 进行 Ruby 应用模块化
项目介绍
packs-rails
是一个用于帮助模块化 Ruby on Rails 应用的开源项目。它建立在 packwerk
标准之上,提供了一套约定和工具,使得大型单体应用的拆分变得更加容易。通过 packs-rails
,开发者可以轻松地将应用划分为多个独立的包(packs),每个包可以包含自己的模型、服务、控制器等,从而实现更好的代码组织和模块化。
项目快速启动
1. 安装 packs-rails
首先,在你的 Rails 项目的 Gemfile
中添加 packs-rails
:
gem 'packs-rails'
然后运行以下命令来安装 gem:
bundle install
2. 创建 packs 文件夹
在项目根目录下创建一个 packs
文件夹,并在其中创建你的第一个包。例如,创建一个名为 my_domain
的包:
mkdir -p packs/my_domain
3. 配置包
在 packs/my_domain
文件夹中创建一个 package.yml
文件,定义包的配置:
# packs/my_domain/package.yml
enforce_privacy: true
enforce_dependencies: true
4. 添加代码
在 packs/my_domain
文件夹中添加你的代码。例如,创建一个模型:
# packs/my_domain/app/models/my_domain/my_private_namespaced_model.rb
module MyDomain
class MyPrivateNamespacedModel < ApplicationRecord
# 你的模型代码
end
end
5. 使用包
packs-rails
会自动将新包的 autoload 路径添加到 Rails 中,因此你可以立即在应用中使用这个包中的代码。例如,在控制器中使用:
# app/controllers/some_controller.rb
class SomeController < ApplicationController
def index
@model = MyDomain::MyPrivateNamespacedModel.new
end
end
应用案例和最佳实践
1. 模块化大型单体应用
packs-rails
特别适合用于模块化大型单体应用。通过将应用拆分为多个独立的包,可以更好地管理代码,减少代码耦合,提高代码的可维护性和可扩展性。
2. 公共 API 和私有代码分离
在包中,你可以将公共 API 和私有代码分离。公共 API 可以放在 public/
目录下,而私有代码可以放在 app/
目录下。这样可以确保只有必要的代码对外暴露,提高代码的安全性和稳定性。
3. 使用 package_todo.yml
管理依赖
每个包可以有一个 package_todo.yml
文件,用于管理包之间的依赖关系。通过这个文件,你可以明确哪些依赖是允许的,哪些是禁止的,从而更好地控制包之间的耦合。
典型生态项目
1. packwerk
packwerk
是 packs-rails
的基础,它提供了一套用于定义和检查包之间依赖关系的工具。通过 packwerk
,你可以确保包之间的依赖关系符合预期,避免不必要的耦合。
2. FactoryBot
packs-rails
与 FactoryBot
集成良好。你可以在包中定义工厂,packs-rails
会自动将这些工厂加载到 FactoryBot
中,从而方便你在测试中使用。
3. Sorbet
Sorbet
是一个静态类型检查工具,packs-rails
支持与 Sorbet
集成。你可以在包中使用 Sorbet
来增强代码的类型安全性。
通过这些生态项目,packs-rails
提供了一个完整的工具链,帮助你更好地模块化和维护 Ruby on Rails 应用。