Как мне настроить скрипт nix-shell для lua?
Я пытаюсь настроить скрипт nix-shell, который содержит lua 5.2, библиотеку lua sockets и несколько других библиотек. Тем не менее, когда я загружаю оболочку, присутствует только Lua.
with import <nixpkgs> {};
stdenv.mkDerivation rec {
name = "lua-env";
buildInputs = [ lua52Packages.lua lua52Packages.luasocket lua52Packages.luasec lua52Packages.cjson ];
}
Когда я запускаю оболочку, вот что я получаю:
savanni@lapis:~ $ nix-shell lua.nix
[nix-shell:~]$ lua
Lua 5.2.3 Copyright (C) 1994-2013 Lua.org, PUC-Rio
> require 'socket'
stdin:1: module 'socket' not found:
no field package.preload['socket']
no file '/usr/share/lua/5.2/socket.lua'
no file '/usr/share/lua/5.2/socket/init.lua'
no file '/usr/lib/lua/5.2/socket.lua'
no file '/usr/lib/lua/5.2/socket/init.lua'
no file './socket.lua'
no file '/usr/lib/lua/5.2/socket.so'
no file '/usr/lib/lua/5.2/loadall.so'
no file './socket.so'
stack traceback:
[C]: in function 'require'
stdin:1: in main chunk
[C]: in ?
>
[nix-shell:~]$ exit
savanni@lapis:~ $
2 ответа
Вы должны установить LUA_PATH
а также LUA_CPATH
это shell.nix
должно сработать,
with import <nixpkgs> {};
with luaPackages;
let
libs = [lua cjson luasocket luasec];
in
stdenv.mkDerivation rec {
name = "lua-env";
buildInputs = libs;
shellHook = ''
export LUA_CPATH="${lib.concatStringsSep ";" (map getLuaCPath libs)}"
export LUA_PATH="${lib.concatStringsSep ";" (map getLuaPath libs)}"
'';
}
Чтобы проверить, что эти пути экспортированы,
$ nix-shell --run 'echo $LUA_CPATH; echo $LUA_PATH'
/nix/store/lp0ns0hjwx1klk6amnyic3f62bw7h8j7-lua-5.2.3/lib/lua/5.2/?.so;/nix/store/lp0ns0hjwx1klk6amnyic3f62bw7h8j7-lua-5.2.3/share/lua/5.2/?.so;/nix/store/ppdspfcm5nnfz0fk9zarjmpyv5lcmn18-lua5.2-cjson-2.1.0/lib/lua/5.2/?.so;/nix/store/ppdspfcm5nnfz0fk9zarjmpyv5lcmn18-lua5.2-cjson-2.1.0/share/lua/5.2/?.so;/nix/store/b71xyq7gkc8iccj6wr84zq31gqc3m9ix-lua5.2-socket-3.0-rc1/lib/lua/5.2/?.so;/nix/store/b71xyq7gkc8iccj6wr84zq31gqc3m9ix-lua5.2-socket-3.0-rc1/share/lua/5.2/?.so;/nix/store/6q8xn2bcfskmrfzql47jld5d2irvn5jr-lua5.2-sec-0.6/lib/lua/5.2/?.so;/nix/store/6q8xn2bcfskmrfzql47jld5d2irvn5jr-lua5.2-sec-0.6/share/lua/5.2/?.so
/nix/store/lp0ns0hjwx1klk6amnyic3f62bw7h8j7-lua-5.2.3/lib/lua/5.2/?.lua;/nix/store/lp0ns0hjwx1klk6amnyic3f62bw7h8j7-lua-5.2.3/share/lua/5.2/?.lua;/nix/store/ppdspfcm5nnfz0fk9zarjmpyv5lcmn18-lua5.2-cjson-2.1.0/lib/lua/5.2/?.lua;/nix/store/ppdspfcm5nnfz0fk9zarjmpyv5lcmn18-lua5.2-cjson-2.1.0/share/lua/5.2/?.lua;/nix/store/b71xyq7gkc8iccj6wr84zq31gqc3m9ix-lua5.2-socket-3.0-rc1/lib/lua/5.2/?.lua;/nix/store/b71xyq7gkc8iccj6wr84zq31gqc3m9ix-lua5.2-socket-3.0-rc1/share/lua/5.2/?.lua;/nix/store/6q8xn2bcfskmrfzql47jld5d2irvn5jr-lua5.2-sec-0.6/lib/lua/5.2/?.lua;/nix/store/6q8xn2bcfskmrfzql47jld5d2irvn5jr-lua5.2-sec-0.6/share/lua/5.2/?.lua
В 2020 году это можно сделать проще:
nix-shell -p 'lua.withPackages(ps: [ps.luasocket ps.cjson])'
Это поместит измененныйlua
вывод в вашей среде, гдеluasocket
иcjson
производные отluaPackages
включены в.
Так что не надо возитьсяLUA_PATH
илиshellHooks
сам.
РЕДАКТИРОВАТЬ:
Вы можете использоватьlua.withPackages
функция также в файле nix:
with import <nixpkgs> {};
stdenv.mkDerivation rec {
name = "lua-env";
buildInputs = [ lua.withPackages(ps: with ps; [luasocket luasec cjson ]) ];
}