devtools

package
v0.0.5 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 2, 2026 License: MIT Imports: 8 Imported by: 0

README

devtools 包 — 开发工具

所属层级: Infrastructure Layer
设计理念: 热重载支持,开发效率提升
设计灵感: Spring Boot DevTools

概述

devtools 包提供开发环境下的热重载功能支持,参考 Spring Boot DevTools 设计。通过监控文件变化并自动触发回调,实现配置热加载、模板刷新等开发辅助功能。

核心功能
功能 说明
文件监控 支持多目录监控,自动检测文件变化
热重载 文件变化时触发回调,实现热加载
开发模式检测 自动检测是否为开发环境
实时通知 支持 LiveReload 服务器通知客户端

核心接口

HotReloader 热重载管理器
type HotReloader struct {
    // ...
}
创建
reloader := devtools.NewHotReloader(
    devtools.WithWatchDirs("config", "templates"),
    devtools.WithExtensions(".json", ".yaml", ".yml"),
    devtools.WithInterval(2*time.Second),
    devtools.WithIgnoreDirs(".git", "node_modules"),
)
选项函数
函数 说明 默认值
WithWatchDirs(dirs...) 设置监控目录
WithExtensions(exts...) 设置监控的文件扩展名 所有文件
WithInterval(duration) 设置轮询间隔 2s
WithIgnoreDirs(dirs...) 设置忽略的目录 .git, node_modules, vendor
注册回调
reloader.OnReload(func(event devtools.ReloadEvent) {
    fmt.Printf("File changed: %s (%s)\n", event.File, event.Type)
})
启动与停止
// 启动文件监控
if err := reloader.Start(); err != nil {
    // 处理错误
}

// 停止文件监控
reloader.Stop()

// 重启热重载
if err := reloader.Restart(); err != nil {
    // 处理错误
}
状态查询
// 检查是否正在运行
if reloader.IsRunning() {
    // 热重载正在运行
}

// 获取所有被监控的文件
files := reloader.GetWatchedFiles()
ReloadEvent 重载事件
type ReloadEvent struct {
    File      string
    Type      ReloadType
    Timestamp time.Time
    OldHash   string
    NewHash   string
}
ReloadType 重载类型
常量 说明
ReloadTypeCreated "CREATED" 文件创建
ReloadTypeModified "MODIFIED" 文件修改
ReloadTypeDeleted "DELETED" 文件删除
DevModeDetector 开发模式检测器
type DevModeDetector struct {
    // ...
}
创建和检测
detector := devtools.NewDevModeDetector()

if detector.IsDevMode() {
    // 开发模式,启用热重载
    reloader.Start()
}

检测逻辑:

  • 检查环境变量 DEV_MODEDEVELOPMENTGO_ENV
  • 值为 truedevelopmentdev 时返回 true
LiveReloadServer 实时重载服务器
type LiveReloadServer struct {
    // ...
}
创建和使用
server := devtools.NewLiveReloadServer(35729, reloader)

// 启动服务器
if err := server.Start(); err != nil {
    // 处理错误
}

// 停止服务器
server.Stop()

快速开始

基本使用
package main

import (
    "fmt"
    "github.com/xudefa/enhance/devtools"
)

func main() {
    // 创建热重载管理器
    reloader := devtools.NewHotReloader(
        devtools.WithWatchDirs("config"),
        devtools.WithExtensions(".json", ".yaml"),
    )

    // 注册重载回调
    reloader.OnReload(func(event devtools.ReloadEvent) {
        fmt.Printf("File %s: %s\n", event.File, event.Type)
        // 重新加载配置
        reloadConfig(event.File)
    })

    // 启动监控
    if err := reloader.Start(); err != nil {
        panic(err)
    }
    defer reloader.Stop()

    // 阻塞主进程
    select {}
}

API 参考

开发模式检测
detector := devtools.NewDevModeDetector()

if detector.IsDevMode() {
    // 开发模式: 启用热重载
    reloader := devtools.NewHotReloader(
        devtools.WithWatchDirs("config", "templates"),
    )
    reloader.OnReload(handleReload)
    reloader.Start()
    defer reloader.Stop()
} else {
    // 生产模式: 一次性加载配置
    loadConfig()
}
多目录监控
reloader := devtools.NewHotReloader(
    devtools.WithWatchDirs(
        "config",
        "templates",
        "static",
    ),
    devtools.WithExtensions(
        ".json",
        ".yaml",
        ".html",
        ".css",
        ".js",
    ),
    devtools.WithInterval(1*time.Second),
)

// 不同类型的文件使用不同的处理逻辑
reloader.OnReload(func(event devtools.ReloadEvent) {
    ext := filepath.Ext(event.File)
    switch ext {
    case ".json", ".yaml":
        reloadConfig(event.File)
    case ".html":
        reloadTemplate(event.File)
    case ".css", ".js":
        notifyBrowserReload()
    }
})

