PHPUnit 命令行工具中的控制字符有啥问题?

Posted

技术标签:

【中文标题】PHPUnit 命令行工具中的控制字符有啥问题?【英文标题】:What is wrong with control characters in PHPUnit command line tool?PHPUnit 命令行工具中的控制字符有什么问题? 【发布时间】:2012-01-30 11:02:21 【问题描述】:

当我从命令行运行 phpunit 时,控制字符会被打印出来,而不是像控制字符一样。看看这个:

PHPUnit 3.6.5 by Sebastian Bergmann.

Configuration read from app\phpunit.xml.dist

...

Time: 1 second, Memory: 12.00Mb

‹[30;42m‹[2KOK (3 tests, 3 assertions)
‹[0m‹[2K

我认为像‹[30;42m< 这样的符号是某种控制字符,应该由控制台以不同的方式使用(定位光标、删除字符等)

这里有什么问题?

【问题讨论】:

交叉引用:How to see color Ant output in MSYS/Git Bash? 超级用户:PHPUnit Windows command box nice colors 【参考方案1】:

这是因为您已将 phpunit 配置为使用颜色。

<phpunit colors="true"

但遗憾的是,无法在 Windows 终端上创建彩色输出。

有一个未解决的问题 to not show those chars on windows where they can't be translated into colors 在 phpunit 问题跟踪器上,我正在为此开发补丁。

现在你所能做的就是接受它或从你的 phpunit.xml 配置文件中删除color="true"

【讨论】:

当它被明确要求提供 ANSI 颜色代码时,为什么要发出通知? @hakre 告诉你它在 Windows 上不受支持,所以你知道你应该在你的配置中禁用它。毕竟,这就是 OP 面临的问题,她/他不需要问是否有通知。 好吧,如果这是您的配置,那么您一定启用了它,不是吗?可能 pear 安装程序应该处理依赖于平台的默认值,但这将是一个打包问题,而不是 PHPUnit 本身的问题。 @harke 不一定。您可能与使用 linux 的其他人一起工作,并且她/他启用了它,然后您更新了本地 repo,然后您得到了 ctrl 字符。这是通知人们有关不兼容设置的有效请求。我看不出有什么好争论的。 @hakre 如果我找到一种方法来检测终端是否与颜色兼容,我们将使用它。如果不是,我想我只是将它用于 Windows 标准输出【参考方案2】:

或者,只需使用 https://github.com/adoxa/ansicon/releases 在 Windows 上获取 ansi 颜色。

源码:https://github.com/adoxa/ansicon

【讨论】:

比我找到的选项好很多。很高兴知道存在:) 挂了,能重新上传一下吗 更新后的网址是adoxa.altervista.org/ansicon,可以从github链接找到。使用 ansicon -i 为当前用户永久安装(或 -I 用于本地计算机)。还为 Windows 上的 Git Bash 启用颜色。【参考方案3】:

我最近在尝试从 Windows 7 上的 git bash 中的命令行运行 phpunit 时遇到了同样的问题。在对可能的各种解决方案进行了一些研究之后,我决定在这里分享我选择为自己实现的解决方案。

您可以从 git bash 中过滤掉 ANSI 颜色控制字符。创建一个名为 phpunit 的文件(注意:实际的 phpunit 脚本不在我的路径中,我主要只从 intellij 运行单元测试)并将其放在您的 $PATH 中的任何位置(我自己更喜欢 ~/bin 但没有规则):

#!/bin/sh
/path/to/phpunit "$@" 2>&1 | perl -pe 's/(?<=\e\[)2;//g'

"$@" 告诉 bash 获取传递给脚本的其余参数并将它们转发给 phpunit。 2&gt;&amp;1redirects stderr to stdout,确保在产生错误输出时产生的任何控制字符也将被过滤掉。

最后,由 phpunit 产生的所有输出都通过 perl 进行管道传输,并通过正则表达式 's/(?&lt;=\e\[)2;//g' 运行,该表达式去除了控制字符。

无论您使用什么&lt;phpunit colors="" 设置,最终结果是 phpunit 运行良好。

希望这会有所帮助!

【讨论】:

【参考方案4】:

谢谢丹尼,你的回答很有帮助。

对于想要实现这几点的用户:

    将 Danny 的代码放入 shell 文件(例如 ~/.phpunit.sh)

    在 ~/.bashrc 中为 phpunit 添加一个别名(只需添加以下行)。如果您还没有 .bashrc,只需创建一个空文件。

    别名 phpunit="~/.phpunit.sh"

    关闭 bash 并再次打开

    现在应该可以正常工作了,但请进行测试以确保。

【讨论】:

【参考方案5】:

正如他们所说,这对我有用。

转到 ~/ 目录中的 .bashrc 并添加

alias phpunitc="phpunit "$@" 2>&1 | perl -pe 's/(?<=\e\[)2;//g'"

然后我只是在 git bash 中使用 phpunitc。您发送给 phpunit 的所有参数也会通过。

【讨论】:

以上是关于PHPUnit 命令行工具中的控制字符有啥问题?的主要内容,如果未能解决你的问题,请参考以下文章

Cmder命令行工具在Windows系统中的配置

如何跳过 PHPunit 中的测试?

干掉cmd:windows下使用linux命令行

Linux网络编程学习 ----- 进程控制实例

PHPUnit\Framework\TestCase 和 Tests\TestCase 有啥区别?

Node.js 命令行工具的编写