您好,欢迎来到悍铭数据中心!

新闻中心

pkgtools

 Pkgtools:FreeBSD的智慧型應用程式管理工具組 
● 過去的困惑 – 傳統方法的缺點 
僅管FreeBSD提供ports及packages來管理應用程式,但還是有很多問題。最常
見的問題在於應用程式的重覆安裝、相依性及升級。 
Pkgtools:FreeBSD的智慧型應用程式管理工具組 
● 過去的困惑 – 傳統方法的缺點 
僅管FreeBSD提供ports及packages來管理應用程式,但還是有很多問題。最常
見的問題在於應用程式的重覆安裝、相依性及升級。 
以我的個人電腦為例,雖然裝的應用程式不多,確發生了上述的問題。 
我先安裝lynx,以提供文字模式下的網頁瀏覽工具。 
# cd /usr/ports 
# make update 
# make index 
# cd /usr/ports/www/lynx 
# make install clean 
後來安裝X window system,並且使用mozilla瀏覽器,提供X的網頁瀏覽工具。 
# cd /usr/ports/www/mozilla 
# make install clean 
但安裝完成後,我發現兩套應用程式都需要gettext, 
# pkg_info | grep gettext 
gettext-0.11.1_1 GNU gettext package 
gettext-0.11.1_3 GNU gettext package 
雖然lynx以及mozilla皆可以正常咦鳎??傆X得安裝兩套gettext有點浪費硬碟
空間,於是決定把其中一個移除。 
先移除舊版的 gettext 
# pkg_delete gettext-0.11.1_1 
pkg_delete: package 'gettext-0.11.1_1' is required by these other packages 
and may not be deinstalled: 
lynx-2.8.5d7_1 
發現和 lynx 有相依性存在,若要移除舊版的 gettext,必須先移除 lynx。 
文字方塊: v 1.2
移除新版的試試看 
# pkg_delete gettext-0.11.1_3 
pkg_delete: package 'gettext-0.11.1_3' is required by these other packages 
and may not be deinstalled: 
ORBit-0.5.15_1 
gmake-3.79.1_1 
gtk-1.2.10_4 
mozilla-1.0.rc3,1 
windowmaker-0.80.0_1 
zh-xcin-2.5.3.p2_1 
zh-xmms-1.2.7_1 
vim-6.1.48 
mod_php4-4.2.1_1 
AbiWord-1.0.1 
zh-zhcon-0.2_4 
真是糟糕,無論舊版或是新版都有相依性存在。看來目前只好先暫時打消念頭。 
三天後,我檢查是否有可以升級的應用程式。 
先更新ports tree 
# cd /usr/ports 
# make update 
# make index 
root@polo [/usr/ports] # pkg_version -L = 
gettext  in /usr/ports ... - 5997 port entries 
found .........1000.........2000.........3000.........4000.........5000.............. done] 
然後開始進要初始設定和做一些ports的清理動作。 
# pkgdb –F 
[Updating the pkgdb  in /var/db/pkg ... - 94 packages found 
(-2 +0) (...) done] 
Checking the origin of AbiWord-1.0.1 
Checking the origin of Hermes-1.3.2 
Checking the origin of ORBit-0.5.15_1 
…[略] 
Duplicated origin: converters/libiconv - libiconv-1.7_3 libiconv-1.7_5 
Unregister any of them? [no] 
Unregister libiconv-1.7_3 keeping the installed files intact? [no] 
-> libiconv-1.7_5 is kept. 
--> Saving the libiconv-1.7_3's +CONTENTS file as 
/var/db/pkg/libiconv-1.7_5/+CONTENTS.libiconv-1.7_3 
--> Unregistering libiconv-1.7_3 
--> Done. 
[Updating the pkgdb  in /var/db/pkg ... - 93 packages found (-1
+0) (...) done] 
Stale dependency: AbiWord-1.0.1 -> png-1.2.2_4: 
png-1.2.3 (score:83%) ? ([y]es/[n]o/[a]ll) [yes] 
在這一步驟中,portdb發現了失效的相依性關係。原本在資料庫中的 AbiWord
是相依於 png-1.2.2_4,但後來因為之前強制移除舊版的png,並且更新png為 
png-1.2.3,這些動作皆可以由portdb從packages的資料庫中偵測出來,並且還
提供建議性的相容性程度 83%。 
相依性的問題是我所預期的,而且希望能夠將任何和舊版png有相依性的,全部
更正為和新版的png相依。所以我選擇 a [all]。 
○ 利用pkgtools升級應用程式 
更新完ports tree後,我想和packages資料庫比對一下,是否有可以升級的應用
程式。 
FreeBSD的傳統方法是使用pkg_version 
# pkg_version -L = 
而pkgtools提供的新方法,使用資料庫比對的方式,效率更高。 
# portversion –L = 
libiconv =png' 
.. 只取回所有需要升級應用程式的distfiles 
# portupgrade –aFR 
.. 升級glib,並且以使用packages升級為優先,ports為次之 
# portupgrade -P glib 
.. 只使用packages,完全不考慮ports來升級所有應用程式,而且僅列出結果,
並沒有真正執行 
# env PKG_PATH=/mnt/cdrom/packages/All portupgrade –anPP 
.. 以相依性排序,升級所有套件。 
# portupgrade -scC '*' 
○ pkgtools.conf 
如果使用ports安裝portupgrade,/usr/local/etc下可找到pkgtools.conf.sample,這
是設定pkgtools的設定樣本檔,可以依照自己的需求建立一份。 
# cd /usr/loca/etc 
# cp pkgtools.conf.sampl pkgtools.conf 
例如:以元智server為舉例 
ENV['PORTSDIR'] ||= '/usr/ports' 
ENV['PACKAGEROOT'] = 'ftp://freebsd.csie.nctu.edu.tw' 
SANITY_CHECK = true 
IGNORE_CATEGORIES = [ 
'french', 
'german', 
'hebrew', 
'japanese', 
'korean', 
'russian', 
'ukrainian', 
'vietnamese', 
'games', 
'palm', 
'print', 
'x11*', 

EXTRA_CATEGORIES = [ 
'outta-port', 

HOLD_PKGS = [ 
'bsdpan-*', 

MAKE_ARGS = { 
'editors/vim' => '-DLITE CONF_OPT_MULTIBYTE=--enable-multibyte' 

BEFOREBUILD = { 

AFTERINSTALL = { 
# Re-enable the X wrapper 
'x11-servers/XFree86-4-Server' => sprintf( 
'cd %s/bin && if [ -x Xwrapper-4 ]; then ln -sf Xwrapper-4 X; fi', 
x11base()), 

PKG_SITES = [ 
sprintf('ftp://freebsd.csie.nctu.edu.tw/pub/FreeBSD/ports/i386/packages-stable/'), 

PORTUPGRADE_ARGS = ENV['PORTUPGRADE'] 
○ 使用pkgtools自動化升級應用程式 
如果於pkgtools.conf中有設定在執行portupgrade之前,先更新ports tree,則以
有權限安裝應用程式的使用者,編寫crontab: 
0 6 * * 1 /usr/loca/sbin/portsdb –Uu && /usr/local/sbin/portupgrade –a 
若沒有於pkgtools.conf中有設定在執行portupgrade之前,先更新ports tree,則
以有權限安裝應用程式的使用者,編寫crontab: 
0 6 * * 1 /usr/local/bin/cvsup –g –L 2 /usr/share/examples/cvsup/ports-supfile && 
/usr/local/sbin/portsdb –Uu && /usr/local/sbin/portupgrade –a

 


香港云主机