Nixos

如何為 lua 設置 nix-shell 腳本?

  • July 1, 2021

我正在嘗試設置一個包含 lua 5.2、lua 套接字庫和其他一些庫的 nix-shell 腳本。但是,當我載入 shell 時,最終只有 Lua 存在。

with import <nixpkgs> {};
stdenv.mkDerivation rec {
 name = "lua-env";
 buildInputs = [ lua52Packages.lua lua52Packages.luasocket lua52Packages.luasec lua52Packages.cjson ];
}

當我執行 shell 時,這就是我得到的:

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:~  $ 

你必須設置LUA_PATHLUA_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

引用自:https://serverfault.com/questions/789897