如何让 VSCode 对同一存储库中的不同目录使用不同的 Go 环境变量?

Mik*_*lis 2 go visual-studio-code webassembly

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

\n
could not import syscall/js (no required module provides package "syscall/js")\n
Run Code Online (Sandbox Code Playgroud)\n

据我目前的理解,问题是 VSCode 不会从它应该调用的构建标签推断出来goplsenv GOOS=js GOARCH=wasm一种解决方案是将这些标签设置为工作区 Go 环境变量。

\n

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

\n
cmd\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 internal\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 common\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 common.go\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 common_test.go\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 server\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 main.go\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 wasm\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 main.go\n
Run Code Online (Sandbox Code Playgroud)\n

如何配置 VSCodeenv GOOS=js GOARCH=wasm在对 wasm 目录进行 linting 时使用而不是对其他目录使用?

\n

Mik*_*lis 6

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

\n
.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 .gitignore\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 .vscode\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 README.md\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 assets\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 index.html\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 go.mod\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 go.sum\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 internal\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 common\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 common.go\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 common_test.go\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 magefile.go\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 server\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 smain.go\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 wasm\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 .vscode\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 settings.json\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 wmain.go\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 workspace.code-workspace\n\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
{\n    "folders": [\n        {\n            "path": "server"\n        },\n        {\n            "path": "internal"\n        },\n        {\n            "path": "wasm"\n        },\n        {\n            "path": "assets"\n        },\n        {\n            "path": "."\n        }\n    ],\n    "settings": {}\n}%\n
Run Code Online (Sandbox Code Playgroud)\n

代码工作区文件夹就位后,可以在各个文件夹中添加 .vscode/settings.json 文件。这提供了向 Go 工具链指定必要的环境变量的能力,以防止syscall/js.

\n
{\n    "go.toolsEnvVars": {\n        "GOOS": "js",\n        "GOARCH": "wasm"\n    }\n}%\n
Run Code Online (Sandbox Code Playgroud)\n

需要注意的一个小事项是层次结构顶层的空 .vscode 目录似乎是必要的。删除它又返回了错误。

\n

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

\n
    \n
  1. 从命令行打开时询问启用工作区文件的提示。
  2. \n
  3. VSCode Explorer 侧栏中的文件夹列表重复。
  4. \n
\n