在 Windows 平台上超时从 perl 到 运行 gradle 的最佳方法是什么?

What is the best way to run gradle from perl with a timeout on a Windows platform?

我在高中教授计算机科学 class,我正在尝试针对我所有学生提交的内容自动执行 JUnit 测试。我正在使用 perl 脚本包装器克隆学生存储库,并最初使用系统(“gradle 测试”)到 运行 每个存储库中的测试。

我发现我需要添加一个超时机制,因为我的一些学生在他们的代码中创建了循环,所以我改用 IPC::Cmd 如下:

$cmd = "gradle test";
my ($success, $error, $full_buf,$stdout_buf,$stderr_buf) = 
     run (command =>$cmd, verbose => 1, timeout => 20);

这在 Mac 上效果很好,但在 Windows 上,我从 gradle 收到以下错误: 无法确定 Stdout 是否为控制台:无法获取句柄文件信息(错误号 1)

我已经尝试重定向 stdout 和 stderr,但是对于 stdin 却失败了... 任何想法将不胜感激。

Could not determine if Stdout is a console

当我用下面的 perl 脚本替换您的 $cmd = "gradle test" 时,我无法重现该错误(Windows 10,Strawberry Perl 版本 5.30.1)。但是,超时不会按预期工作。这是我的简单测试程序:

use strict;
use warnings;
use feature qw(say);
use Data::Dumper;
use IPC::Cmd qw(run);

my $timeout = shift @ARGV;
#my $cmd = ['perl', '-E', "sleep 4; exit 1"];
my $cmd = ['perl', '-E', "sleep 4; say 'stdout_text'; say STDERR 'stderr_text'"];
my ($success, $error, $full_buf,$stdout,$stderr) = 
     run (command =>$cmd, verbose => 1, timeout => $timeout);
say "success = $success" if $success;
say "error = $error" if $error;
print Dumper({ stdout => $stdout, stderr => $stderr});

如果我运行超时为1,我得到

> perl p.pl 1
Running [perl -E sleep 4; say 'stdout_text'; say STDERR 'stderr_text']...
stderr_text
stdout_text
error = IPC::Cmd::TimeOut: Command 'perl -E sleep 4; say 'stdout_text'; say STDERR 'stderr_text'' aborted by alarm after 1 seconds
$VAR1 = {
          'stdout' => [
                        'stdout_text
'
                      ],
          'stderr' => [
                        'stderr_text',
                        '
'
                      ]
        };

所以即使它报告它在一秒后超时,它实际上 运行 程序结束了。我正在调查这个问题。