NAnt exec 命令乱码输出

NAnt exec command garbling output

当我执行从命令行调用 npm 的批处理文件时,我看到了格式良好的输出,例如:

├── interpret@0.3.10
├── pretty-hrtime@0.2.2
├── deprecated@0.0.1
├── archy@1.0.0
├── minimist@1.1.0
├── tildify@1.0.0 (user-home@1.1.1)
├── semver@4.2.0
├── v8flags@1.0.8
├── chalk@0.5.1 (escape-string-regexp@1.0.2, ansi-styles@1.1.0, support
├── orchestrator@0.3.7 (stream-consume@0.1.0, sequencify@0.0.7, end-of-
├── liftoff@0.13.6 (extend@1.3.0, flagged-respawn@0.3.1, resolve@1.0.0,
├── vinyl-fs@0.3.13 (graceful-fs@3.0.5, mkdirp@0.5.0, vinyl@0.4.6, defa
└── gulp-util@3.0.2 (object-assign@2.0.0, array-differ@1.0.0, array-uni
gh2@0.6.3, multipipe@0.1.2, lodash.template@2.4.1, dateformat@1.0.11)

但是,当我使用 exec 任务从 NAnt 脚本调用同一个批处理文件时,输出变成乱码(即使我使用 "output" 开关将输出管道输出到文件):

 [exec] Ôö£ÔöÇÔöÇ pretty-hrtime@0.2.2
 [exec] Ôö£ÔöÇÔöÇ interpret@0.3.10
 [exec] Ôö£ÔöÇÔöÇ deprecated@0.0.1
 [exec] Ôö£ÔöÇÔöÇ archy@1.0.0
 [exec] Ôö£ÔöÇÔöÇ minimist@1.1.0
 [exec] Ôö£ÔöÇÔöÇ tildify@1.0.0 (user-home@1.1.1)
 [exec] Ôö£ÔöÇÔöÇ chalk@0.5.1 (escape-string-regexp@1.0.2, ansi-styles@1.1.0, supports-color@0.2.0, strip-ansi@0.3.0, has-ansi@0.1.0)
 [exec] Ôö£ÔöÇÔöÇ semver@4.2.0
 [exec] Ôö£ÔöÇÔöÇ v8flags@1.0.8
 [exec] Ôö£ÔöÇÔöÇ orchestrator@0.3.7 (stream-consume@0.1.0, sequencify@0.0.7, end-of-stream@0.1.5)
 [exec] Ôö£ÔöÇÔöÇ liftoff@0.13.6 (extend@1.3.0, flagged-respawn@0.3.1, resolve@1.0.0, findup-sync@0.1.3)
 [exec] ÔööÔöÇÔöÇ vinyl-fs@0.3.13 (graceful-fs@3.0.5, strip-bom@1.0.0, defaults@1.0.0, vinyl@0.4.6, mkdirp@0.5.0, glob-stream@3.1.18, glob-watcher@0.0.6, t
h2@0.6.3)

有解决办法吗?

此行为是由于 NAnt exec 任务的内部结构未在 StandardOutput 流 reader 上设置编码引起的。我已经用我自己的控制台应用程序复制了该行为。

有问题的方法在这里:https://github.com/nant/nant/blob/master/src/NAnt.Core/Tasks/ExternalProgramBase.cs#L511

缺少的是在 ProcessStartInfo 上设置编码的方法,例如:

StandardErrorEncoding = Encoding.UTF8

我能看到的唯一解决方法(除了向 Nant 提交拉取请求之外)是编写自定义任务。就这么简单:

[TaskName("customexec")]
public class CustomExecTask : ExecTask
{
    protected override void PrepareProcess(Process process)
    {
        base.PrepareProcess(process);
        process.StartInfo.StandardOutputEncoding = Encoding.UTF8;
        process.StartInfo.StandardErrorEncoding = Encoding.UTF8;
    }
}

但是,除了使用 loadtasks 任务之外,我一直在努力加载我的自定义任务。