使用Nix Flake构建Golang项目时如何安装配置PostgreSQL
问题原因
你当前把postgresql加入buildInputs的写法,仅会在Go模块的编译阶段提供PostgreSQL的依赖库、头文件,不会在运行环境安装PostgreSQL实例,更不会自动启动服务、初始化数据库。
实现方案
我们可以通过Flake的apps输出,将「构建IRMA、启动PostgreSQL、初始化数据库、执行连接测试」的逻辑封装为可直接执行的脚本,实现一键运行。
完整Flake示例
{ description = "IRMA with PostgreSQL flake"; inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; flake-utils.url = "github:numtide/flake-utils"; }; outputs = { self, nixpkgs, flake-utils, ... }: flake-utils.lib.eachDefaultSystem (system: let pkgs = import nixpkgs { inherit system; }; # 构建IRMA Go模块 irma = pkgs.buildGoModule rec { pname = "irma"; version = "0.8.0"; # 替换为你实际的源码路径 src = ./.; vendorSha256 = "sha256-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="; # 编译期依赖保留,用于Go程序编译时链接PG相关库 buildInputs = [ pkgs.postgresql ]; }; # 封装一键执行脚本 irmaWithPostgres = pkgs.writeShellScriptBin "irma-with-postgres" '' set -e # 定义PostgreSQL数据目录,默认放在当前目录的pg_data export PGDATA=$PWD/pg_data export PGPORT=5432 export PGDATABASE=irma_db export PGUSER=irma_user # 1. 初始化数据库(仅第一次运行执行) if [ ! -d "$PGDATA" ]; then ${pkgs.postgresql}/bin/initdb -U $PGUSER # 配置监听地址 echo "listen_addresses = 'localhost'" >> $PGDATA/postgresql.conf echo "host all all 127.0.0.1/32 trust" >> $PGDATA/pg_hba.conf fi # 2. 后台启动PostgreSQL服务 ${pkgs.postgresql}/bin/pg_ctl start -l $PGDATA/postgres.log # 等待PG启动完成 until ${pkgs.postgresql}/bin/pg_isready -q -p $PGPORT; do sleep 1 done # 3. 创建业务数据库 ${pkgs.postgresql}/bin/createdb -U $PGUSER $PGDATABASE || true # 4. 执行连接测试(替换为你实际的IRMA测试命令) echo "PostgreSQL 连接测试成功,IRMA 路径:${irma}/bin/irma" ${irma}/bin/irma # 替换为你实际的启动参数 # 运行结束后可选停止PG服务,需要保留的话可以注释下行 ${pkgs.postgresql}/bin/pg_ctl stop ''; in { packages = { inherit irma irmaWithPostgres; default = irmaWithPostgres; }; apps = { irma = { type = "app"; program = "${irma}/bin/irma"; }; irma-with-postgres = { type = "app"; program = "${irmaWithPostgres}/bin/irma-with-postgres"; }; default = self.apps.${system}.irma-with-postgres; }; }); }
使用方法
- 执行
nix run即可一键完成全部流程:自动构建IRMA、启动PostgreSQL实例、创建数据库、执行测试 - 执行
nix build .#irma仅构建IRMA可执行文件 - PostgreSQL数据默认保存在当前目录的
pg_data文件夹,重启不会丢失数据
可选:系统级永久部署
如果你需要在NixOS系统上永久安装PostgreSQL服务和IRMA,可以在Flake中新增nixosModules输出,将PostgreSQL服务加入系统配置,开机自动启动。
内容的提问来源于stack exchange,提问作者raghu
相关产品推荐
相关产品推荐

