最近抽空稍微補了一點 perlbrew 的進度,雖然並沒有太遠大的目標,不過一些方向也慢慢 成型了。

首先是關於 userelocatableinc 這個編譯參數的一些實驗。在 0.47 版中它變成了預設。原 本是打算拿來實做一些衍生的功能,不過卻發現,在 MacOSX 及 Solaris 上造成了頂令人困 擾的問題。這兩個主要平台上的 perl,在 shell 中被執行時無法決定 $0 的完整路徑,因 此會出現像這樣的錯誤訊息:

$ perl -V
Can't locate Config.pm in @INC (@INC contains:
../lib/site_perl/5.12.3/darwin-thread-multi-2level ../lib/site_perl/5.12.3
../lib/5.12.3/darwin-thread-multi-2level ../lib/5.12.3 .).
BEGIN failed--compilation aborted.

掙扎了許久沒有找到適合的解決方法,因此在 0.52 版時又取消了這個設定。取而代之的, 是增加了 PERLBREW_CONFIGURE_FLAGS 環境變數。可以減少常用編譯選項的輸入次數。

再者是增加了一些便利的指令用法,像是 infolist-modulesinstall-ack、以及 exec --with。可以方便在轉換時使用。像是以下這列指令,就可以將目前環境 perl 中所 包含的模組,一股腦兒在 5.16.1 那頭全部安裝一次。

perlbrew list-modules | perlbrew exec --with 5.16.1 cpanm

其實除了 perlbrew 之外,CPAN 上還有 perlallstaticperlbootstrap-perl 等不同的工作,各自解決稍微不同問題。而 perlbrew 所稍見長的, 大約就是能在 bash/zsh 中即時切換版本的功能吧。

考慮到現在 rakudo 也是每個月都會有更新的編譯器釋出,似乎也可以始想想怎麼整合 rakudo 了。

因此,前些時日試著將路徑切換這部份的功能抽取出來,重做成 bash script,名為 px -- Path Exchange。舉凡能夠設定安裝路徑 prefix、又 想要動態切換路徑的,多多少少都能夠用這種模式解決。因此,如果能自行將各版本的 rakudo 裝在 ~/perl6/rakudo, 就可以利用 px 隨設改變 $PATH 的值,像是:

# 初始化
px set rakudo
px add ~/perl6/rakudo-star/2012.06/bin
px add ~/perl6/rakudo-star/2012.07/bin
px add ~/perl6/rakudo-star/2012.08/bin

# 換路徑
px use 2012.08
px use 2012.05

# 停用所有 rakudo 的路徑
px deactivate rakudo

還有一項,就是對於各執行環境的支援了。perlbrew 決定「目前」版本的方式是依賴 PERLBREW_PERL 這個環境變數。除此之外還要有 PERLBREW_ROOTPERLBREW_HOME 這兩個變數,才能正確在版本間切換。如果執行環境沒有這幾項,就會不太正常。

目前尚待實做的部份有:

  • 編輯器支援(Emacs、vim、TextMate 等等)
  • crontab wrapper 支援
  • init.d/upstart wrapper 支援
  • 其他 shell 的支援

編輯器的部份會先從 Emacs 開始,實做可以切換的功能,也就是 M-x perlbrew-use 這個 函式。目前 0.53 版本中已經加入一部份變更以利進行,大致上是增加一些指令,讓 perlbrew 產生外界切換環境用的程式碼(bash / vimscript / lisp 等等),而外界只需要 eval 一下就行。這而的方式,對於能夠動態改自行環境變數編輯器應該都能支援。不夠這 方法是否真的夠好,還得多加試驗才行。

crontab/init.d/upstart wrapper 支援大概會採用產生其他執行檔的型式來做,也就是說,產生 一支 /opt/local/bin/perl,其內容基本上是

#!/bin/sh
/opt/perlbrew/perls/perl-5.14.2/bin/perl *$

如此一來就能夠在一定程度上,以重新產生 wrapper 的方式、達到切換版本的目的。

總之 perlbrew 不趕版號,鴨子划水,把這些能增加便利性的功能實做好,才是這工具應該有的目標。

commit, gugod