flutter 如何转义在VSCode launcher.json命令中作为args传递的json中的逗号?

4urapxun  于 2023-03-13  发布在  Flutter
关注(0)|答案(4)|浏览(239)

我想调试一个应用程序,需要传递一个内嵌的json作为arg。

"configurations": [
        {
            "name": "app DEV",
            "program": "lib/main.dart",
            "request": "launch",
            "type": "dart",
            "args": [
                "--dart-define=APP_BACKENDS={[{\"id\":\"default\",\"url\":\"https://localhost\",\"port\": \"8080\"},]}",
            ]
        }

但是APP_BACKENDS常量值在第一个逗号中被删除。锁定它的打印:{[{"id":"default"
先说清楚,这就是我得到输出值的方法:

static const _APP_BACKENDS =
      String.fromEnvironment('APP_BACKENDS', defaultValue: '{}');
rsaldnfx

rsaldnfx1#

在浏览了大量的链接和阅读之后,最后我发现了一个GitHub问题https://github.com/microsoft/vscode/issues/98471,它解决了我的类似问题。如果你浏览链接并阅读倒数第二个评论,它解释了关于shell引用的事情。

"configurations": [
    {
        "name": "app DEV",
        "program": "lib/main.dart",
        "request": "launch",
        "type": "dart",
        "args": [
            "--dart-define=APP_BACKENDS={[{\"id\":\"default\",\"url\":\"https://localhost\",\"port\": \"8080\"},]}",
        ],
        "argsExpansion": "none"
    }

**“参数扩展”:“none”**在将此添加到launch.json文件后,我能够运行代码,而无需添加其他答案中提到的额外\或空格。我尝试在vscode文档中搜索此配置,但没有找到任何引用,但它对我有效。

lb3vh1jj

lb3vh1jj2#

我遇到了同样的问题--试图将json字符串作为命令行参数传递给python脚本。在shell中运行良好,但在launch.json中无法执行相同的操作。VS代码将逗号解释为多个参数,并将多个-b参数传递给我的程序(在我的情况下,是4个单独的-b参数)。
答案:在arg值的末尾添加一个空格““。
我不明白为什么这样做,但它确实有效。注意,我用单斜杠转义了双引号。

{
    "name": "Test my python code",
    "type": "python",
    "request": "launch",
    "program": "${file}",
    "args": [
        "-r=/store/purchase",
        "-b={\"items\":[\"cake\",\"coffee\",\"toilet roll\",\"masks\"]} "
    ],
    "console": "integratedTerminal"
},
f1tvaqid

f1tvaqid3#

阅读本文档后:Launch JSON Reference,特别是这个引用,我知道,你需要使用\\\来实现你想要的。例如。在文档中只给出了这个
启动程序时传递给程序的命令行参数的JSON数组。例如["arg1", "arg2"]。如果要转义字符,则需要对它们进行双转义。例如,["{\\\"arg1\\\": true}"]将向应用程序发送{"arg1": true}
因此,看完这个之后,必须以正确的格式将JSON传递给args

args: [
  "--dart-define=APP_BACKENDS={[{\\\"id\\\":\\\"default\\\",\\\"url\\\":\\\"https://localhost\\\",\\\"port\\\": \\\"8080\\\"}]}"
]

这会做你的工作!

3b6akqbq

3b6akqbq4#

未来:
如果您通过shell(如gdb)使用调试器启动一些程序,请使用带单引号表示法:

{
    {
            "name": "(gdb) Launch",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/main",
            "args": ["'{\"invalid: 123}'"],
            "stopAtEntry": false,
            "cwd": "${fileDirname}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "setupCommands": []
        }

如果跳过单引号,gdb将从shell接收到类似下面的内容,用于重定向第一个和第二个参数:{, "invalid: 123},这将导致EOF异常,因为"没有结尾。如果使用单引号,gdb将收到:{"invalid: 123},它是具有开始和结束的适当独立参数。

相关问题