想让${workspaceFolder}在Windows上使用正斜杠吗?

8

我正在配置 tasks.json 中的 VSCode 任务,需要将 ${workspaceFolder} 传递给 'make' 命令,但是它需要使用正斜杠而不是反斜杠。

{
"version": "2.0.0",
"echoCommand": true, 
"tasks": [
    {
        "label": "build",
        "type": "shell",
        "group": {
            "kind": "build",
            "isDefault": true
        },
        "command": "make",
        "args": [
            "APPDIR=\"${workspaceFolder}\""
        ]
. . .

有没有办法在Windows上修改 ${workspaceFolder} 以发出前斜杠?或者,有没有宏可以搜索和替换?
编辑: 我的根本问题是GNU make似乎会转义来自APPDIR的反斜杠,例如:C:\somedirectory\someotherdirectory\athirddirectory。 我想如果我能切换到前斜杠,它就可以解决这个问题。 我无法控制并且不能编辑make文件。
谢谢 -John

同样的问题,我的脚本在Linux和Mac上可以工作,但在Windows上无法工作。 - negstek
你可能已经有了cygpathsh命令。我建议替换make APPDIR=xxxsh -c "make APPDIR=$(cygpath 'xxx')". 注意引号的使用! - Johan Boulé
这可能是你的答案。 - mekb
2个回答

3
尽管没有明确说明,但似乎你正在使用Windows并且使用Cygwin make。基本上,按照Johan的建议,下面是一个完整的`tasks.json`,它使用`cygpath -m`将正斜杠传递给`make`:
"最初的回答"
{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "build hello world",
            "type": "shell",
            "command": "d:/cygwin64/bin/sh",
            "args": [
                "-c",
                "make APPDIR=$(cygpath -m '${workspaceFolder}')"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            }
        }
    ]
}

以下是一个示例Makefile


$(info APPDIR is "$(APPDIR)")

helloworld.exe: helloworld.cpp
    g++ -g -Wall -std=c++11 -o $@ helloworld.cpp

当我按下 Ctrl+Shift+B 来调用这个任务时,在终端窗口中我看到了以下内容:

Original Answer

最初的回答
> Executing task in folder cpphello: d:/cygwin64/bin/sh -c "make APPDIR=$(cygpath -m 'D:\wrk\learn\vscode\cpphello')" <

APPDIR is "D:/wrk/learn/vscode/cpphello"
make: 'helloworld.exe' is up to date.

Terminal will be reused by tasks, press any key to close it.

这里使用-m(混合)开关来调用cygpath,以获得看似Windows路径但使用正斜杠的路径。 cygpath还有其他选项,请参见cygpath --help
这里有两个细节:
1. 我明确指定了sh的路径。这是因为我还在$PATH中安装了git for Windows,并且它出现在我的Cygwin路径之前,所以vscode将使用那个git。但是git for Windows也有sh.exe,如果在这里使用它,make会因为Cygwin DLL错误而崩溃。
2. 我必须将默认的VSCode shell更改为cmd.exe,而默认值为powershell.exe。这里powershell的问题在于,当将参数传递给它时,VSCode使用单引号,而我的解决方案要求VSCode使用双引号,它与cmd.exe一起使用。要更改shell,请使用调色板中的“Terminal: Select Default Shell”命令(Ctrl+Shift+P)。
最后,我想指出,如果在您的情况下可以创建一个中间的bash shell脚本而不是直接调用make,则可以避免所有这些麻烦。 tasks.json语言并不是非常强大,VSCode在Windows上知道如何调用的古怪shell(即cmd.exepowershell.exe)会增加额外的复杂性和脆弱性。

似乎不再起作用了,因为VSCode将自己的引号放入了命令中:`执行任务:c:/cygwin64/bin/sh -c 'make APPDIR=$(cygpath -m 'C:\work\project')' C:\work\project): -c: line 0: unexpected EOF while looking for matching `)'C:\work\project): -c: line 1: syntax error: unexpected end of file`使用双引号也不起作用。 - Rom098
1
@Rom098 你把你的shell改成了cmd.exe吗?你使用的VSCode版本是什么? - Scott McPeak
你说得对。我错过了关于从PS更改为CMD的解释。谢谢,现在它可以工作了。 - Rom098

1

使用扩展 command-variable 中的变量 extension.commandvariable.workspace.workspaceFolderPosix,在需要使用正斜杠的 ${workspaceFolder} 时。此扩展还提供了其他有用的替换。


命令变量扩展对我很有用。请使用${command:extension.commandvariable.workspace.folder},因为extension.commandvariable.workspace.workspaceFolderPosix已经被弃用。 - easai

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