如何在Nix环境中安装PostGIS

时间:2017-10-18 13:48:01

标签: nix

我有以下:help netrw-hiding(设置我的开发环境,没有NixOS):

shell.nix

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

  

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

Nameless and single parameter section of functions and imports Nix pill中,我看到调用函数的语法只是postgis "2.3.1"

我需要添加什么来NAME PARAM才能为特定版本的PostgreSQL安装PostGIS?

2 个答案:

答案 0 :(得分:0)

鉴于postgresql旨在用作服务,这真的是一个黑暗的刺,但它只能作为一个包提供给你,因为你不在NixOS上。但试试这个:

extraPlugins

说明

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

买者

以上可能根本不起作用。问题是postgis通常通过services.postgresql.extraPlugins = [ (pkgs.postgis.override { postgresql = pkgs.postgresql95; }).v_2_3_1 ]; 属性提供给postgresql,如下所示:

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"
    '';
}

这会导致postgresql的安装方式使其能够查看 postgis库。但是,这是在服务级别而不是包级别完成的,并且服务仅适用于NixOS。因此,如果上述方法无效,请尝试以下代码:

extraPlugins

基本上,这是keys实施的未经测试的端口。

答案 1 :(得分:0)

最近可以使用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
    '';
}