如何使用 Visual Studio Code 任务在远程 SSH Linux 计算机上使用 source 命令设置环境

ele*_*ris 5 environment-variables visual-studio-code

我想在远程 Linux PC 上为嵌入式目标交叉编译一个项目,但它需要环境设置。

我有一个环境设置脚本。我可以在远程 Linux PC 上的 shell 中运行此脚本,它可以正确设置我的环境变量。构建脚本使用这些环境变量并在本地成功构建。

我使用远程 SSH 扩展通过 Visual Studio Code 连接到 PC。我似乎无法在外部 Visual Studio Code 中构建。即使我通过任务设置了环境,也没有设置环境变量。因此构建脚本无法找到正确的路径。

这是我的tasks.json文件:

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "label": "env",
            "type": "shell",
            "command": "source",
            "args": ["/opt/fslc-framebuffer/2.5-qt/environment-setup-armv7at2hf-neon-fslc-linux-gnueabi"]
        },
        {
            "label": "qmake frontend",
            "type": "shell",
            "command": "/opt/fslc-framebuffer/2.5-qt/sysroots/x86_64-fslcsdk-linux/usr/bin/qmake",
            "args": ["${workspaceFolder}/frontend/frontend.pro", "-config", "release", "CONFIG+=imx6ul-linux"],
            "problemMatcher": [
                "$gcc"
            ],
        },
        {
            "label": "build frontend",
            "dependsOn": [
                "env",
                "qmake frontend"
            ],
            "dependsOrder": "sequence",
            "problemMatcher": [],
            "group": {
                "kind": "build",
                "isDefault": true
            }
        }
    ]
  }

Run Code Online (Sandbox Code Playgroud)

我也尝试了以下方法,但没有帮助:

ele*_*ris 1

有一种方法可以检索环境设置脚本设置的所有环境变量,并将其转换为 vscode 中 taks.json 的 json 格式:

env -i /bin/bash -c 'source <PATH_TO_SCRIPT>; printenv' | sed -En 's/(\w+)=(.*)/"\1":"\2",/p'
Run Code Online (Sandbox Code Playgroud)

在这种情况下:

env -i /bin/bash -c 'source /opt/fslc-framebuffer/2.5-qt/environment-setup-armv7at2hf-neon-fslc-linux-gnueabi; printenv' | sed -En 's/(\w+)=(.*)/"\1":"\2",/p'
Run Code Online (Sandbox Code Playgroud)

您可以将它们存储在tasks.json 的全局环境部分中(从字符串中删除最后一个逗号后):

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",

    "options": { 
    "env": {       
        "GDB":"arm-fslc-linux-gnueabi-gdb",
        "SDKTARGETSYSROOT":"/opt/fslc-framebuffer/2.5-qt/sysroots/armv7at2hf-neon-fslc-linux-gnueabi",
        "CPP":"arm-fslc-linux-gnueabi-gcc -E  -march=armv7-a -mthumb -mfpu=neon -mfloat-abi=hard --sysroot=/opt/fslc-framebuffer/2.5-qt/sysroots/armv7at2hf-neon-fslc-linux-gnueabi",
        ...     
    }
    },              

    "tasks": [        

    ]
}
Run Code Online (Sandbox Code Playgroud)

该命令的工作方式如下:

  1. env -i /bin/bash在没有任何现有环境变量的情况下启动 bash(请参阅使用命令或 bash 脚本清理环境?
  2. /bin/bash -c 'source /opt/fslc-framebuffer/2.5-qt/environment-setup-armv7at2hf-neon-fslc-linux-gnueabi; printenv' |导出环境变量并将其打印/通过管道传输到下一个命令
  3. sed -En 's/(\w+)=(.*)/"\1":"\2",/p'进行正则表达式替换以将其转换为 JSON 格式
  4. 需要手动删除最后一个逗号,并将文本粘贴到 JSONtasks.json 中

正则表达式替换示例 echo -e "A=10\nB=11" | sed -En 's/(\w+)=(.*)/"\1":"\2",/p'https://regex101.com/r/JgRrkg/1

生产

"A":"10",
"B":"11",
Run Code Online (Sandbox Code Playgroud)

现在不需要运行 env 任务,所有其他构建任务都会看到正确的路径和其他环境变量。