在 haskell-stack 中设置 GHC 选项的各种方法如何协同工作
Posted
技术标签:
【中文标题】在 haskell-stack 中设置 GHC 选项的各种方法如何协同工作【英文标题】:How do the various ways of setting GHC options in haskell-stack work together 【发布时间】:2018-03-28 08:10:49 【问题描述】:在为优化构建服务器应用程序设置部署管道时,我在使用 stack-1.6.5 正确设置 GHC 选项时遇到了一些问题。
特别是,从文档中,我不清楚指定 GHC 选项的各种方法如何协同工作以及它们何时以及如何应用。
据我所知,有 X 种指定 GHC 选项的方法:
在~/.stack/config.yaml
和/或/etc/stack/config.yaml
中以ghc-options:
的形式在全球范围内使用,或使用"$locals"
、"$targets"
或"$everything"
在项目stack.yaml
文件中,每个包或"$locals"
、"$targets"
或"$everything"
在项目package.yaml
/.cabal
文件中,全局或每个目标
在依赖stack.yaml
/package.yaml
/.cabal
文件中
在堆栈命令行上通过--ghc-options
在stack.yaml
和~/.stack/config.yaml
和/或/etc/stack/config.yaml
中有apply-ghc-options:
设置locals
/targets
/everything
我想知道在不同的构建阶段快照/本地/目标中应用了哪些选项,以何种顺序以及在哪些情况下它们是附加或覆盖其他地方给出的选项。
【问题讨论】:
【参考方案1】:好问题,这没有充分记录。这些往往是添加剂。大部分逻辑都在这里:https://github.com/commercialhaskell/stack/blob/657937b0ac5dbef29114b43e9c69e2b57198af85/src/Stack/Build/Source.hs#L131。这是顺序,列表中后面的项目在提供给 ghc 的选项中位于后面:
在 package.yaml / cabal 文件中指定的选项。$everything
在 stack.yaml 的 ghc-options 中
$locals
在 stack.yaml 的 ghc-options 中
$targets
在 stack.yaml 的 ghc-options 中
特殊选项,例如 -fhpc
(--coverage) / fprof-auto -fprof-cafs
(--profile) / -g
(--no-strip)。
通过 CLI 上的 --ghc-options
指定的选项
目前存在一个问题,.stack/config.yaml
中指定的 $everything
/ $locals
/ $targets
ghc-options 不是附加的。相反,它们目前被 stack.yaml
项目所掩盖。有一个 PR 解决了这个问题,它可能会在某个时候被合并:https://github.com/commercialhaskell/stack/pull/3781
【讨论】:
以上是关于在 haskell-stack 中设置 GHC 选项的各种方法如何协同工作的主要内容,如果未能解决你的问题,请参考以下文章
在 Android BottomNavigationView 中设置所选项目