visual-studio-code - Launch.json:如何引用环境变量
问题描述
为了在一个地方定义我的环境变量,配置了一个运行 shell 脚本的任务。该任务的运行方式preLaunchTask
与我的launch.json
.
在我的 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 Code 在 launch.json 中的变量替换不会看到它。
原因是“.env”文件是 node.js 的概念,而不是通用的平台机制。所以 VS Code 对 .env 文件一无所知,但 node.js 调试器知道 .env 文件。
... launch.json中的此功能特定于在Node.js上运行的应用程序,尽管这不是 M$ 在其VSCode文档中解释的内容。
- 可能的解决方案
对于 Python 应用程序(可能也适用于其他平台),在.env文件(或您喜欢的任何名称)中定义的环境变量将可用于您的应用程序,只要以下配置存在于launch.json ...
{
"version": "0.2.0",
"configurations": [
{
[...]
"envFile": "${workspaceFolder}/.env", // Path to the ".env" file.
[...]
}
]
}
请注意,仅导出变量...
export SOMEVAR_A=1234
...不会使环境变量SOMEVAR_A可用于 VSCode 调试器正在执行的应用程序,也不会用于设置- 特别是在"env"和"args" ( "configurations" ) 中 - 在launch.json中,例如这个案例...
{
"version": "0.2.0",
"configurations": [
{
[...]
"env": {
"SOMEVAR_A": "${env:SOMEVAR_A}"
},
"args": [
"${env:SOMEVAR_A}"
]
[...]
}
]
}
注意:在我们的测试中,${env:SOMEVAR_A}
语法在任何情况下都不起作用。也就是说,不适用于应用程序(“env”),也不适用于launch.json中的设置( “args”)。
PLUS I:污垢黑客
对于“args”(“configurations”)中存在的值,您可以使用下面的 hack...
{
"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 based) 上进行了测试。
谢谢!
[参考:https://unix.stackexchange.com/a/79077/61742,https://stackoverflow.com/a/30969768/3223785]
推荐阅读
- excel - 如何在单元格范围的字符串末尾增加数字
- android - SqlCipher:无法在 Android 6.0.1 上打开数据库
- html - Angular:根据前一行中的值显示隐藏一行
- c# - 防止在数据网格中加载引用的表格
- javascript - 我将如何访问文本字段来操作其中的信息?
- spring-boot - 旧的 jwt 令牌不会过期,并且在新请求上仍然有效
- r - R - 嵌套 ifelse
- angularjs - 如何从我的购物车控制器中的 shopController 访问一个数组以显示所有项目(如果需要,可以删除)?
- r - Plotly plot doesn't show up when using shiny
- continuous-integration - Bitbucket pull-request:需要来自不同存储库的绿色构建