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

5
我想在远程Linux PC上为嵌入式目标交叉编译一个项目,但这需要进行环境设置。
我有一个环境设置脚本。我可以在远程Linux PC的shell中运行此脚本,并且它正确地设置了我的环境变量。构建脚本使用这些环境变量,并且在本地成功构建。
我使用Visual Studio Code通过远程SSH扩展连接到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
            }
        }
    ]
  }


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

赏金吸引了一个ChatGPT的抄袭者。 - Peter Mortensen
3个回答

1
有一种方法可以检索由环境设置脚本设置的所有环境变量,并将其转换为 vscode 中 tasks.json 的 json 格式:
env -i /bin/bash -c 'source <PATH_TO_SCRIPT>; printenv' | sed -En 's/(\w+)=(.*)/"\1":"\2",/p'

在这种情况下:
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'

您可以将它们存储在 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": [        

    ]
}

命令的工作方式如下:

  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. 需要手动删除最后一个逗号,并将文本粘贴到 JSON tasks.json 文件中

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

生成的结果为

"A":"10",
"B":"11",

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

0
似乎问题出在Visual Studio Code中的环境设置无法跨任务持久化。据我所知,Visual Studio Code中的每个任务都在自己独立的环境中运行,因此在一个任务中设置的环境变量不会传递到其他后续任务中。
您可以尝试运行Bash shell,并在该shell中使用“source”命令执行环境设置脚本。然后,按顺序运行“qmake”命令和“make”命令。
通过这样做,环境设置脚本中设置的环境变量应该在整个构建过程中可用。

0
环境的共享取决于Visual Studio Code如何处理控制台,即它是否重用控制台。
您可以创建一个包含所有这些命令的Bash脚本,这是一种避免依赖于Visual Studio Code未记录行为的方法。
创建run_build.sh并将其放在${workspaceFolder}下。
source /opt/fslc-framebuffer/2.5-qt/environment-setup-armv7at2hf-neon-fslc-linux-gnueabi
/opt/fslc-framebuffer/2.5-qt/sysroots/x86_64-fslcsdk-linux/usr/bin/qmake ./frontend/frontend.pro -config release CONFIG+=imx6ul-linux

文件tasks.json可能是:

{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "build frontend",
      "type": "shell",
      "command": "run_build.sh",
      "problemMatcher": [
          "$gcc"
      ],
      "group": {
          "kind": "build",
          "isDefault": true
      }
    }
  ]
}

如果你不想创建一个新的脚本,只需在tasks.json中将它们合并即可。
{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "build frontend",
      "type": "shell",
      "command": "source <env configuration>; qmake <arguments go here>"
    }
  ]
}

这个方法是有效的,但前提是参数不在args中。而且vscode无法识别路径。我正在寻找一个使用任务而不是脚本的解决方案。 - elechris
抱歉,但我看不出使用任务而不是脚本的好处。我不确定你所说的“vscode无法识别路径”的意思,只是猜测,你想将$workspaceFolder路径传递给qmake。如果我猜对了,这里有一个更完整的示例: "command": "source opt/fslc-framebuffer/2.5-qt/environment-setup-armv7at2hf-neon-fslc-linux-gnueabi; /opt/fslc-framebuffer/2.5-qt/sysroots/x86_64-fslcsdk-linux/usr/bin/qmake ${workspaceFolder}/frontend/frontend.pro -config release CONFIG+=imx6ul-linux" - Ter
但是“source”行实际上并不是两行,对吗? - Peter Mortensen
@PeterMortensen 你说得对。VSCode通过bash -c <command>逐个执行shell类型的任务。我想不出一个实现“使用分离任务”的方法。顺便说一下,感谢你重新格式化答案~ - Ter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接