在Haskell中使用分析运行堆栈

fak*_*ake 6 haskell haskell-stack

我尝试跑步

$ stack build --profile && stack run myexec --rts-options -p
Run Code Online (Sandbox Code Playgroud)

但是我明白了

... 
Registering library for mylibrary-0.1.0.1..
Completed 2 action(s).      
myexec: the flag -p requires the program to be built with -prof
...
Run Code Online (Sandbox Code Playgroud)

我知道我可以跑步

$ .stack-work/dist/x86_64-linux/Cabal-2.4.0.1/build/myexe/myexe +RTS -p
Run Code Online (Sandbox Code Playgroud)

但是那有什么意义stack run呢?我不想知道cabal的版本和体系结构等(所有这些都发生在makefile中)。

leh*_*ins 6

您使用的命令stack run是一个方便的命令,它不仅运行二进制文件,而且还在此之前构建它。因此,当您运行时stack build --profile,它会使用所有必要的 ghc 标志来编译二进制文件,但是当您调用它时stack run,它会再次编译它,但现在没有所有分析标志。所以有两种方法可以正确地做到这一点:

  1. 不要运行stack build,因为它是多余的:
$ stack --profile run myexec --rts-options -p
Run Code Online (Sandbox Code Playgroud)
  1. 或者直接使用标志调用可执行文件+RTS,但请确保传递--profile给两个stack调用,否则将stack exec在错误的位置查找二进制文件(即非分析构建)并且无法找到它。
$ stack --profile build
$ stack --profile exec -- myexec +RTS -p
Run Code Online (Sandbox Code Playgroud)