Launch.json:如何引用环境变量



为了在一个地方定义我的环境变量,配置了一个任务,其中运行一个shell脚本。该任务在我的launch.json中按preLaunchTask运行。

在我的launch.json中,我现在尝试引用我在脚本中配置的环境变量(如export AWS_REGION="eu-west-1")。

launch.json 如下所示:

{
"version": "0.2.0",
"configurations": [
{
"name": "Launch",
//..
"env": {
//"AWS_REGION": "us-east-1",        //works
"AWS_REGION": "${env:AWS_REGION}",  //doesn't work, why?
},
"args": [],
"preLaunchTask": "setupEnv",
}
] }
  • 不起作用,为什么?

根据用户Weinand的这篇文章...

在 VS Code 替换后读取和处理".env"文件 启动配置中的变量。所以你调试的程序确实会 查看具有正确值的环境变量"FOO",但 VS 代码在launch.json中的变量替换不会看到它。

原因是".env"文件是一个节点.js概念,而不是 通用平台机制。所以VS Code对此一无所知 .env 文件,但节点.js调试器知道 .env 文件。

launch.json中的此功能特定于在Node.js上运行的应用程序,尽管这不是M$在VSCode文档中解释的内容。

  • 可能的解决方案

对于 Python 应用程序(也可能用于其他平台),只要launch.json中存在以下配置,.env文件中定义的环境变量(或您喜欢的任何名称)将可用于您的应用程序。

{
"version": "0.2.0",
"configurations": [
{
[...]
"envFile": "${workspaceFolder}/.env", // Path to the ".env" file.
[...]
}
]
}

请注意,仅导出变量...

export SOMEVAR_A=1234

不会使环境变量SOMEVAR_A可用于VSCode 调试器正在执行的应用程序,也不会用于launch.json中的设置 - 尤其是在">env"和">args">("配置")中,例如,在这种情况下......

{
"version": "0.2.0",
"configurations": [
{
[...]
"env": {
"SOMEVAR_A": "${env:SOMEVAR_A}"
},
"args": [
"${env:SOMEVAR_A}"
]
[...]
}
]
}

注意:在我们的测试中,${env:SOMEVAR_A}语法在任何情况下都不起作用。也就是说,不适用于应用程序(">env">),也不适用于launch.json中的设置("args">)。

<小时 />

加I:污垢黑客

对于">args"("配置")中存在的值,您可以使用下面的技巧...

{
"version": "0.2.0",
"configurations": [
{
[...]
"envFile": "${workspaceFolder}/.env",
"args": [
"`source "${workspaceFolder}/.env";echo ${SOMEVAR_A}`"
]
[...]
}
]
}

。因为"envFile">中的配置不起作用。

请注意,虽然,以下构造...

[...]
"args": [
"`echo ${SOMEVAR_A}`"
]
[...]

。只要环境变量">SOMEVAR_A">以前以传统方式导出,也适用于"args"。

同样的推理也适用于任务(tasks.json),但在这两种情况下,我们都不能保证这一点。

>提示:.env文件示例
SOMEVAR_A="abcd"
SOMEVAR_B="efgh"
SOMEVAR_C=123456
<小时 />

PLUS II:导出变量

在某些情况下,您需要导出变量(例如。export SOMEVAR_A="abcd"),以便它们可以被某些资源消耗。在这些情况下可能会出现问题,因为我们导出变量的事实阻止了(我们不知道为什么)它们在"envFile"配置"envFile": "${workspaceFolder}/.env"的上下文中看到。

绕过这些限制的解决方法是在变量集之前添加set -a,在变量集之后添加set +a。有了这个,我们就能够满足两个场景,如这个例子......

#!/usr/bin/env bash
set -a    
SOMEVAR_A="abcd"
SOMEVAR_B="efgh"
SOMEVAR_C=123456
set +a

。或者以更兼容和安全的方式使用set -a/set +a,如本例所示......

[...]
"args": [
"`set -a;source "${workspaceFolder}/.env";set +a;echo ${SOMEVAR_A}`"
[...]

VSCode 对环境变量的支持一团糟!

<小时 />
  • 结论

我们不知道我们在这里处理的限制是来自VSCode自己的设计还是错误。无论如何,这似乎没有多大意义。

这些程序在Manjaro Linux(基于Arch)上进行了测试

[参考资料: https://unix.stackexchange.com/a/79077/61742 , https://stackoverflow.com/a/30969768/3223785 ]

查看下面引用的问题评论,这似乎目前是不可能的。

${env:...} 仅扩展在运行代码的父 shell 中设置的环境变量。它不会展开在tasks.json env选项中设置的变量。

https://github.com/Microsoft/vscode/issues/47985#issuecomment-460678885

它不像爱德华多·卢西奥所说的那样工作。这里有一些至少适用于我的情况的替代方案,有时使用env.sh文件来加载环境变量.env并需要文件在 Go 项目中进行 VsCode 调试。要正常启动应用程序,请使用 commmand$ source env.sh加载环境。在这种情况下,您希望改为加载.env文件。

环境示例:Linux/WSL2

  1. 如果.sh是我想要的,可能只是一些导出命令行:env.sh
export DBUrl="sql-connection-string-here"
export DBPass="somedbpass"
  1. 创建预启动任务以生成 .env 文件.vscode/tasks.json
{
"version": "2.0.0",
"tasks": [
{
"label": "buildenv",
"command": "sed",
"args": ["s/export //g", "local_env.sh", ">", ".env"],
"type": "shell"
}
]
}

您可以看到它调用sed将任何export替换为空字符串并重写.env文件。

  1. .vscode/launch.json上,加载preLaunchTask并将目标envFile更改为生成的文件:
{
"version": "0.2.0",
"configurations": [
{
"name": "My App Debug",
"type": "go",
"request": "launch",
"mode": "debug",
"program": "${workspaceFolder}",
"preLaunchTask": "buildenv",
"envFile": "${workspaceFolder}/.env",
}
]
}

现在,每次 VsCode 运行调试器时,它都会生成.env文件,只需要维护单个env.sh文件。

参考: https://stackoverflow.com/a/38746951/12325366

使用vmArgs选项将 Java 属性传递给 VM(即-Dname=value),例如:

{
...
"configurations":
[
{
"type": "java",
"name": "MyApp",
"request": "launch",
"mainClass": "org.example.MyApp",
"projectName": "my-app",
"vmArgs":
[
"-Dname=value"
]
}
]
}

最新更新