http://community.itbbs.cn/showthread.php?t=15294 不知道冰力哪找来的,值得收藏,要是BSD下有个eix,portage-utils,gentoolkit, genlop啊之些玩意就爽了
注意注意

* always pkgdb -F before upgrade
* always backup /var/db/pkg (好吧,我承认我每次都没做)

选项

pkgname_glob pkg_glob(1)

-a 全部安装的 packages

-A 每次 install 後要跑的指令

-b 把旧的 package 备份到 PKG_TMPDIR or TMPDIR (default /var/tmp)

-B build 前要跑的指令 (如果 fail 的话,那这个 port/package 会被略过)

要更新 gnome* 前先 cvs update
portupgrade -B 'cvs update' 'gnome*'

不知道
portupgrade -B 'ports_glob -M $(pwd) | (cd
../..; xargs cvs up)' slave/port

通通都更新,除了 interactive 的 ports
portupgrade -aB 'test ! `make -V IS_INTERACTIVE`'

-c 在 build 之前 clean (default)

-C 在 install 之後 clean (default)

-D 在 fetch/build 之前 distclean

-f 强迫更新一个要被 downgrade 或相同版本或在 pkgtools.conf 标记为 HOLD_PKGS
的 package

-F 只会把 distfiles 抓下来(如果加 -P 则是抓 packages)

-g 强迫更新 require 的 package 更新失败的 package

-i interactive 就是会问你要不要的 (implies -v)

-I 把结果丢到 FILE 去

-L 把每一个 port build & install 结果丢到 PREFIX 去
存成 <PREFIX><category>::<portname>

-m 要 append 给 make(1) 的参数

-M 要 prepend 给 make(1) 的参数

-n 看看会干些什麽事情 (implies -v, negates -i, -y)

-N 安装新的 port/package 而且会先更新所有 require 的 packages
可以指定 portorigin glob

-o 指定 ORIGIN

-O 别做完整的 denendency check(如果跑之前有 pkgdb -F 那可以放心的用)

-p 在 install/upgrade 後生出 package,如果有指定到 dependent package
的话(like -r),那些也会生 package

-P 用 package,会去扫 PKG_PATH,找不到就 pkg_fetch 再不然就用 ports

-PP 坚持只用 package,不用 ports

-q 不要读 $PREFIX/etc/pkgtools.conf

-r 把 depends on given ports 的 packages 也一起更新
比如说 -r png-* 的话,会把需要 png 的 packages 一起更新

-R 把 given ports 需要的 packages 也一起更新
比如说 -R kde3 的话,会把其他 kde3-* 的一起更新

-s 在需要 root 权限的时候执行 sudo

-S 取代 sudo(8) 的指令,例如 su root -c %s ''

-u 不要保留旧的 shared libraries

-v verbose output

-w 不要在 build 之前 clean

-W 不要在 install 之後 clean

-x 排除 match GLOB 的 packages
例如 portupgrade -rx XFree86 XFree86 会更新所有 depends on XFree86 的
packages,却不更新 XFree86 本身

-y 所有问题通通回答 yes (implies -v, negates -n)

portuprade 流程

1. 没给 -P 的话,跳到 4。否则 search PKG_PATH 看看有没有新的 packages,
有找到的话,跳到 5。

2. 用 pkg_fetch(1) 去抓新的 packages 下来,如果是最新的话跳到 5。
如果给 -PP 但抓下来的 packages 比安装的新(不一定是最新)的话,
也跳到 5。

3. 如果给 -PP 的话,停止作业。

4. build given package 相对应的 port。

5. 修 depends on given package 那些 packages 的 dependency。

6. save given package 的 +REQUIRED_BY。

7. 把 given package 用 pkg_create(1) 备份下来。

8. 把 given package 的 registration 档案备份下来。

9. 强迫 uninstall given package,并保留 share libraries,
除非有指定 -u。

10. 安装新的 port or package(看是 cond. 1 or 2 or 3)。

11. 如果安装失败,
11.1. 把 7. 备份的档案还原。
11.2. 把 8. 备份的 registration 档案还原。
11.3. 把 5. 修过的 dependency 还原。

12. 把 obsoleted 的 dependencies 移除。

13. 把 6. 备份的 +REQUIRED_BY 复原。.

14. 执行 portsclean -L 把重复的 share libraries 砍掉,
并且保留旧的 share libraries,详情请见 portsclean(1)。

一些例子

o. portupgrade glib
更新 glib

o. portupgrade XFree86 -m '-DWANT_GGI' Mesa
传 -DWANT_CGI 给 Mesa。
当 portupgrade 用在很多 packages 上面时,他会依照 dependency order 处理。

