如何灵活地重定向任务中的输出

How to redirect output in a task in nimble

如果我在一个灵活的文件中有这个任务:

task readme, "generate README.md":
  exec "nim c -r readme.nim > README.md"

用这个 readme.nim:

echo "# Hello\nworld"

使用 nimble (nimble readme) 执行任务不会将 readme.nim 的输出重定向到文件。 正如预期的那样 运行 nim c -r readme.nim > README.md 从终端正确 creates/updates README.md.

这是 nimble 的预期行为吗?有解决方法吗?

注意:以上是在windows.

上测试的

我最终得到了预期的 README.md:

$ cat README.md
# Hello
world

但有时(readme.nim 必须编译或重新编译)我最终会得到这样的结果:

CC: readme.nim
# Hello
world

也就是说,nim c -r readme.nim 命令的完整标准输出(不是标准错误),正如预期的那样。作为一种解决方法,您可以将要执行的操作封装在 readme.nim:

import os

let f: File = open(commandLineParams()[0], fmWrite)
f.write "# Hello\nworld"
f.close()

在你灵活的文件中:

task readme, "generate README.md":         
  exec "nim c -r readme.nim README.md"

另一种解决方法是抑制 nim c:

的输出
task readme, "generate README.md":
  exec "nim c --verbosity:0 -r readme.nim > README.md"

感谢@xbello 的回答和随后的讨论,我为我的用例找到了一个很好的解决方法:

task readme, "generate README.md":
  exec "nim c readme.nim"
  "README.md".writeFile(staticExec("readme"))

解释为什么简单的 exec 与 nimble 使用 nimscript.exec 内部使用 rawExec 的事实有关(根据此处报告的不同行为判断) windows 和 linux) 在输出管道方面并不完全是 cross-platform。