如何在 Nix 环境中安装 PostGIS

  • 本文关键字:安装 PostGIS 环境 Nix nix
  • 更新时间 :
  • 英文 :


我有以下shell.nix(设置我的开发环境,没有NixOS):

with import <nixpkgs> {};
stdenv.mkDerivation {
    name = "my-shiny-project";
    buildInputs = [
        jq
        nodejs-6_x
        #postgis {version="2.3.1";}
        #postgis ("2.3.1")
        #postgis "2.3.1"
        postgresql96
        zsh
    ];
    shellHook = ''
        export SHELL=zsh
        export PATH="$PWD/node_modules/.bin/:$PATH"
    '';
}

PostGIS 需要一个版本参数。我不确定如何传递该参数。无论我使用 postgis{version="2.3.1";}postgis("2.3.1") 还是 postgis "2.3.1",我都会收到以下错误:

错误:无法强制将设置为字符串,位于/nix/store/0rj9y7gvzzahp93cvdmrwc2v2aznh61p-nixpkgs-18.03pre118061.69607d7662/nixpkgs/pkgs/stdenv/generic/make-derivation.nix:98:11

在函数和

导入Nix药丸的无名和单参数部分中,我看到调用函数的语法很简单NAME PARAM

我必须向buildInputs添加什么才能为该特定版本的PostgreSQL安装PostGIS?

最近可以使用postgresql.withPackages

with import <nixpkgs> {};
mkShell {
    buildInputs = [
        jq
        nodejs
        ( postgresql11.withPackages (p: [ p.postgis ]) )
        zsh
    ];
    shellHook = ''
        export SHELL=${zsh}/bin/zsh
        export PATH="${builtins.toPath ./.}/node_modules/.bin/:$PATH"
        export PGDATA=${builtins.toPath ./.}/pg
        export PGHOST=$PGDATA
        pg_ctl initdb
        pg_ctl -o "-p 5555 -k $PGDATA" start
        psql -p 5555 postgres -c 'create extension postgis' || true
    '';
}

鉴于 postgresql 被设计为用作服务,这确实是一个黑暗中的刺痛,但它只能作为一个包提供给你,因为你不在 NixOS 上。但是试试这个:

with import <nixpkgs> {};
stdenv.mkDerivation {
    name = "my-shiny-project";
    buildInputs = [
        jq
        nodejs-6_x
        postgis.v_2_3_1
        postgresql96
        zsh
    ];
    shellHook = ''
        export SHELL=zsh
        export PATH="$PWD/node_modules/.bin/:$PATH"
    '';
}

解释

postgis 包不会生成派生,因此不能直接使用它的输出。相反,它会生成一个包含两个版本的属性集:2.3.1 和 2.4.0。

警告

以上可能根本不起作用。问题是 postgis 通常通过 extraPlugins 属性提供给 postgresql,如下所示:

services.postgresql.extraPlugins = [ (pkgs.postgis.override { postgresql = pkgs.postgresql95; }).v_2_3_1 ];

这会导致 postgresql 以这样一种方式安装,以便它可以看到 postgis 库。但是,这是在服务级别完成的,而不是在软件包级别完成的,并且服务仅适用于 NixOS。因此,如果上述方法不起作用,请尝试以下代码:

with import <nixpkgs> {};
let
   pg = postgresql96;
   postgresqlWithPlugins =
     buildEnv {
      name = "postgresql-and-plugins-${(builtins.parseDrvName pg.name).version}";
      paths = [ pg pg.lib (postgis.override { postgresql = pg; }).v_2_3_1) ];
      buildInputs = [ makeWrapper ];
      postBuild =
        ''
          mkdir -p $out/bin
          rm $out/bin/{pg_config,postgres,pg_ctl}
          cp --target-directory=$out/bin ${pg}/bin/{postgres,pg_config,pg_ctl}
          wrapProgram $out/bin/postgres --set NIX_PGLIBDIR $out/lib
        '';
};
in
stdenv.mkDerivation {
    name = "my-shiny-project";
    buildInputs = [
        jq
        nodejs-6_x
        postgresqlWithPlugins
        zsh
    ];
    shellHook = ''
        export SHELL=zsh
        export PATH="$PWD/node_modules/.bin/:$PATH"
    '';
}

基本上,这是extraPlugins实现的未经测试的端口。

最新更新