我有以下内容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?
最近可以使用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)
鉴于 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。
| 归档时间: |
|
| 查看次数: |
473 次 |
| 最近记录: |