微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何让 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 资源管理器侧栏中的文件夹列表重复。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。