o. portupgrade -L /var/tmp/log. '*gnome*'
更新所有 GNOME packages,并 log 在 /var/tmp/log.<category>::<portname>

o. portupgrade -Rpv sawfish
更新 sawfish 和所有 sawfish 需要的 packages

o. portupgrade -ri glib
更新 glib 和所有需要 glib 的 packages

o. portupgrade -rfx sdl sdl
更新/重安装所有需要 sdl 的 packages 但不包含 sdl

o. portupgrade -f '<2001-09-20'
更新/重安装所有在 2001/09/20 前安装的 packages

o. portupgrade -fr png -x '>=png'
更新/重安装所有在 png 前安装且需要 png 的 packages

o. portupgrade -aFR
去 fetch 更新所有 packages 需要用的 distfiles

o. portupgrade -o print/ghost-afpl ghost-gnu
用 print/ghost-afpl 换掉 ghost-gnu

o. portupgrade -P glib
用 package 更新 glib

o. env PKG_PATH=/mnt/cdrom/packages/All portupgrade -anPP
用 CDROM 里面的 packages 来进行大量更新
如果不想让 portupgrade 去 fetch 不在 CDROM 的 packages 的话,
把 PKG_FETCH 设定为 /bin/false

小技巧

o. 在进行 binary uprage 後,请用 pkgdb -F 修一下 dependencies。

o. 透过网路进行大量更新 portupgrade -aPPR。

o. 如果怀疑 portupgrade 倒底会干哪些事情的时候,请用 -n 和 -i,
也可以用 pkg_glob(1) 来看 glob patterns 到底会展开成什麽。

o. 为了让更新更正确、更有效率,请爱有事没事跑一跑 pkgdb -F,
每次 CVSup 更新完 ports tree 之後,portsdb -Uu,以确保 INDEX 跟 ports
tree 同步。

o. 可以用 portversion(1) 取代 pkg_version(1) 来检查可以 upgrade 的
packages。portversion(1) 用法跟他一样,而且比较快。
portversion -c 可以输出给 portupgrade(1) 更新用的 。

o. 可以用 pkg_deinstall(1) 取代 pkg_delete(1) 来移除 packages。
这其实是 pkg_delete(1) 的 wrapper,不过有些更好的特性,
比如说 recursive deinstall 或者保留 shared library。

o. 可以用 portsclean(1) 清理不需要的 distfiles、working、
旧的 shared libraries。

o. 可以用 portcvsweb(1) 来看看一个 port 的 change。

环境变数

这边列出来 default 的值,不多做解释。

PKG_DBDIR           /var/db/pkg
PORTSDIR            /usr/ports
PORTS_INDEX         $PORTSDIR/INDEX
PORTS_DBDIR         $PORTSDIR
PKG_TMPDIR
TMPDIR              /var/tmp
PACKAGES            $PORTSDIR/packages
PKG_PATH            $PACKAGES/All
PKG_SUFX            定义在 bsd.port.mk 或 /etc/make.conf
PKGTOOLS_CONF       $PREFIX/etc/pkgtools.conf
PORTUPGRADE         预设 portupgrade 的选项

SEE ALSO
pkg_add(1), pkg_deinstall(1), pkg_delete(1), pkg_glob(1), pkg_info(1),
pkg_sort(1), pkg_update(1), pkgdb(1), portcvsweb(1), ports_glob(1),
portsclean(1), portsdb(1), portversion(1), pkgtools.conf(5), ports(7)

BUGS

SUSP (^Z) 在 build/install 过程中没有用。

