Haskell Stack全局GHC配置失效:项目目录忽略~/.stack/config.yaml
解决Stack全局GHC优化选项在项目内失效的问题
我之前也踩过这个坑!Stack的配置加载逻辑确实容易让人困惑——全局~/.stack/config.yaml的设置在项目外正常生效,但到了项目目录里就好像“消失”了,其实核心是项目stack.yaml的优先级规则和配置继承的问题。下面给你几个实用的解决方案:
1. 让项目自动继承全局配置
默认情况下,Stack会用项目的stack.yaml覆盖全局配置的同名字段,而不是叠加。要让全局的GHC选项和项目配置共存,只需要在项目的stack.yaml里加一行:
inherit: true
这样全局的ghc-options会和项目里的选项合并,项目的特定设置优先级更高,但全局的激进优化标志不会被完全忽略。
2. 把全局配置改成默认模板
如果你不想每个项目都手动加inherit: true,可以修改全局~/.stack/config.yaml,把ghc-options放在defaults字段下,让所有新建或现有项目默认继承这些设置:
defaults: ghc-options: "$everything": -O3 -funbox-strict-fields -fllvm # 替换成你的激进优化标志
这样即使项目里有自己的ghc-options,全局的优化选项也会被叠加进去,不用再逐个项目修改。
3. 检查项目stack.yaml的覆盖设置
有时候项目的stack.yaml里可能有明确覆盖全局配置的写法,比如:
ghc-options: "$everything": -O2
这种情况下全局的$everything选项会被完全替换掉。你可以把项目里的ghc-options改成只针对特定包(比如你的项目主包),或者加上inherit: true来合并全局设置。
4. 用环境变量强制全局生效
如果上面的方法都不适合你,还有个“终极方案”——设置环境变量STACK_GHC_OPTIONS,这个变量的优先级最高,不管是在项目内还是项目外都会生效:
# 临时生效(当前终端) export STACK_GHC_OPTIONS="-O3 -funbox-strict-fields -fllvm" # 永久生效(根据你的shell类型) # Bash用户:添加到~/.bashrc # Zsh用户:添加到~/.zshrc echo 'export STACK_GHC_OPTIONS="-O3 -funbox-strict-fields -fllvm"' >> ~/.bashrc
重启终端后,所有Stack编译都会自动带上这些优化标志。
内容的提问来源于stack exchange,提问作者lcmylin
相关产品推荐
相关产品推荐

