Linux 上包含 =、& 的 Node-gyp(或 gyp)动作目标

Node-gyp (or gyp) action targets containing =, & on Linux

我在 Linux 上使用 node-gyp 并且需要使用操作来定义自定义构建步骤(注意确定这是 node-gyp 问题还是一般 gyp 问题)。

documentation 似乎建议您将构建步骤的命令指定为字符串数组,这些字符串必须在某个时刻连接在一起以形成命令:

'action': ['python', 'tools/js2c.py', '<@(_outputs)', 'CORE', '<@(core_library_files)'],

因为它是 Linux,node-gyp 将为 binding.gyp 文件中的每个目标生成一个 makefile,对于操作,自定义命令将出现在该 makefile 中。

我遇到的问题是命令需要包含一个 = 符号来将环境变量设置为命令的一部分,我需要用 && 链接命令,例如:

export FOO=BAR && do-something-else --option

如果我尝试将其指定为 gyp 操作步骤,我会遇到各种问题。我尝试在命令中将每个 'word' 作为单独的数组元素添加。

'action': ['export', 'FOO=BAR', '&&', 'do-something-else', '--option'],

那行不通,gyp(或者更确切地说,shell 命令被传递到)抱怨“&&”不是有效标识符。

查看生成的 makefile,命令已扩展为这个,这解释了 shell 错误:

export "FOO=BAR" "&&" do-something-else --option

引号留在变量赋值和 && 两边。目前还不清楚为什么。我尝试了很多变体来阻止这种情况的发生,但都无济于事。任何包含 = 或 & 的内容都以引号结尾,这在大多数情况下会导致命令语法无效。

感谢建议。

发生这种情况的原因是 Gyp 将第一个单词之后的所有内容视为第一个单词中给出的命令的参数,因此它引用这些和其他特殊字符以防止 shell 解释它们。我认为没有任何方法可以阻止它,正如您发现的那样,这使得使用 shell 命令的管道创建自定义命令几乎是不可能的。