使用Shell命令作为VSCode任务变量值

10
我试图在tasks.json中定义一个适应VSCode运行特定架构的任务。为了实现这一目标,我想要获取架构作为uname --m(例如 "aarch64" 或 "amd64")。我的目标是将uname的输出插入到环境变量中,如下所示。
"version": "2.0.0",
"tasks": [
    {
        "label": "build",
        "type": "shell",
        "command": "cmake",
        "args": [
            "-DMYLIB_INCLUDE_DIR=$MYLIB/include",
            "-DMYLIB_LIBRARY=$MYLIB/lib"
        ],
        "options": {
            "env": {
                "MYLIB": "${workspaceFolder}/mylib/${command:get_arch}"
            }
        },
    }
]

在我的情况下,我将在 mylib/aarch64mylib/amd64 等目录下拥有特定于架构的版本的 mylib
到目前为止,我的尝试是定义一个名为 get_arch 的第二个任务,并在 MYLIB 的环境定义中使用它,它只是运行 uname 命令。
{
    "label": "get_arch",
    "type": "shell",
    "command": "uname --m"
}

当然,这个任务不是一个合适的命令,因此它没有被 VSCode 检测到,我的构建任务失败了。我查看了变量替换的文档,但它们没有提到是否可以替换 shell 命令。我想这可能在扩展内部是可行的,但我想尽可能保持简单。

2个回答

15

这个扩展程序可以通过VS Code命令来启动任意的shell命令:

"tasks": [
    {
        "label": "test_arch",
        "type": "shell",
        "command": "echo",
        "args": [
            "${MYARCH}"
        ],
        "options": {
            "env": {
                "MYARCH": "${input:get_arch}"
            }
        },
        "problemMatcher": []
    },
],
"inputs": [
    {
        "id": "get_arch",
        "type": "command",
        "command": "shellCommand.execute",
        "args": {
            "command": "uname -m"
        }
    }
]

我发现的一个缺点是,在选择器中提示命令结果时,您需要再按一次Enter。除此之外,这是实现您想要的最直接的方法,而且它可以在许多类似的情况下使用。

或者,您可以使用arch picker添加pickString输入,或创建一个仅添加单个命令GetArch的扩展。


4
如果您不想每次按下回车键,可以在 args 部分添加选项 useFirstResult: true

1
请注意:这可能更适合作为对Dmitriy Vornychev答案的评论,作为该解决方案的迭代,而不是一个独立的答案。 - KyleMit

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