iT邦幫忙

2025 iThome 鐵人賽

DAY 6
0

day05 ,我們示範了如何用 require 來使用 Lua 的標準函式庫 io,你可能會想問,那如果是第三方模組呢?

這會需要先在電腦上安裝第三方模組,然後也一樣透過 require 去引用。那有沒有類似 npm 之於 Node.js, pip 之於 Python 之類的程式,可以協助我們管理第三方模組呢?有的,就是 LuaRocks 。

之前有一個下午,我看到同事在 Emacs 裡,用一個指令直接完成 http get request ,覺得這真是太帥了。

於是,我開始尋找 Neovim 的插件,卻發現所有找到的 http request 插件都需要透過 LuaRocks 來安裝。

「那就來安裝個 LuaRocks 吧?」我心想。

brew install luarocks

LuaRocks 成功地安裝在我的 Macbook 筆電裡,但是,那個下午,無論我如何地努力,就是抵達不了終點。

問題出在哪呢?

如果你曾經做過 Python 開發,在一台電腦要不時切換 Python 3.10, 3.11, 3.22 。做過 Node.js 開發,要不時切換 node 20, node 21, node 22。做過 Java 開發,要不時切換 JVM 8, 17, 21 。我就是撞到這種問題。

多個直譯器的問題

Neovim 裡的 Lua ,它是 LuaJIT ,它相容於 Lua 5.1。這個直譯器是安裝 Neovim 時,就自動附在 Neovim 裡。它是一個嵌入式的執行環境。

另一方面,如果我用 Homebrew 來安裝 Lua 的話 ,現在這個時間點,它會是 Lua 5.4 。安裝了之後,我就可以直接在 Macbook 的 shell 環境裡執行 Lua 。

brew install lua

同樣的道理,我用 Homebrew 來安裝的 LuaRocks ,合理的設計,自然也會跟 Lua 5.4 綁定在一起,而不是 LuaJIT 。

LuaRocks

要安裝 LuaRocks 有兩個選項:

  1. 間接管理。使用 Neovim 的插件 luarocks.nvim 來為你安裝 LuaRocks ,爾後就由 Neovim 的插件來為你管理 LuaRocks 。這條路會簡單一些。
  2. 手動安裝 LuaRocks 。這條路的好處是,你會因此多加熟悉 LuaRocks 指令,將來如果要把 Lua 應用到 Neovim 以外的平台,LuaRocks 的知識可以帶著走。

手動安裝 LuaRocks

首先,要安裝 LuaJIT 。相較去找出 Neovim 的 LuaJIT ,直接用 Homebrew 安裝一個新的會簡單一些。

brew install luajit

接下來就開始下載 LuaRocks 的 tar 包、建立一個系統專用的 ~/.luarocks-luajit 目錄、設置參數、編譯、安裝。

wget https://luarocks.org/releases/luarocks-3.12.0.tar.gz
tar zxvf; cd luarocks-3.12.0
mkdir ~/.luarocks-luajit
./configure \
  --with-lua=$(brew --prefix luajit) \
  --with-lua-include=$(brew --prefix luajit)/include/luajit-2.1 \
  --lua-suffix=jit \
  --prefix=$HOME/.luarocks-luajit
make && make install

最後,我們需要告訴作業系統,日後下指令 luarocks 要去哪裡找這個可執行檔。並且用 source 重新載入 shell 的設定檔。

echo 'export PATH=$HOME/.luarocks-luajit/bin:$PATH' >> ~/.zshrc
source ~/.zshrc

特別注意一點:上述 LuaRocks 的版本很重要,因為 LuaJIT 2.0 有 65536 的限制。如果不是特定的 LuaRocks 版本,就會遇上這個錯誤:"Error: main function has more than 65536 constants"

使用 LuaRocks

安裝好之後,當你下達指令:

luarocks install ${package} 

新的 ${package} 就會被安裝到 $HOME/.luarocks-luajit/ 目錄下。

設定 Neovim 的路徑

到目前為止,儘管新的 Lua 模組已經安裝到正確的位置了,Neovim 裡的 LuaJIT 還是找不到它們,所以我們必須顯式地設置路徑。

先找到 Neovim 的設置檔位置,並且在此建立一個 lua 資料夾。

cd ~/.config/nvim/
mkdir lua 

在該資料夾下,建立一個 Lua script:luarocks.lua 。(檔案名稱可以隨便取。)

nvim lua/luarocks.lua

將以下內容貼入 luarocks.lua,然後存檔。

local function add_luarocks_paths()
  local home_dir = os.getenv("HOME")
  local luarocks_path = string.format("%s/.luarocks-luajit/share/lua/5.1/?.lua;%s/.luarocks-luajit/share/lua/5.1/?/init.lua", home_dir, home_dir)
  local luarocks_cpath = string.format("%s/.luarocks-luajit/lib/lua/5.1/?.so", home_dir)
  package.path = package.path .. ";" .. luarocks_path
  package.cpath = package.cpath .. ";" .. luarocks_cpath
end

return {add_luarocks_paths = add_luarocks_paths}

最後一步,在 ~/.config/nvim/init.vim 裡增加一行。

lua require("luarocks").add_luarocks_paths()

有興趣了解更多具體細節的讀者,可以考慮使用 Ex 指令 :luafile % 指令載入當前 Neovim 開啟的 Lua 模組,還有 Ex 指令 :lua print(os.getenv("HOME")) 來快速查驗這些 Lua 指令的作用。

小結

本章我們討論了 LuaRocks 的安裝,比起單純的 Homebrew 安裝相對複雜許多。歸納來講,我們所做的事情是:

  1. 手動安裝 LuaRocks ,下載 tar 包、重新編譯、安裝,讓它依賴於 LuaJIT 。
  2. 設定 Neovim 內部的路徑,使它可以讀得到 LuaRocks 安裝第三方模組的路徑。

上一篇
Fennel 語言速成 -- Lua
系列文
在 Neovim 中探索 Fennel 與函數式編程6
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言