有时候 database 会烂掉导致 pkgtools segmentation fault,这样子的话,
用 pkgdb -fu 重新 build database 问题就可以解决。




                       portupgrade命令参数                                                                                                                                                                                             网友:剑心通明 发布于: 2008.03.19 18:11 (共有条评论)  查看评论 | 我要评论                                                         ◎名稱
           portupgrade - 提供經由port或是packages來升級/安裝新的軟體
           ◎安裝
           路徑:/usr/ports/sysutils/portupgrade#make install
           /usr/ports/sysutils/portupgrade#make clean
           ◎語法
           portupgrade [-habcCDfFginNOpPPqrRsuvwWy] [-A command] [-B command]
           [-l file] [-L prefix] [-S command] [-x pkgname_glob]
           [[-o origin] [-m make_args] [-M make_env] pkgname_glob ...]
           ◎描述
           portupgrade被用來作為經由port或packages升級/安裝的工具。
           而portinstall相當於portupgrade -N。
           ◎警告
           o 請詳讀使用者手冊並且了解你在做什麼。
           o 請不要忘掉在升級前執行pkgdb -F。
           o 請記得portupgrade不會自己尋找程式的相關性,
           必要時別忘了使用 -f,-r 或-R 參數。
           o 當portupgrade在執行中,請勿中斷之。否則您將會有一個不完全的資料庫。
           (雖然即使這樣做是100%的安全)
           o 請不要懶惰,務必備份先前的資料及設定檔案包含/var/db/pkg。
           ◎參數
           pkgname_glob 定義一個pkgname,可以包含萬用符號。
           詳情請參考 pkg_glob(1)。
           -h (--help)
           顯示求助選單。
           -a (--all)
           表示所有已經安裝的軟體。
           相當於pkgname_glob中的 '*' 。
           -A CMD (--afterinstall CMD)
           在每一個安裝完成後,以root身分執行某一命令。
           -b (--backup-packages)
           保留舊有版本的備份。
           這些資料會暫時存放在PKG_TMPDIR 及 TMPDIR所定義的位置。
           -B CMD (--beforebuild CMD)
           與-A CMD 相反,在安裝每一個程式前,先執行該命令。
           若該命令執行失敗,則安裝會停止。
           -c (--clean)
           在每一次安裝前,先執行make clean。(預設值)
           -C (--cleanup)
           在每一次安裝後執行make clean。(預設值)
           -D (--distclean)
           在每次fetch或是build之前執行 make distclean。
           -f (--force)
           強制執行,即使是降級或是同一版本也強制安裝。
           -F (--fetch-only)
           只取得檔案或是packages但不做升級動作。
           這個參數對於一次取得多數檔案很有用。
           -g (--go-on)
           繼續執行動作,即使某些相關的packages升級失敗。
           預設的狀態中,若某package或是port升級失敗,其相關連性會被skipped。
           -i (--interactive)
           打開互動模式,portupgrade在進行重要步驟前會徵得您的同意?
           -l FILE (--log-results FILE)
           將更新升級結果以FILE為檔名儲存?
           -L PREFIX (--log-prefix PREFIX)
           將每一個port的建立、安裝記錄存為一個檔案,
           而PREFIX則是存放的位置?
           -m (--make-args)
           在每次make前加上額外的參數(arguments)
           -M (--make-env)
           在每次make後加上額外的參數(arguments)?
           -n (--noexecute)
           不實際執行安裝或升級動作?
           只是顯示會有何改變?
           -N (--new)
           當指定的package是尚未安裝的情況下,安裝該程式?
           且其所需求的關連程式也會一併被安裝升級?
           -o ORIGIN (--origin ORIGIN)
           定義某port再某package之後升級?
           -O (--omit-check)
           忽略依存性的檢查?
           預設的狀況下,會自動檢查程式間的依存性,
           當然地,這個動作會花去額外的時間?
           但,若您先前已經執行過pkgdb -F 命令,
           您可以採用此參數忽略之?
           -p (--package)
           為該安裝/升級的port,建立package?
           -P (--use-packages)
           再採用port方式升級前,先採用packages的方式?
           -PP (--use-packages-only)
           不管任何情況,只採用packages方式升級?
           -q (--no-config)
           使portupgrade不去讀取設定檔$PREFIX/etc/pkgtools.conf?
           -r (--recursive)
           依據指定的程式(packages)來升級與其相依存的程式?
           -R (--upward-recursive)
           依據指定的程式(packages)來升級其所依存的程式?
           -s (--sudo)
           在必要的情況下,以sudo狀態執行命令?
           -S CMD (--sudo-command CMD)
           加上sudo的命令
           -u (--uninstall-shlibs)
           不保留舊有的共享函式庫?
           在預設的情況下是保留以策安全?
           -v (--verbose)
           開啟 verbose 輸出?
           -w (--noclean)
           在每一次編譯前,不要執行make clean?
           -W (--nocleanup)
           在每一次的編譯後不要執行make clean?
           -x GLOB (--exclude GLOB)
           將符合樣式的packages排除在昇級更新之外?
           ex:昇級所有與XFree86相依存的程式,除了XFree86之外?
           portupgrade -rx XFree86 XFree86
           -y (--yes)
           任何回答都回應yes?
           ◎環境變數
           PKG_DBDIR 指定安裝packages資料庫的變數。
           預設是/var/db/pkg。
           PORTSDIR 指定ports tree位置的變數。
           預設是/usr/ports。
           PORTS_INDEX 指定ports INDEX 位置的變數。
           預設是$PORTSDIR/INDEX。
           PORTS_DBDIR 指定ports資料庫檔案位置的變數。
           預設是$PORTSDIR。
           PKG_TMPDIR 指定portupgrade在備份檔案暫存資料夾的變數。
           若沒有特別指定,則使用/var/tmp。
           注意:此資料夾需要有足夠的空間。
           PACKAGES 指定portupgrade建立packages位置的變數。
           預設是$PORTSDIR/packages。
           PKG_PATH 指定portupgrade搜尋packages位置的變數。
           預設是$PACKAGES/All 。
           PKGTOOLS_CONF 指定pkgtools 設定檔位置的變數。
           預設是$PREFIX/etc/pkgtools.conf 。
           PORTUPGRADE 指定portupgrade預設執行參數的變數。
           ◎檔案
           /var/tmp 預設的暫存檔位置。
           /var/db/pkg 預設的程式資料庫的安裝位置。
           /usr/ports 預設的ports tree及ports的資料庫檔案位置。
           $PREFIX/etc/pkgtools.conf 預設的pkgtool的設定黨位置。
           ◎作者
           Akinori MUSHA
           ◎程式的BUGS
           在安裝或更新的過程之中 SUSP (^Z) 無法產生效用。
           ◎參考資料
           portupgrade
           ◎實際舉例
           o 升級glib:
           portupgrade glib
           如同你看到的,你可以忽略版本號碼。
           若有安裝許多版本,則每一個版本都會被更新unless they share a port origin.
           o 升級XFree86及Mesa,並採用-DWANT_GGI來編譯make Mesa:
           portupgrade XFree86 -m '-DWANT_GGI' Mesa
           o 升級所有GNOME的packages,並建立記錄檔案在/var/tmp/log.portname
           portupgrade -L /var/tmp/log. '*gnome*'
           o 採用verbose模式升級sawfish(X-window程式)及其相關連的程式,
           並為之建立binary packages。
           portupgrade -Rpv sawfish
           o 升級glib及所有與其相關連的程式:
           portupgrade -ri glib
           o 重新建立或重新安裝所有與sdl相關連的程式,但不包含sdl本身:
           portupgrade -rfx sdl sdl
           o 重新建立或重新安裝所有早於2001-09-20安裝的程式:
           portupgrade -f '=png'
           o 一次取得所有升級相關檔案,但是不做升級:
           portupgrade -aFR
           加上-R是必須的,因為有些程式會有相關連的問題。
           o 採用ghostscript-afpl取代ghostscript-gnu:
           portupgrade -o print/ghostscript-afpl ghostscript-gnu
           所有原先與ghostscript-gnu相關連的程式,將會採用ghostscript-afpl取代之。
           o 採用package的方式升級glib:
           portupgrade -P glib
           所謂採用packages的方式乃是說先找尋packages的方式升級。
           o 用光碟片中的packages升級大量的程式,但在這之前,
           想要先察看會有何改變:
           env PKG_PATH=/mnt/cdrom/packages/All portupgrade -anPP
           若您不想要安裝光碟片之外的任何packages,
           您可以將 PKG_FETCH 設成其他的東西,像是``/bin/false''.
           ◎操作技巧
           o 在升級過後,強烈建議執行 pkgdb -F 來修復程式間的關連性。
           o 若要大量升級程式:
           portupgrade -aPPR
           o 在升級前,當您產生疑惑,請使用-n 及 -i 參數來觀察前後的改變,
           或者使用pkg_glob 來觀看會產生作用的程式。
           o 為了要有效率且正確的升級,記得執行pkgdb -F 來修補程式間的關連性,
           並且當每次採用CVSup更新完port tree後,執行portsdb -Uu 來及時更新您的
           port INDEX資料庫。
           o 可以用portversion來確定可以獲得升級的程式而非先使用pkg_version。
           portversion的用法和pkg_version大同小異,但portversion執行較快。
           o 若要解除安裝packages,請給予pkg_deinstall一個機會,
           而非直接使用 pkg_delete。
           pkg_deinstall有pkg_delete的功效,
           但加上了正確的反安裝及共享(程式庫)library的保留。
           o 要清理擾人的檔案及編譯工作暫存資料夾或是老舊的共享程式庫
           ,可以使用portsclean。
           o 可以使用portcvsweb 來察看某一個port的歷史演進及改變。
           panda note:須裝設w3m lynx links mozilla netscape其中之一的瀏覽器
           ,或自訂也可。


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/4206/showart_4×××2.html