使用示例

配置热加载
type ConfigManager struct {
    config *Config
    mu     sync.RWMutex
}

func (m *ConfigManager) ReloadConfig(file string) error {
    m.mu.Lock()
    defer m.mu.Unlock()
    
    newConfig, err := loadConfigFromFile(file)
    if err != nil {
        return err
    }
    
    m.config = newConfig
    return nil
}

func main() {
    configManager := &ConfigManager{}
    
    reloader := devtools.NewHotReloader(
        devtools.WithWatchDirs("config"),
        devtools.WithExtensions(".yaml"),
    )
    
    reloader.OnReload(func(event devtools.ReloadEvent) {
        if err := configManager.ReloadConfig(event.File); err != nil {
            log.Printf("Failed to reload config: %v", err)
        } else {
            log.Printf("Config reloaded: %s", event.File)
        }
    })
    
    reloader.Start()
    defer reloader.Stop()
}
与 Web 框架集成
func main() {
    // 检测开发模式
    detector := devtools.NewDevModeDetector()
    
    if detector.IsDevMode() {
        // 启用 LiveReload
        reloader := devtools.NewHotReloader(
            devtools.WithWatchDirs("templates", "static"),
        )
        
        liveReloadServer := devtools.NewLiveReloadServer(35729, reloader)
        liveReloadServer.Start()
        defer liveReloadServer.Stop()
        
        reloader.Start()
        defer reloader.Stop()
    }
    
    // 启动 Web 服务器
    http.ListenAndServe(":8080", mux)
}

最佳实践

1. 根据环境启用热重载
// ✅ 推荐:检测开发模式
detector := devtools.NewDevModeDetector()
if detector.IsDevMode() {
    reloader := devtools.NewHotReloader(
        devtools.WithWatchDirs("config", "templates"),
    )
    reloader.Start()
    defer reloader.Stop()
}

// ⚠️ 不推荐:生产环境也启用热重载
reloader := devtools.NewHotReloader(
    devtools.WithWatchDirs("config"),
)
reloader.Start()
2. 合理设置监控目录和扩展名
// ✅ 推荐:只监控必要的目录和文件类型
reloader := devtools.NewHotReloader(
    devtools.WithWatchDirs("config", "templates"),
    devtools.WithExtensions(".yaml", ".html"),
    devtools.WithIgnoreDirs(".git", "node_modules", "vendor"),
)

// ⚠️ 不推荐:监控整个项目目录
reloader := devtools.NewHotReloader(
    devtools.WithWatchDirs("."),
)
3. 处理重载错误
// ✅ 推荐:处理重载错误
reloader.OnReload(func(event devtools.ReloadEvent) {
    if err := reloadConfig(event.File); err != nil {
        log.Printf("Failed to reload %s: %v", event.File, err)
        // 保留旧配置,不中断服务
    } else {
        log.Printf("Successfully reloaded %s", event.File)
    }
})

// ⚠️ 不推荐:忽略错误
reloader.OnReload(func(event devtools.ReloadEvent) {
    reloadConfig(event.File) // 错误被忽略
})
4. 使用 LiveReload 提升开发体验
// ✅ 推荐:启用 LiveReload
liveReloadServer := devtools.NewLiveReloadServer(35729, reloader)
liveReloadServer.Start()
defer liveReloadServer.Stop()

// 在 HTML 模板中注入 LiveReload 脚本
func injectLiveReloadScript(html string) string {
    script := `<script src="http://localhost:35729/livereload.js"></script>`
    return strings.Replace(html, "</body>", script+"</body>", 1)
}

// ⚠️ 不推荐:手动刷新浏览器
5. 与依赖注入集成
// ✅ 推荐:将 HotReloader 注册为 Bean
container.Register(
    reflect.TypeOf(&devtools.HotReloader{}),
    core.Bean(createHotReloader()),
    core.Singleton(),
)

// 注入使用
type ConfigService struct {
    Reloader *devtools.HotReloader `inject:"hotReloader"`
}

func (s *ConfigService) Start() error {
    return s.Reloader.Start()
}

Documentation

Overview

Package devtools 提供开发工具支持,用于 enhance 框架。

Package devtools 提供开发工具支持,用于 enhance 框架。

该模块包含开发环境下的调试工具、性能分析、热重载等开发辅助功能。 仅在开发模式下启用,生产环境自动禁用。

架构设计

  • HotReloader: 热重载管理器接口,监控文件变更并触发重载
  • FileWatcher: 文件监控器接口,监控文件变化
  • DevModeDetector: 开发模式检测器接口
  • ReloadEvent: 重载事件结构体,记录文件变更信息
  • ReloadType: 重载类型枚举
  • ReloadCallback: 重载回调函数类型
  • HotReloaderOption: 热重载配置选项函数

