如何用Cabal/Haskell设置postgresql-typed所需的多个环境变量?
Haskell/Cabal 加载PostgreSQL环境变量的惯用方案
针对你使用postgresql-typed库时需要手动设置环境变量的问题,有几种跨平台且符合Haskell生态的惯用解决方式:
1. 代码层面用dotenv包加载.env文件
直接在程序里读取.env文件并注入环境变量,完全脱离shell配置:
- 在你的
.cabal文件的build-depends里加上dotenv依赖 - 在程序入口的
main函数开头加载环境变量:
import System.Environment.Dotenv (loadFile, defaultConfig) main :: IO () main = do loadFile defaultConfig -- 默认加载项目根目录下的.env文件 -- 后续的数据库操作逻辑
- 在项目根目录创建
.env文件,填入所需的PostgreSQL变量:
PGHOST=localhost PGPORT=5432 PGDATABASE=your_db_name PGUSER=your_user PGPASSWORD=your_password
这种方式跨平台,不管在Windows还是Unix-like系统都能直接运行,不需要改任何shell配置。
2. 用Cabal结合shell工具自动加载
如果不想在代码里加依赖,可以用dotenv-shell工具配合Cabal命令:
- 先安装
dotenv-shell:cabal install dotenv-shell - 之后直接用
dotenv-shell cabal run或dotenv-shell cabal build启动,工具会先加载.env里的变量再执行Cabal命令。
3. 用direnv实现目录级自动加载
如果习惯在shell层面处理,但想要跨平台的自动加载,可以用direnv工具:
- 安装
direnv(支持Linux、macOS、Windows) - 在项目根目录创建
.envrc文件,写入:
dotenv .env
- 运行
direnv allow授权该目录的配置
之后只要进入项目目录,direnv就会自动加载.env里的环境变量,直接执行cabal build或cabal run就行。
注意点
- 把
.env添加到.gitignore里,别提交到版本库,避免泄露敏感信息 - postgresql-typed依赖的环境变量和标准PostgreSQL客户端的变量一致,确保变量名拼写正确
内容的提问来源于stack exchange,提问作者Harshal Patil
相关产品推荐
相关产品推荐

