如何在 Nix 环境中安装 PostGIS

Fra*_*eil 5 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"
    '';
}
Run Code Online (Sandbox Code Playgroud)

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-1

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

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

dan*_*bst 5

最近可以使用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
    '';
}
Run Code Online (Sandbox Code Playgroud)


Emm*_*osa 1

鉴于 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"
    '';
}
Run Code Online (Sandbox Code Playgroud)

解释

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

警告

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

services.postgresql.extraPlugins = [ (pkgs.postgis.override { postgresql = pkgs.postgresql95; }).v_2_3_1 ];
Run Code Online (Sandbox Code Playgroud)

这会导致 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"
    '';
}
Run Code Online (Sandbox Code Playgroud)

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