- 根目录下初始化主模块
# mainmodule 自定义
go mod init mainmodule
- 创建子模块及初始化
go mod init mainmodule/helper
- 子模块的包名需要是定义的 helper
- helper/calc.go
package helper
// Reduce 相减
func Reduce(num1, num2 int) int {
return num1 - num2
}
- helper/go.mod
module mainmodule/helper
go 1.19
- 回到根目录,mainmodule 模块使用 helper 模块
- main.go 的代码
package main
import (
"fmt"
"mainmodule/helper"
)
func main() {
result := helper.Reduce(2, 1)
fmt.Println("result::", result)
}
注意这里的 package 还是 main 而不是 mainmodule
- 根模块定义加载子模块
go mod edit -replace mainmodule/helper=./helper
go mod tidy
执行完上面命令,根目录下的 go.mod 文件将变更成下面这样
module mainmodule
go 1.19
replace mainmodule/helper => ./helper
require mainmodule/helper v0.0.0-00010101000000-000000000000
注意,先在 main.go 中使用 helper,然后再执行 go mod tidy
命令
- 安装 nodemon
npm install nodemon --save-dev
- 新建 nodemon 配置
- basic-nodemon.json
{
"watch": ["basic/*.go"],
"quiet": true,
"ext": "go",
"exec": "sh -c 'cd basic && go run main.go'"
}
- package.json 中添加命令
{
"scripts": {
"start": "nodemon --config basic-nodemon.json"
},
"devDependencies": {
"nodemon": "^3.1.4"
}
}
- 运行命令
npm start
- 更改 basic/main.go 的代码,自动运行 go run main.go
在开发 gin 应用时,使用 nodemon 重新运行,因为服务型应用一直挂着占着端口,重新启动时需要先结束之前启动的进程,略不适配。air 和 gin 可以很好地配合使用
- 全局安装 air
go install github.com/cosmtrek/air@latest
或者直接安装到项目目录下使用:
curl -sSfL https://raw.githubusercontent.com/air-verse/air/master/install.sh | sh -s
- 在 gin 服务目录下,初始化配置文件
cd gin-server && air init
- 在 package.json 中
scripts
添加命令
{
"scripts": {
"gin": "cd gin-serve && air"
}
}
- 项目根目录下运行
npm run gin
# 打包watcher,根目录下运行
npm run build:watcher
# 将watcher复制到$PATH路径目录下面
# 打开命令行执行
watcher --config <绝对路径的配置文件>
# 或让其自动生成
watcher
自动生成的配置文件如下:
{
"watchers": [
{
"include": ["/Users/xxxxx/golang-about/watcher"],
"exclude": [
"/Users/xxxxx/golang-about/watcher/node_modules",
"/Users/xxxxx/golang-about/watcher/dist",
"/Users/xxxxx/golang-about/watcher/.git"
],
"cmds": ["npm start"]
}
]
}
配置文件说明:
- watchers,监听对象,可同时存在多个
- include,要监听的目录或文件
- exclude,忽略监听的目录或文件
- cmds,要运行的命令,可多个
- extensions,字符串数组,只监听的后缀名如:[".js",".ts"]
- 封装代码在 /cmd 目录下
package main
import (
"fmt"
"mainmodule/cmd"
)
func main() {
// input答案
projectName, _ := cmd.Input("请输入项目名", "my-project")
// 多选select
stylelintOptions := []string{"eslint", "typescript", "prettier"}
stylelint, _ := cmd.Check("请选择你喜欢的选项", &stylelintOptions, true)
// 单选radio
webFrameOptions := []string{"Vue3", "React", "Angular"}
webFrame, _ := cmd.Radio("请选择你的框架", &webFrameOptions)
// yes or no => confirm
installAuto, _ := cmd.Confirm("是否自动执行npm install安装依赖", true)
fmt.Println(map[string]interface{}{
"projectName": projectName,
"lintRules": stylelint,
"webFrame": webFrame,
"installAuto": installAuto,
})
}