在Elixir中使用xvfb-run执行Node脚本时遭遇依赖错误的技术问询
解决Elixir中调用xvfb-run时的参数传递问题
我明白你遇到的困扰了——在终端里能正常跑的xvfb-run命令,放到Elixir的System.cmd里就失效,核心问题出在shell和Elixir参数传递时的引号处理逻辑差异上。
问题根源
先看你在终端里的正常命令:
xvfb-run -a --server-args="-screen 0 1366x768x24" node something.js
这里的双引号是给终端shell看的,作用是告诉shell把-screen 0 1366x768x24当成一个完整的参数传递给--server-args,shell执行时会自动去掉引号,xvfb-run实际收到的是--server-args和-screen 0 1366x768x24两个独立的参数部分。
但你在Elixir里写成:
System.cmd "xvfb-run", ["-a", "--server-args=\"-screen 0 1366x768x24\"", "node", "something.js"]
这会让xvfb-run收到的是带引号的完整字符串:--server-args="-screen 0 1366x768x24",它无法正确解析这个包含引号的值,自然没启动虚拟X服务器,导致node脚本报错和直接跑node something.js的情况一致。
正确的写法
你只需要调整参数列表,去掉不必要的引号,让--server-args和它的参数正确分离即可:
写法1:拆分选项与参数
System.cmd("xvfb-run", ["-a", "--server-args", "-screen 0 1366x768x24", "node", "something.js"])
写法2:合并选项与参数(无引号)
System.cmd("xvfb-run", ["-a", "--server-args=-screen 0 1366x768x24", "node", "something.js"])
两种写法都能让xvfb-run正确识别虚拟屏幕参数,顺利启动虚拟X服务器,node脚本就能正常依赖xvfb运行了。
关于Porcelain库的问题
如果用Porcelain时还是沿用了错误的带引号参数列表,那肯定也会踩同样的坑。按照上面的正确参数格式调整Porcelain的调用就行:
# 用shell字符串形式 Porcelain.shell("xvfb-run -a --server-args '-screen 0 1366x768x24' node something.js") # 或者用参数列表形式 Porcelain.exec("xvfb-run", ["-a", "--server-args", "-screen 0 1366x768x24", "node", "something.js"])
内容的提问来源于stack exchange,提问作者Jakub Zawiślak
相关产品推荐
相关产品推荐

