我有一个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目录似乎是必需的。删除它会导致错误。此解决方案的唯一烦人之处是:
关于go - 如何使VSCode在同一存储库中的不同目录中使用不同的Go env var?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/66188534/