Julia 1.0 套件管理 (一): Environment

Dboy Liao
7 min readApr 6, 2019

--

看到 julia 1.0 問世時,最開心的就是套件管理系統的改進。剛好趁清明連假,待在咖啡廳幾個下午把玩了一番,這篇就稍稍紀錄一下目前 julia 套件管理的一些小心得,順便嘗試了與 vscode 目前整合的狀況。

詳細的內容我建議還是看過一次官方文件,另外 JuliaConf 2018 由 julia 核心開發者 Karpinski 與 Carlsson 對於 Pkg(3) 的介紹影片也很推薦。

Environment

這邊我跟官方文件的編排順序不同,先來介紹我覺得這次改版中最重要的部分: Environment

在新的套件管理系統裡,導入了 Environment 這個概念。我個人最熟悉的語言是 Python,所以以 Python 開發者來說,最相近的工具就是 virtualenv ,在 Pkg(3) 裡你可以在不同的“環境”下切換來進行開發,就如同在 Python 裡你藉由 activate 不同的 virtual environment 去隔離不同的開發環境。

具體來說,在 julia v1.0 裡大概是這樣操作的:

  1. mkdir <env_dir>:建造一個做為 Pkg(3) 維護套件相關檔案的資料夾。
  2. 進入 julia REPL:一般來說就是在 terminal 裡執行 julia ,但這視乎你是如何安裝 julia 的。
  3. julia REPL 裡輸入 ] 進入 pkg 模式。
  4. 執行 activate <env_dir> 來啟用 environment 。

這個是在我的 Mac 上執行的狀況:

啟用之後又怎樣呢?啟用之後會影響到 usingimport 解析套件的路徑,也就是說若你在 env1 裡裝了 CSV 這個套件,但卻沒有在 env2 裡安裝 CSV 套件,當你切換到 env2 時如果 import CSV 就會有 import error 。

套件管理

到這個階段,你就可以在不同的環境下管理套件的相依性問題 (package dependencies)。具體來說就是加入 (Add)、移除 (Remove)、開發 (Dev) 與升級 (Update/Upgrade)。

以下操作都是預設已經啟用一個環境並進入 pkg 模式後執行。

加入套件 (Add)

譬如說,如果要在 MyEnv1 中加入 CSVDataFrames 這兩個套件的話,只需要在 pkg模式中使用 add 指令即可:

這時如果我們用 status 指令就能知道目前 MyEnv1 中到底安裝了什麼:

移除套件 (Remove)

相反的,如果要移除一個套件,可以使用 rm 這個指令:

需要注意的是,官方文件中有提及,在移除一個套件的同時也會移除所有需要這個套件的其它套件。

開發模式 (Dev)

在開發套件時,有時會發生一種狀況:出 bug 的 code 是別人寫的啊!這時你就希望快速修好 bug 之後繼續自己的開發,也就是說你修改了別人的 code 之後,你希望這個修改會馬上反映在你的程式裡。

在 Python 裡的話,這個叫做 develop mode ,基本上就是執行 python setup.py develop 這個指令,但今天重點是 julia ,有關 Python 的套件開發就先不提了。

pkg 模式裡,只需要使用 dev 這個指令即可:

--local 只是說讓 CSV 安裝在現在的環境資料夾裡而已。

這時你會發現環境資料夾中出現了一個 dev 資料夾:

這時無論你在 dev/CSV 裡修改了什麼,只要 import CSV 之後就會直接生效。在這裡我隨便加個 sayhello 看看吧:

執行看看:

看到沒?我新寫的 sayhello 就變成 CSV 套件下的一個函數了。

更新升級 (Update/Upgrade)

要升級套件,也是非常簡單,只需要執行 up 即可:

與編輯器的整合

老實說,還不是太好 XD

VSCode

我自己是很喜歡用 VSCode 寫東西。大致上來說用 VSCode 寫 julia 還算愜意,可以很簡單的做 code navigation ,像是直接跳到函數、型別之類定義的原始檔等等都很容易,但僅限全域環境。

也就是說,如果你是像上面教學的那樣創建一個獨立的環境再安裝套件,雖然說你可以用 Cmd+Shift+P 並搜尋 Julia: Change Current Environment

雖說可以把環境切換到你創建的環境資料夾下,但是頂多就是游標滑到相關物件時會跳出一個協助視窗顯示文件之類的內容,但如果不是安裝在全域環境的套件,跳到定義原始碼之類的功能就還沒有作用。

詳情的話,可以看這個 GitHub issue

Juno

號稱是官方支援的編輯器,但是跟 VSCode 還是有一樣的問題啊啊!(崩潰) 至於其他花俏的功能我其實都還不是很喜歡呢 ( = wwww = )。

所以目前來說,我知道可以寫 julia 的編輯器都還沒有對新的套件管理系統有很好的支援。現在我也就是先用一些方法代替這些跳到定義之類的跳到定義之類的功能。

其中我發現還不錯用的是 less@less

譬如說 @less DataFrames.DataFrame() 就會看到:

雖然說這樣可以很快找到原始碼在哪裡,但還是不是很方便啊…

希望別人趕快修好這個功能 (不是應該自己寫嗎 = =)

結語

今天就先簡單介紹一下在 Pkg(3) 裡引入的新概念 Environment 。其實在其他語言裡很早就有類似的功能了,而且試了一些編輯器之後發現,好像都還沒有跟新的套件管理系統整合得很好。

雖說有些 workaround 可以用,但還是不是很方便,尤其是在追開源套件程式碼時。但新語言嘛,一切還是在進化當中,也確實變得越來越好了,至少比我當初在 v0.3 時比起來好太多了 XDDD

下面我列了我在寫這篇時參考覺得很不錯的資源,有興趣的人建議是全部看過一遍。其中最重要的當然就是官方文件啦!

下次有機會再介紹 julia 套件開發的流程吧。Happy Julia Programming !

References

--

--

Dboy Liao
Dboy Liao

Written by Dboy Liao

Code Writer, Math Enthusiast and Data Scientist, yet.

No responses yet