我有一个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,并且一种解决方案是将这些标记设置为工作区Go环境变量。
但是,应用程序设计依赖于为wasm和服务器代码提供通用的内部程序包,以便每一侧都能看到一些结构定义,这些结构定义简化了它们之间的接口(interface)。为此, repo 的组织方式(简化 View )如下:
cmd
├── internal
│   └── common
│       ├── common.go
│       └── common_test.go
├── server
│   └── main.go
└── wasm
    └── main.go
在整理wasm目录而不是其他目录时,如何配置VSCode以使用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": {}
}%
将代码工作区文件夹放置到位后,可以添加.vscode/settings.json文件的单个文件夹。这提供了为Go工具链指定必要的环境变量的功能,以防止syscall/js上的导入错误。
{
    "go.toolsEnvVars": {
        "GOOS": "js",
        "GOARCH": "wasm"
    }
}%
需要注意的一个小事项是,层次结构顶层的空.vscode目录似乎是必需的。删除它会导致错误。
此解决方案的唯一烦人之处是:
  • 提示要求从命令行打开时启用工作空间文件。
  • VSCode Explorer侧栏中的文件夹列表重复。
  • 关于go - 如何使VSCode在同一存储库中的不同目录中使用不同的Go env var?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/66188534/

    10-15 16:16