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

Dun*_*ken 8 visual-studio-code vscode-settings vscode-tasks

为了在一个地方定义我的环境变量,配置了一个运行 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",
        }
    ] }
Run Code Online (Sandbox Code Playgroud)

Edu*_*cio 18

  • 不起作用,为什么?

根据用户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 应用程序(也可能适用于其他平台),只要launch.json中存在以下配置, .env文件(或您喜欢的任何名称)中定义的环境变量将可用于您的应用程序...

{
    "version": "0.2.0",
    "configurations": [
        {
            [...]
            "envFile": "${workspaceFolder}/.env", // Path to the ".env" file.
            [...]
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

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

export SOMEVAR_A=1234
Run Code Online (Sandbox Code Playgroud)

...不会使环境变量SOMEVAR_A可用于VSCode 调试器正在执行的应用程序,也不会用于launch.json中的设置- 特别是在“env”“args”“configurations”)内,例如,这个案例...

{
    "version": "0.2.0",
    "configurations": [
        {
            [...]
            "env": {
                "SOMEVAR_A": "${env:SOMEVAR_A}"
            },
            "args": [
                "${env:SOMEVAR_A}"
            ]
            [...]
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

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


PLUS I:污垢黑客

对于“args”“configurations” )中存在的值,您可以使用下面的技巧...

{
    "version": "0.2.0",
    "configurations": [
        {
            [...]
            "envFile": "${workspaceFolder}/.env",
            "args": [
                "`source \"${workspaceFolder}/.env\";echo ${SOMEVAR_A}`"
            ]
            [...]
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

...因为“envFile”中的配置不起作用。

但请注意,以下构造...

[...]
"args": [
    "`echo ${SOMEVAR_A}`"
]
[...]
Run Code Online (Sandbox Code Playgroud)

...只要环境变量“SOMEVAR_A”之前已以传统方式导出,也适用于“args” 。

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


提示: .env文件示例

SOMEVAR_A="abcd"
SOMEVAR_B="efgh"
SOMEVAR_C=123456
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

[...]
"args": [
    "`set -a;source \"${workspaceFolder}/.env\";set +a;echo ${SOMEVAR_A}`"
[...]
Run Code Online (Sandbox Code Playgroud)

VSCode 对环境变量的支持一塌糊涂!


  • 结论

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

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

[参考文献:https://unix.stackexchange.com/a/79077/61742,/sf/answers/2167883791/]

  • **更新:** 在上次 VSCode 更新之后,此线程中提出的所有 hacks/workarounds 都不再可能了。感谢 M$ 让我们的生活变得更加复杂,并且没有提出任何其他解决方案。 (4认同)

B12*_*ter 3

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

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

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