NAnt exec命令乱搞输出

时间:2015-01-14 03:35:48

标签: npm nant

当我执行从命令行调用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)

但是,当我从NAnt脚本调用相同的批处理文件时,使用exec任务,输出变得乱码(即使我使用&#34;输出&#34;切换到管道输出到文件):< / p>

 [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)

有解决方法吗?

1 个答案:

答案 0 :(得分:2)

此行为是由NAnt exec任务的内部未在StandardOutput流读取器上设置编码引起的。我用我自己的控制台应用程序复制了这个行为。

有问题的方法在这里: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任务之外,我还在努力加载自定义任务。