Golang中临时文件夹的杀毒软件排除设置

Golang中临时文件夹的杀毒软件排除设置 最近在 Windows 11 上遇到了构建时间长得离谱的问题,我怀疑这与杀毒软件有关。

我正在寻找一份官方列表,列出可以添加到排除列表中的位置,或者关于如何正确排除 Go 及相关构建功能的说明。

是否有这样的列表存在?

6 回复

这很有趣。而且我猜微软并没有记录这两个选项在底层具体做了什么。 但至少你有了一个变通方案。

更多关于Golang中临时文件夹的杀毒软件排除设置的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


我不知道有这样的列表,但我认为可能只需将 %GOPATH% 和当前项目目录从杀毒软件扫描中排除即可。

%GOPATH% 包含下载模块的缓存以及构建产物。)

如果您使用 go run,可能需要将创建二进制文件的临时文件夹添加到排除列表中。go debug 通常也会创建一个临时文件来执行。

您也可以尝试使用 go build,然后运行生成的文件,以确定是构建过程缓慢还是二进制文件的执行缓慢。

这些方法仍然无效。可能还有其他位置,或者可能是Go在内存中的操作方式。我找到的唯一解决方法是,在Windows安全中心禁用以下选项: 云提供的保护 自动提交样本 禁用这些选项后,Go的构建速度又恢复了。

func main() {
    fmt.Println("hello world")
}

我们可以做一个有根据的猜测:当你尝试运行你的 .go 文件时,它在执行前会暂停,将你的二进制文件上传到微软的服务器进行扫描,等待批准,然后才开始执行。第一次运行新应用程序时这或许可以接受,但显然,每次执行 go build/test/run 时都重复这个过程会非常烦人。

我认为,既然现在默认启用了这个功能,Go 社区或许应该考虑为 Windows 版本更新安装程序和/或文档。

在Windows上,杀毒软件确实会显著影响Go构建性能,尤其是涉及大量小文件操作时。以下是需要排除的关键目录和路径:

1. Go安装目录

// 默认安装路径
C:\Program Files\Go\
C:\Users\<用户名>\go\  // GOPATH目录

2. 临时目录

// Go编译使用的临时目录
%TEMP%\go-build\
%LOCALAPPDATA%\Temp\go-build\
C:\Users\<用户名>\AppData\Local\Temp\go-build\

// 使用代码获取临时目录
package main

import (
    "fmt"
    "os"
)

func main() {
    // 获取Go使用的临时目录
    tmpDir := os.TempDir()
    fmt.Printf("系统临时目录: %s\n", tmpDir)
    
    // Go构建临时目录通常是
    goBuildDir := tmpDir + "go-build"
    fmt.Printf("Go构建目录: %s\n", goBuildDir)
}

3. 模块缓存目录

// Go模块缓存(重要!)
%GOPATH%\pkg\mod\
C:\Users\<用户名>\go\pkg\mod\

// 通过环境变量获取
package main

import (
    "fmt"
    "os"
    "path/filepath"
)

func main() {
    // 获取模块缓存目录
    if gopath := os.Getenv("GOPATH"); gopath != "" {
        modCache := filepath.Join(gopath, "pkg", "mod")
        fmt.Printf("模块缓存: %s\n", modCache)
    }
    
    // 或者使用go env获取
    fmt.Println("运行: go env GOMODCACHE")
}

4. 构建缓存目录

// Go 1.20+ 构建缓存
%LOCALAPPDATA%\go-build\
C:\Users\<用户名>\AppData\Local\go-build\

// 检查构建缓存位置
package main

import (
    "fmt"
    "os/exec"
)

func main() {
    cmd := exec.Command("go", "env", "GOCACHE")
    output, _ := cmd.Output()
    fmt.Printf("构建缓存: %s", output)
}

5. 项目相关目录

// 你的项目目录
D:\projects\your-project\**  // 使用通配符排除整个项目

// vendor目录(如果使用)
your-project\vendor\

设置示例

对于Windows Defender,使用PowerShell添加排除:

# 添加Go安装目录
Add-MpPreference -ExclusionPath "C:\Program Files\Go"

# 添加临时构建目录
Add-MpPreference -ExclusionPath "$env:TEMP\go-build"

# 添加模块缓存
Add-MpPreference -ExclusionPath "$env:GOPATH\pkg\mod"

# 添加构建缓存
Add-MpPreference -ExclusionPath "$env:LOCALAPPDATA\go-build"

验证排除效果

创建测试程序验证构建速度:

// build_test.go
package main

import (
    "fmt"
    "time"
)

func main() {
    start := time.Now()
    
    // 触发大量编译操作
    for i := 0; i < 100; i++ {
        _ = fmt.Sprintf("test%d", i)
    }
    
    elapsed := time.Since(start)
    fmt.Printf("构建测试完成,耗时: %v\n", elapsed)
}

排除这些目录后,Go构建性能通常会有显著提升。建议按照上述顺序逐步添加排除项,并测试每次更改后的构建时间。

回到顶部