我正在使用Haskell开展一个团队项目,每当我使用'cabal install'编译我们的项目时,我开始看到以下内容:
$ cabal clean && cabal install
cleaning...
Resolving dependencies...
Configuring hackathon-0.1...
Building hackathon-0.1...
Preprocessing executable 'hackathon' for hackathon-0.1...
[ 1 of 65] Compiling Data.MaybeUtil ( src/Data/MaybeUtil.hs, dist/dist-sandbox-52369b17/build/hackathon/hackathon-tmp/Data/MaybeUtil.o )
[ 2 of 65] Compiling Data.JQL ( src/Data/JQL.hs, dist/dist-sandbox-52369b17/build/hackathon/hackathon-tmp/Data/JQL.o )
[ 3 of 65] Compiling Data.Tuples ( src/Data/Tuples.hs, dist/dist-sandbox-52369b17/build/hackathon/hackathon-tmp/Data/Tuples.o )
...
$
但是,我的团队成员看到了:
$ cabal clean && cabal install
cleaning...
Resolving dependencies...
Configuring hackathon-0.1...
Building hackathon-0.1...
Installed hackathon-0.1
他们的配置有什么不同,他们没有看到以[X of N] My.Module开头的所有“进度”消息?
我真的希望他们能够看到正在发生的编译进度,因为我们的项目非常庞大,目前有65个模块并且正在增长。干杯!
答案 0 :(得分:3)
当您运行cabal install
多线程(-j2
及更高版本)时,单个文件编译不会出现在stdout
上,但仍应写入日志文件。
答案 1 :(得分:1)
好的,我决定只看一下源代码并回答我自己的问题。在深入了解cabal-install源代码并最终进入GHC源代码后,我最终在compiler/main/HscMain.hs的底部找到了我想要的内容:
showModuleIndex :: (Int, Int) -> String
showModuleIndex (i,n) = "[" ++ padded ++ " of " ++ n_str ++ "] "
where
n_str = show n
i_str = show i
padded = replicate (length n_str - length i_str) ' ' ++ i_str
这是打印模块索引的方法。它在名为batchMsg的函数中使用,该函数使用名为compilationProgressMessage的方法对其进行包装:
compilationProgressMsg :: DynFlags -> String -> IO ()
compilationProgressMsg dflags msg
= ifVerbose dflags 1 $
logOutput dflags defaultUserStyle (text msg)
正如您所看到的,如果详细程度为1或更高,此方法仅将内容打印到日志输出文件流。
所以我刚尝试在我的终端上做到这一点:
cabal install -j4 -v1
然后,如果我尾随-fabal-sandbox / logs / package-name.log文件,那么我可以看到模块索引的编译消息发生了。我认为这解决了这个问题。然后,当编译完成(或错误输出)时,所有模块消息都会打印到stdout。在GHC中并行编译似乎阻止了对stdout的打印调用。当你打开并行编译时,还有一些东西可以将详细程度设置为0。我认为这两个都是错误,应该修复,所以我现在可以尝试提出功能请求。
无论如何,我希望这项调查能够帮助其他人。欢呼并感谢所有人的指示!