# 跨平台单实例锁 ## Purpose TBD - 提供跨平台单实例文件锁机制,使用 `github.com/gofrs/flock` 封装,支持 Windows、macOS、Linux 三平台。 ## Requirements ### Requirement: 跨平台单实例文件锁 系统 SHALL 提供跨平台的单实例文件锁机制,使用 `github.com/gofrs/flock` 实现,在 Windows、macOS、Linux 上均可正常工作。 #### Scenario: 首次加锁成功 - **WHEN** 调用 `NewSingletonLock(lockPath)` 创建锁实例并调用 `Lock()` - **AND** 锁文件未被其他进程持有 - **THEN** 加锁成功,返回 `nil` #### Scenario: 重复加锁失败 - **WHEN** 另一个进程已持有同一锁文件的排他锁 - **AND** 调用 `Lock()` - **THEN** 加锁失败,返回错误 #### Scenario: 释放锁 - **WHEN** 调用 `Unlock()` - **THEN** 排他锁被释放 - **AND** 其他进程可以成功加锁 #### Scenario: 进程崩溃后锁自动释放 - **WHEN** 持有锁的进程异常退出(崩溃、kill) - **THEN** 操作系统自动释放文件锁 - **AND** 新进程可以成功加锁 > 注:此场景由操作系统和 `gofrs/flock` 库保证,无需显式单元测试。 ### Requirement: 锁路径参数化 `SingletonLock` SHALL 通过构造函数参数接收锁文件路径,支持不同运行上下文使用不同锁文件。 #### Scenario: 正式运行锁路径 - **WHEN** 桌面应用正常启动 - **THEN** 使用 `%TEMP%/nex-gateway.lock` 作为锁文件路径 #### Scenario: 测试运行锁路径 - **WHEN** 运行 `go test` - **THEN** 测试代码使用独立的锁文件路径(如 `%TEMP%/nex-gateway-test.lock`) - **AND** 与正式版锁文件互不影响 #### Scenario: 锁路径隔离 - **WHEN** 正式版桌面应用正在运行 - **AND** 同时执行 `go test` - **THEN** 正式版持有 `nex-gateway.lock` - **AND** 测试持有 `nex-gateway-test.lock` - **AND** 两者互不阻塞