探索Nunu:基于Golang的应用脚手架(增强版)
简介
Nunu,一个灵感来源于英雄联盟中骑在雪怪肩膀上的小男孩的游戏角色,是一个基于Golang的应用脚手架。它整合了Golang生态中流行的库,帮助你快速构建高效、可靠的应用程序。
核心特性
- 超低学习成本和定制性:Nunu封装了Gopher最熟悉的一些流行库,你可以轻松定制应用程序以满足特定需求。
- 高性能和可扩展性:使用最新的技术和最佳实践,确保应用程序可以处理高流量和大量数据。
- 安全可靠:使用了稳定可靠的第三方库,确保应用程序的安全性和可靠性。
- 模块化和可扩展:Nunu旨在具有模块化和可扩展性,你可以通过使用第三方库或编写自己的模块轻松添加新功能。
- 文档完善和测试完备:提供了全面的文档和示例,帮助快速入门,并包括一套测试套件,确保应用程序按预期工作。
快速开始
安装Nunu:
你可以通过以下命令安装Nunu:
go install github.com/go-nunu/nunu@latest
国内用户可以使用GOPROXY加速go install:
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct
如果go install成功,却提示找不到nunu命令,这是因为环境变量没有配置,可以把GOBIN目录配置到环境变量中。
创建新项目:
Nunu内置了两种类型的Layout:基础模板(Basic Layout)和高级模板(Advanced Layout)。基础模板包含一个非常精简的架构目录结构,适合非常熟悉Nunu项目的开发者使用。高级模板包含了很多Nunu的用法示例(db、redis、jwt、cron、migration等),适合开发者快速学习了解Nunu的架构思想。
使用以下命令创建一个新的Golang项目:
nunu new projectName
或者使用国内加速源:
nunu new projectName -r https://gitee.com/go-nunu/nunu-layout-advanced.git
此命令将创建一个名为projectName的目录,并在其中生成一个优雅的Golang项目结构。
启动服务:
创建好项目之后,执行以下命令启动服务:
nunu run cmd/server/main.go
随后打开浏览器访问http://localhost:8080即可看到欢迎页面。API文档地址为http://127.0.0.1:8000/swagger/index.html。
命令行工具
Nunu的命令行工具可以协助快速开发Golang项目,通过nunu命令行工具,你可以很容易的进行Golang项目的创建、热编译、开发、测试和部署。
创建组件:
nunu create [type] [handler-name]
详细命令如下:
- 创建Handler:
nunu create handler [handler-name] - 创建Service:
nunu create service [service-name] - 创建Repository:
nunu create repository [repository-name] - 创建Model:
nunu create model [model-name]
如果你觉得每种组件单独创建太麻烦,你可以使用nunu create all创建所有组件。
编译wire:
如果你的项目存在多个wire.go文件,而你只想编译指定的wire.go文件,你可以使用nunu wire,然后自己选择对应的文件编译。
详解Wire的用法:
Wire是一个依赖注入工具,用于Go语言,它帮助我们减少代码中的硬编码依赖,使得代码更加模块化和可测试。在Nunu框架中,Wire用于实现模块间的依赖注入,以提高项目的可维护性和可扩展性。
安装Wire
在使用Nunu时,Wire通常已经作为依赖被包含在内。如果需要单独安装Wire,可以使用以下命令:
go get github.com/google/wire
使用Wire
在Nunu项目中,Wire的使用主要集中在cmd模块下的wire子目录中的wire.go文件里。以下是Wire在Nunu中的一些基本用法:
- 定义Provider Sets:在Wire中,你需要定义一系列的provider sets,这些sets包含了创建你所需依赖的函数。例如:
var serviceSet = wire.NewSet(
service.NewService,
service.NewUserService,
)
var repositorySet = wire.NewSet(
repository.NewDB,
repository.NewRedis,
repository.NewRepository,
repository.NewUserRepository,
)
var serverSet = wire.NewSet(
server.NewHTTPServer,
server.NewJob,
server.NewTask,
)
- 构建函数:你需要一个构建函数,它使用
wire.Build来组装所有的provider sets,并返回你的应用程序需要的依赖。例如:
func NewWire(*viper.Viper, *log.Logger) (*app.App, func(), error) {
panic(wire.Build(
repositorySet,
serviceSet,
handlerSet,
serverSet,
sid.NewSid,
jwt.NewJwt,
newApp,
))
}
- 编译Wire文件:在Nunu项目中,你可以通过执行以下命令来编译
wire.go文件:
nunu wire
这个命令会编译wire.go文件,并生成所需的依赖项。
进阶用法
- 部分注入:Wire支持部分注入,这意味着你可以只注入一个结构体的部分依赖,而不是全部。这在你想要重用一些依赖或者有特定配置需求时非常有用。
- 命名Provider:Wire允许你给provider命名,这样你就可以在
wire.Build中明确指定使用哪个provider,这在有多个相同类型的provider时非常有用。
总结
Wire是一个强大的依赖注入工具,它通过减少硬编码的依赖关系,使得代码更加清晰和易于测试。在Nunu框架中,Wire的使用简化了组件间的依赖管理,使得项目结构更加合理,代码更加模块化。通过上述的基本用法和进阶用法,你可以更好地理解和运用Wire,以构建更加健壮的Go应用程序。
版本升级:
Nunu也支持版本升级,以确保你的项目使用的是最新版本的依赖。
结论
Nunu是一个强大的Golang应用脚手架,它通过整合流行库和提供清晰的架构指导,帮助你快速构建应用程序。无论是新手还是经验丰富的开发者,Nunu都能提供高效的开发体验和强大的功能支持。