perlbrew 近況更新
作者:gugod 發佈於:最近抽空稍微補了一點 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
環境變數。可以減少常用編譯選項的輸入次數。
再者是增加了一些便利的指令用法,像是 info
、list-modules
、install-ack
、以及
exec --with
。可以方便在轉換時使用。像是以下這列指令,就可以將目前環境 perl 中所
包含的模組,一股腦兒在 5.16.1 那頭全部安裝一次。
perlbrew list-modules | perlbrew exec --with 5.16.1 cpanm
其實除了 perlbrew 之外,CPAN 上還有 perlall 、staticperl 、bootstrap-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_ROOT
及 PERLBREW_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