Golang中解决"go install no non-test files"及panic报错问题

Golang中解决"go install no non-test files"及panic报错问题 大家好,

我正在尝试构建并安装一个未公开的项目,该项目使用 go 1.9.2(我必须使用这个旧版本)来增强 MPQUIC 的性能,但我遇到了以下错误: cd /go/src/myproject/ go build // 运行正常 go install ./…

go build github.com/lucas-clemente/quic-go/benchmark: no non-test Go files in /home/mininet/go/src/github.com/lucas-clemente/quic-go/benchmark go build github.com/lucas-clemente/quic-go/integrationtests/chrome: no non-test Go files in /home/mininet/go/src/github.com/lucas-clemente/quic-go/integrationtests/chrome go build github.com/lucas-clemente/quic-go/integrationtests/gquic: no non-test Go files in /home/mininet/go/src/github.com/lucas-clemente/quic-go/integrationtests/gquic go build github.com/lucas-clemente/quic-go/integrationtests/self: no non-test Go files in /home/mininet/go/src/github.com/lucas-clemente/quic-go/integrationtests/self

尽管出现了错误,我还是使用以下命令运行了我的代码:

go run script.go
Trying to connect to: [10.0.2.2:6000](http://10.0.2.2:6000/)
panic: open /App/output/lin: no such file or directory

goroutine 1 [running]:
[github.com/lucas-clemente/quic-go.(*scheduler).setup(0xc4200e6000)](http://github.com/lucas-clemente/quic-go.(*scheduler).setup(0xc4200e6000))
/home/mininet/go/src/[github.com/lucas-clemente/quic-go/scheduler.go:82](http://github.com/lucas-clemente/quic-go/scheduler.go:82) +0x64b
[github.com/lucas-clemente/quic-go.(*session).setup(0xc4200d8000](http://github.com/lucas-clemente/quic-go.(*session).setup(0xc4200d8000), 0x0, 0x780b47, 0x8, 0xc420066480, 0x0, 0x0, 0x0, 0xb0abc0, 0xc420098100, ...)
/home/mininet/go/src/[github.com/lucas-clemente/quic-go/session.go:216](http://github.com/lucas-clemente/quic-go/session.go:216) +0x4cd
[github.com/lucas-clemente/quic-go.glob..func2(0xb0abc0](http://github.com/lucas-clemente/quic-go.glob..func2(0xb0abc0), 0xc420098100, 0xc4200d0000, 0x1, 0x780b47, 0x8, 0x200, 0x469865df5a608ef2, 0xc420066480, 0xc4200d6000, ...)
/home/mininet/go/src/[github.com/lucas-clemente/quic-go/session.go:177](http://github.com/lucas-clemente/quic-go/session.go:177) +0x21f
[github.com/lucas-clemente/quic-go.(*client).createNewSession(0xc4200d0070](http://github.com/lucas-clemente/quic-go.(*client).createNewSession(0xc4200d0070), 0x0, 0x0, 0x0, 0xb0abc0, 0xc420098100, 0x4, 0xd)
/home/mininet/go/src/[github.com/lucas-clemente/quic-go/client.go:394](http://github.com/lucas-clemente/quic-go/client.go:394) +0xcb
[github.com/lucas-clemente/quic-go.(*client).establishSecureConnection(0xc4200d0070](http://github.com/lucas-clemente/quic-go.(*client).establishSecureConnection(0xc4200d0070), 0xb0abc0, 0xc420098100, 0x5, 0x5)
/home/mininet/go/src/[github.com/lucas-clemente/quic-go/client.go:207](http://github.com/lucas-clemente/quic-go/client.go:207) +0x78
[github.com/lucas-clemente/quic-go.DialNonFWSecure(0xb0b4c0](http://github.com/lucas-clemente/quic-go.DialNonFWSecure(0xb0b4c0), 0xc420094030, 0xb07a40, 0xc42007c810, 0x780b47, 0xd, 0xc420066480, 0xc420055ee0, 0xc4200d0000, 0xc420055d98, ...)
/home/mininet/go/src/[github.com/lucas-clemente/quic-go/client.go:137](http://github.com/lucas-clemente/quic-go/client.go:137) +0x439
[github.com/lucas-clemente/quic-go.Dial(0xb0b4c0](http://github.com/lucas-clemente/quic-go.Dial(0xb0b4c0), 0xc420094030, 0xb07a40, 0xc42007c810, 0x780b47, 0xd, 0xc420066480, 0xc420055ee0, 0xc4200d0000, 0xc420055e20, ...)
/home/mininet/go/src/[github.com/lucas-clemente/quic-go/client.go:153](http://github.com/lucas-clemente/quic-go/client.go:153) +0x9d
[github.com/lucas-clemente/quic-go.DialAddr(0x780b47](http://github.com/lucas-clemente/quic-go.DialAddr(0x780b47), 0xd, 0xc420066480, 0xc420055ee0, 0x0, 0x0, 0x0, 0x400200cc130)
/home/mininet/go/src/[github.com/lucas-clemente/quic-go/client.go:60](http://github.com/lucas-clemente/quic-go/client.go:60) +0x171
main.main()

我不知道这两个错误是否相互关联,也不知道如何修复它们。所以,如果有人能帮助我解决这些问题,我将非常感激。

此致,


更多关于Golang中解决"go install no non-test files"及panic报错问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang中解决"go install no non-test files"及panic报错问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


这两个错误是独立的,需要分别处理。

1. 解决 “no non-test Go files” 错误

这个错误是因为 go install ./... 试图安装包含纯测试文件的目录。在 Go 1.9.2 中,可以使用以下方法解决:

// 方法1:排除测试目录
go install ./... 2>&1 | grep -v "no non-test Go files"

// 方法2:明确指定要安装的包
go install $(go list ./... | grep -v /benchmark | grep -v /integrationtests)

// 方法3:创建空的非测试文件
// 在只有测试文件的目录中创建空的 .go 文件
// 例如,在 benchmark/ 目录下创建:
// touch benchmark/dummy.go
// echo "package benchmark" > benchmark/dummy.go

2. 解决 panic 错误

panic 错误表明程序试图打开不存在的文件 /App/output/lin。这需要在代码中修复:

// 检查 scheduler.go 第82行附近的代码
// 原始可能有类似:
func (s *scheduler) setup() error {
    // ...
    file, err := os.Open("/App/output/lin")  // 第82行
    if err != nil {
        return err  // 应该返回错误而不是panic
    }
    // ...
}

// 应该修改为:
func (s *scheduler) setup() error {
    // ...
    // 首先检查目录是否存在
    if _, err := os.Stat("/App/output"); os.IsNotExist(err) {
        // 创建目录
        if err := os.MkdirAll("/App/output", 0755); err != nil {
            return fmt.Errorf("failed to create output directory: %v", err)
        }
    }
    
    // 或者使用相对路径
    outputPath := "output/lin"
    if _, err := os.Stat(outputPath); os.IsNotExist(err) {
        // 创建文件
        file, err := os.Create(outputPath)
        if err != nil {
            return fmt.Errorf("failed to create output file: %v", err)
        }
        defer file.Close()
    }
    
    file, err := os.Open(outputPath)
    if err != nil {
        return fmt.Errorf("failed to open output file: %v", err)
    }
    defer file.Close()
    // ...
}

3. 完整的修复步骤

# 1. 先修复目录问题
mkdir -p /App/output

# 2. 修改 quic-go 代码中的文件路径检查
# 编辑 /home/mininet/go/src/github.com/lucas-clemente/quic-go/scheduler.go
# 在第82行附近添加目录检查逻辑

# 3. 使用正确的安装命令
cd /go/src/myproject/
go build
go install $(go list ./... | grep -vE "(benchmark|integrationtests)")

# 4. 运行程序
go run script.go

如果无法修改第三方库代码,可以在运行程序前确保所需目录存在:

// 在 script.go 的 main 函数开头添加
func main() {
    // 确保输出目录存在
    if err := os.MkdirAll("/App/output", 0755); err != nil {
        log.Fatalf("Failed to create output directory: %v", err)
    }
    
    // 确保文件存在
    outputFile := "/App/output/lin"
    if _, err := os.Stat(outputFile); os.IsNotExist(err) {
        if file, err := os.Create(outputFile); err != nil {
            log.Fatalf("Failed to create output file: %v", err)
        } else {
            file.Close()
        }
    }
    
    // 原有代码...
}
回到顶部