如何让 VSCode 为同一个 repo 中的不同目录使用不同的 Go env vars?

问题描述

我有一个 Go 项目,它构建了一个 WebAssembly (WASM) 应用程序和一个后端服务器。这两部分都可以无错误地构建和运行。然而,VSCode 会在 WASM 应用程序中产生恼人的 linter 错误

Could not import syscall/js (no required module provides package "syscall/js")

问题,据我目前的理解,是 VSCode 没有从构建标签推断它应该使用 gopls 调用 env GOOS=js GOARCH=wasm,一种解决方案是将这些标签设置为 workspace Go环境变量。

然而,应用程序设计依赖于为 wasm 和服务器代码提供一个通用的内部包,以便每一方都能看到一些简化它们之间接口的结构定义。为此,存储库的组织方式(简化视图)如下:

cmd
├── internal
│   └── common
│       ├── common.go
│       └── common_test.go
├── server
│   └── main.go
└── wasm
    └── main.go

如何将 VSCode 配置为在检查 wasm 目录时使用 env GOOS=js GOARCH=wasm 而不是用于其他目录?

解决方法

使用 VSCode 的 Multi-Root Workspace 功能提供了一个我可以接受的解决方案。我最终扁平化了我的目录层次结构(消除了 cmd/)以更好地适应 VSCode 的概念。新布局(比我在问题中显示的要详细一些)如下。

.
├── .gitignore
├── .vscode
├── README.md
├── assets
│   └── index.html
├── go.mod
├── go.sum
├── internal
│   └── common
│       ├── common.go
│       └── common_test.go
├── magefile.go
├── server
│   └── smain.go
├── wasm
│   ├── .vscode
│   │   └── settings.json
│   └── wmain.go
└── workspace.code-workspace

我使用上面链接的文档中所述的“将文件夹添加到工作区”在 VSCode 中创建了工作区。不太知道它是否有效,我添加了每个单独的文件夹,然后添加了父文件夹。保存工作区后,VSCode 创建了 workspace.code-workspace 文件,其内容如下所示。

{
    "folders": [
        {
            "path": "server"
        },{
            "path": "internal"
        },{
            "path": "wasm"
        },{
            "path": "assets"
        },{
            "path": "."
        }
    ],"settings": {}
}%

有了 code-workspace 文件夹,您就可以将 .vscode/settings.json 文件添加到各个文件夹中。这提供了为 Go 工具链指定必要的环境变量以防止 syscall/js 上的导入错误的能力。

{
    "go.toolsEnvVars": {
        "GOOS": "js","GOARCH": "wasm"
    }
}%

要注意的一个小问题是层次结构顶层的空 .vscode 目录似乎是必要的。删除它会带来错误。

此解决方案的唯一烦恼是:

  1. 从命令行打开时要求启用工作区文件的提示。
  2. VSCode 资源管理器侧栏中的文件夹列表重复。