核心功能

  • 文件监控: 监控指定目录的文件变更
  • 热重载: 文件变更时触发回调函数
  • 灵活配置: 支持自定义监控目录、扩展名、轮询间隔等

使用方式

创建热重载器:

reloader := devtools.NewHotReloader(
    devtools.WithWatchDirs("./internal", "./pkg"),
    devtools.WithExtensions(".go"),
    devtools.WithInterval(time.Second),
)

启动监控:

reloader.Start(func(event devtools.ReloadEvent) {
    fmt.Printf("文件变更: %s (%s)\n", event.File, event.Type)
})

环境变量

开发工具仅在开发模式下启用,通过环境变量控制:

export ENHANCE_DEV_MODE=true

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type DevModeDetector

type DevModeDetector interface {
	// IsDevMode 检测是否为开发模式。
	IsDevMode() bool
}

DevModeDetector 开发模式检测器接口。

检测当前是否处于开发模式。

func NewDevModeDetector

func NewDevModeDetector() DevModeDetector

NewDevModeDetector 创建开发模式检测器。

type FileWatcher

type FileWatcher interface {
	// OnChange 注册文件变化回调。
	OnChange(callback ReloadCallback)

	// Start 启动监控。
	Start() error

	// Stop 停止监控。
	Stop()
}

FileWatcher 文件监控器接口。

监控指定目录的文件变化,支持自定义扩展名过滤。

func NewFileWatcher

func NewFileWatcher(dirs []string, extensions ...string) FileWatcher

NewFileWatcher 创建文件监控器。

type HotReloader

type HotReloader interface {
	// OnReload 注册重载回调。
	OnReload(callback ReloadCallback)

	// Start 启动文件监控。
	Start() error

	// Stop 停止文件监控。
	Stop()
}

HotReloader 热重载管理器接口。

通过轮询方式监控指定目录的文件变更, HotReloader 热重载器核心接口。

当检测到文件创建、修改或删除时触发回调函数。

type HotReloaderInfo added in v0.0.3

type HotReloaderInfo interface {
	HotReloader
	// IsRunning 检查是否正在运行。
	IsRunning() bool

	// GetWatchedFiles 获取所有被监控的文件。
	GetWatchedFiles() []string

	// GetWatchDirs 获取监控目录。
	GetWatchDirs() []string

	// Restart 重启热重载。
	Restart() error
}

HotReloaderInfo 热重载信息接口。

提供热重载状态查询功能。

func NewHotReloader

func NewHotReloader(opts ...HotReloaderOption) HotReloaderInfo

NewHotReloader 创建热重载管理器。

type HotReloaderOption

type HotReloaderOption func(HotReloader)

HotReloaderOption 热重载器配置选项函数。

func WithExtensions

func WithExtensions(exts ...string) HotReloaderOption

WithExtensions 设置监控的文件扩展名。

func WithIgnoreDirs

func WithIgnoreDirs(dirs ...string) HotReloaderOption

WithIgnoreDirs 设置忽略的目录。

func WithInterval

func WithInterval(interval time.Duration) HotReloaderOption

WithInterval 设置轮询间隔。

func WithWatchDirs

func WithWatchDirs(dirs ...string) HotReloaderOption

WithWatchDirs 设置监控目录。

type LiveReloadServer

type LiveReloadServer struct {
	// contains filtered or unexported fields
}

LiveReloadServer 实时重载服务器。

func NewLiveReloadServer

func NewLiveReloadServer(port int, reloader HotReloader) (*LiveReloadServer, error)

NewLiveReloadServer 创建实时重载服务器。

func (*LiveReloadServer) IsRunning

func (s *LiveReloadServer) IsRunning() bool

IsRunning 检查是否正在运行。

func (*LiveReloadServer) Start

func (s *LiveReloadServer) Start() error

Start 启动服务器。

func (*LiveReloadServer) Stop

func (s *LiveReloadServer) Stop()

Stop 停止服务器。

type ReloadCallback

type ReloadCallback func(event ReloadEvent)

ReloadCallback 重载回调函数类型。

type ReloadEvent

type ReloadEvent struct {
	// File 触发重载的文件。
	File string
	// Type 事件类型。
	Type ReloadType
	// Timestamp 事件时间。
	Timestamp time.Time
	// OldHash 旧文件哈希。
	OldHash string
	// NewHash 新文件哈希。
	NewHash string
}

ReloadEvent 重载事件。

type ReloadType

type ReloadType string

ReloadType 重载类型。

const (
	// ReloadTypeCreated 文件创建。
	ReloadTypeCreated ReloadType = "CREATED"
	// ReloadTypeModified 文件修改。
	ReloadTypeModified ReloadType = "MODIFIED"
	// ReloadTypeDeleted 文件删除。
	ReloadTypeDeleted ReloadType = "DELETED"
)

重载类型常量。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL