问题描述
我有一个 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 目录似乎是必要的。删除它会带来错误。
此解决方案的唯一烦恼是:
- 从命令行打开时要求启用工作区文件的提示。
- VSCode 资源管理器侧栏中的文件夹列表重复。