我创建了一个使用自定义构建类型的cabal包。在Setup.hs中,我触发了一个postCopy
挂钩,我打算用它做一些IO。在触发器的主体中,我使用putStrLn
输出一行。
当我cabal install
包时,输出会被记录到文本文件中而不是显示在控制台上。更深入一点:我认为问题与所有触发器有关,不仅仅是postCopy
和cabal install
。因为,例如,如果我有一个postConf
触发器(执行一些IO)并运行cabal configure
,那么IO将按预期工作。但是,当我cabal install
时,postConf
触发器也会出现同样的问题。
有没有办法在stdout中显示触发器的输出?
>cabal --version
cabal-install version 1.22.6.0
using version 1.22.5.0 of the Cabal library
答案 0 :(得分:1)
据我所知,在安装期间cabal
运行Setup.hs,并将stdout和stderr重定向到文件。这有两个原因:
您可以使用--build-log
选项告诉cabal将记录信息写入的位置,例如:
cabal install --build-log /tmp/foo
此外,如果您正在运行类似Unix / Linux的系统,您可以写入/dev/tty
之类的设备并将输出返回给用户的终端(如果有的话)。例如:
import Distribution.Simple
import System.IO
main = do
putStrLn "=== I am here in Setup.hs"
withFile "/dev/tty" AppendMode $ \h -> do
hPutStrLn h "--- writing to /dev/tty"
defaultMain
当然,这是特定于操作系统的代码,如果他们没有使用与您相同的操作系统,则可能会给其他用户带来问题。
答案 1 :(得分:1)
如果您明确要求单线程构建,cabal会将其输出发送到stdout。使用
cabal install -j1
发出此请求。