You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 22:15:03