Go语言usbprinter包导入失败及虚拟打印机配置求助
问题解决思路与方案
为什么你选的Go包无法导入
你找到的chromium.googlesource.com/chromiumos/platform/tast-tests是ChromiumOS专属的测试框架代码,不是通用的虚拟打印机开发包:
- 它依赖大量ChromiumOS内部私有包(比如
chromiumos/tast/errors、chromiumos/tast/testing),这些包没有发布到公共Go模块仓库,普通Mac/Windows/Linux环境根本无法获取。 - 该仓库本身没有
go.mod文件,不支持Go模块机制,所以go get无法识别和拉取。
针对你的需求(捕获POS打印机数据后转发)的可行方案
放弃那个ChromiumOS测试包,用以下更适合普通桌面环境的方案:
方案1:用系统自带工具配置虚拟打印机(最简单)
在Mac上直接通过CUPS配置虚拟打印队列,捕获输出后再转发:
- 打开「系统设置 > 打印机与扫描仪」,点击
+添加打印机。 - 切换到「IP」标签页,选择「IPP」协议,地址填
localhost,队列填virtual-pos,名称自定义(比如「虚拟POS打印机」),驱动选择「Generic PostScript Printer」。 - 完成配置后,所有发送到这个虚拟打印机的内容会被暂存,你可以通过以下方式获取输出文件:
- 输出文件默认存在
/var/spool/cups目录下,格式为PostScript或PDF。 - 也可以修改CUPS配置,让虚拟打印机直接将输出保存到指定文件夹。
- 输出文件默认存在
- 转发到真实USB POS打印机:用
lp命令发送捕获的文件,比如:lp -d [你的真实POS打印机名称] /path/to/captured-output.ps
方案2:用Go结合USB库模拟虚拟打印机(适合自定义开发)
如果需要更灵活的捕获逻辑,可以用Go的USB绑定库github.com/google/gousb来模拟USB打印机设备,捕获发送到USB端口的数据:
- 先安装依赖:
go get github.com/google/gousb - 简单示例框架(核心逻辑):
注意:需要替换代码中的VendorID、ProductID和端点地址,这些信息可以通过package main import ( "log" "github.com/google/gousb" ) func main() { // 初始化USB上下文 ctx := gousb.NewContext() defer ctx.Close() // 查找并模拟POS打印机的USB设备(需要替换为你的打印机的VendorID和ProductID) dev, err := ctx.OpenDeviceWithVIDPID(0xXXXX, 0xXXXX) if err != nil { log.Fatalf("无法打开USB设备: %v", err) } defer dev.Close() // 配置设备接口、端点,捕获数据 iface, done, err := dev.DefaultInterface() if err != nil { log.Fatalf("无法获取默认接口: %v", err) } defer done() // 读取USB端点的数据(替换为你的打印机的输入端点地址) ep, err := iface.InEndpoint(0x81) if err != nil { log.Fatalf("无法获取输入端点: %v", err) } buf := make([]byte, 1024) for { n, err := ep.Read(buf) if err != nil { log.Fatalf("读取数据失败: %v", err) } log.Printf("捕获到打印机数据: %s", buf[:n]) // 这里可以将数据保存到文件,或者转发到真实打印机 } }system_profiler SPUSBDataType命令在Mac上获取你的POS打印机的USB参数。
通用Go模块导入问题排查(针对新手)
如果以后遇到类似go get失败的情况,按以下步骤排查:
- 检查仓库是否支持Go模块:仓库根目录必须有
go.mod文件,否则Go无法识别为可拉取的模块。 - 确认导入路径正确性:导入路径不需要带
.git后缀,正确的路径应该是仓库的HTTP访问地址去掉.git。 - 检查网络与仓库权限:部分私有仓库需要配置SSH密钥或访问令牌才能拉取,公共仓库则需要确保网络可以正常访问。
内容的提问来源于stack exchange,提问作者madol
相关产品推荐
相关产品推荐

