如何为GHC传递-ddump-splices选项查看Yesod路由生成代码?
如何为Yesod项目的GHC传递-ddump-splices选项
我刚开始摸索Yesod的时候也踩过这个坑——stack的参数和GHC的参数很容易混,得用正确的方式把-ddump-splices传给GHC才行,下面给你两种常用的方法:
用stack runghc直接运行单文件的正确命令
stack runghc会先处理自己的参数,如果你直接把-ddump-splices放在文件名前面,stack会把它当成自己的选项,根本传不到GHC那里。正确的做法是用--来分隔stack的参数和要传给GHC的参数:
stack runghc -- -ddump-splices helloworld.hs
这样--后面的-ddump-splices就会被正确传递给GHC,你就能在终端看到mkYesod生成的所有模板Haskell代码了。如果想把输出保存到文件里,可以指定输出路径:
stack runghc -- -ddump-splices=yesod-routes-gen.txt helloworld.hs
针对完整Yesod项目的持久化设置
如果你的项目是用stack new创建的完整Yesod项目,不想每次运行都手动加参数,可以把-ddump-splices加到项目配置里:
- 修改.cabal文件:找到你的可执行程序对应的
executable块,添加ghc-options字段:executable helloworld main-is: Main.hs build-depends: base >=4.14 && <5, yesod >=1.6 hs-source-dirs: app default-language: Haskell2010 ghc-options: -ddump-splices - 或者修改stack.yaml:在文件里添加全局的GHC选项(注意会作用于整个项目的所有目标):
ghc-options: "*": -ddump-splices
之后运行stack build,GHC就会自动输出所有模板Haskell生成的代码,一般会放在.stack-work/dist/[你的系统架构]/Cabal-[版本]/build/目录下的对应文件里。
通过-ddump-splices你能清楚看到mkYesod "HelloWorld" [parseRoutes| / HomeR GET |]背后生成的路由类型、Yesod类实例、请求处理的辅助函数等代码,对理解Yesod的路由机制帮助很大。
内容的提问来源于stack exchange,提问作者softshipper
相关产品推荐
相关产品推荐

