问题描述
如果我在灵活的文件中有此任务:
task readme,"generate README.md":
exec "nim c -r readme.nim > README.md"
与此readme.nim
:
echo "# Hello\nworld"
使用灵活(nimble readme
)执行任务不会将readme.nim的输出重定向到文件。
如预期的那样,从终端运行nim c -r readme.nim > README.md
可以正确创建/更新README.md
。
这是故意的行为吗?有解决方法吗?
注释:以上内容已在Windows上进行了测试。
解决方法
感谢@xbello的回答并随后进行了讨论,我为我的用例找到了一个很好的解决方法:
task readme,"generate README.md":
exec "nim c readme.nim"
"README.md".writeFile(staticExec("readme"))
为什么简单的exec
与以下事实有关的解释:灵活使用nimscript.exec,内部使用rawExec
是内置的(根据此处针对Windows报告的不同行为进行判断)和linux)在考虑输出管道时并不是完全跨平台的。
我最终得到了预期的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"