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 (共有条评论) 查看评论 | 我要评论 ◎名�Q
portupgrade - 提供�由port或是packages�砩��/安�b新的��w
◎安�b
路��:/usr/ports/sysutils/portupgrade#make install
/usr/ports/sysutils/portupgrade#make clean
◎�Z法
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升�/安�b的工具。
而portinstall相��於portupgrade -N。
◎警告
o ���x使用者手��K且了解你在做什�N。
o �不要忘掉在升�前�绦�pkgdb -F。
o ��得portupgrade不��自己�ふ页淌降南嚓P性,
必要�r�e忘了使用 -f,-r 或-R ��怠�
o ��portupgrade在�绦兄校��勿中�嘀�。否�t您���有一��不完全的�Y料�臁�
(�m然即使�@�幼鍪�100%的安全)
o �不要�卸瑁��毡�浞菹惹暗馁Y料及�O定�n案包含/var/db/pkg。
◎���
pkgname_glob 定�x一��pkgname,可以包含�f用符�。
�情��⒖� pkg_glob(1)。
-h (--help)
�@示求助�x�巍�
-a (--all)
表示所有已�安�b的��w。
相��於pkgname_glob中的 '*' 。
-A CMD (--afterinstall CMD)
在每一��安�b完成後,以root身分�绦心骋幻�令。
-b (--backup-packages)
保留�f有版本的�浞荨�
�@些�Y料����r存放在PKG_TMPDIR 及 TMPDIR所定�x的位置。
-B CMD (--beforebuild CMD)
�c-A CMD 相反,在安�b每一��程式前,先�绦性�命令。
若�命令�绦惺�。��t安�b��停止。
-c (--clean)
在每一次安�b前,先�绦�make clean。(�A�O值)
-C (--cleanup)
在每一次安�b後�绦�make clean。(�A�O值)
-D (--distclean)
在每次fetch或是build之前�绦� make distclean。
-f (--force)
��制�绦校�即使是降�或是同一版本也��制安�b。
-F (--fetch-only)
只取得�n案或是packages但不做升��幼鳌�
�@������於一次取得多��n案很有用。
-g (--go-on)
�^�m�绦�幼鳎�即使某些相�P的packages升�失� �
�A�O的��B中,若某package或是port升�失�。�其相�P�B性��被skipped。
-i (--interactive)
打�_互�幽J剑�portupgrade在�M行重要步�E前��徵得您的同意?
-l FILE (--log-results FILE)
�⒏�新升��Y果以FILE��n名�Υ�?
-L PREFIX (--log-prefix PREFIX)
�⒚恳��port的建立、安�b��存�橐���n案,
而PREFIX�t是存放的位置?
-m (--make-args)
在每次make前加上�~外的���(arguments)
-M (--make-env)
在每次make後加上�~外的���(arguments)?
-n (--noexecute)
不���H�绦邪惭b或升��幼�?
只是�@示��有何改�?
-N (--new)
��指定的package是尚未安�b的情�r下,安�b�程式?
且其所需求的�P�B程式也��一�惚话惭b升�?
-o ORIGIN (--origin ORIGIN)
定�x某port再某package之後升�?
-O (--omit-check)
忽略依存性的�z查?
�A�O的��r下,��自��z查程式�g的依存性,
��然地,�@���幼��花去�~外的�r�g?
但,若您先前已��绦羞^pkgdb -F 命令,
您可以�裼么��岛雎灾�?
-p (--package)
�樵�安�b/升�的port,建立package?
-P (--use-packages)
再�裼�port方式升�前,先�裼�packages的方式?
-PP (--use-packages-only)
不管任何情�r,只�裼�packages方式升�?
-q (--no-config)
使portupgrade不去�x取�O定�n$PREFIX/etc/pkgtools.conf?
-r (--recursive)
依��指定的程式(packages)�砩���c其相依存的程式?
-R (--upward-recursive)
依��指定的程式(packages)�砩��其所依存的程式?
-s (--sudo)
在必要的情�r下,以sudo��B�绦忻�令?
-S CMD (--sudo-command CMD)
加上sudo的命令
-u (--uninstall-shlibs)
不保留�f有的共享函式��?
在�A�O的情�r下是保留以策安全?
-v (--verbose)
�_�� verbose �出?
-w (--noclean)
在每一次��g前,不要�绦�make clean?
-W (--nocleanup)
在每一次的��g後不要�绦�make clean?
-x GLOB (--exclude GLOB)
�⒎�合�邮降�packages排除在�N�更新之外?
ex:�N�所有�cXFree86相依存的程式,除了XFree86之外?
portupgrade -rx XFree86 XFree86
-y (--yes)
任何回答都回��yes?
◎�h境���
PKG_DBDIR 指定安�bpackages�Y料�斓淖��怠�
�A�O是/var/db/pkg。
PORTSDIR 指定ports tree位置的��怠�
�A�O是/usr/ports。
PORTS_INDEX 指定ports INDEX 位置的��怠�
�A�O是$PORTSDIR/INDEX。
PORTS_DBDIR 指定ports�Y料��n案位置的��怠�
�A�O是$PORTSDIR。
PKG_TMPDIR 指定portupgrade在�浞�n案�捍尜Y料�A的��怠�
若�]有特�e指定,�t使用/var/tmp。
注意:此�Y料�A需要有足�虻目臻g。
PACKAGES 指定portupgrade建立packages位置的��怠�
�A�O是$PORTSDIR/packages。
PKG_PATH 指定portupgrade搜��packages位置的��怠�
�A�O是$PACKAGES/All 。
PKGTOOLS_CONF 指定pkgtools �O定�n位置的��怠�
�A�O是$PREFIX/etc/pkgtools.conf 。
PORTUPGRADE 指定portupgrade�A�O�绦��档淖��怠�
◎�n案
/var/tmp �A�O的�捍�n位置。
/var/db/pkg �A�O的程式�Y料�斓陌惭b位置。
/usr/ports �A�O的ports tree及ports的�Y料��n案位置。
$PREFIX/etc/pkgtools.conf �A�O的pkgtool的�O定�h位置。
◎作者
Akinori MUSHA
◎程式的BUGS
在安�b或更新的�^程之中 SUSP (^Z) �o法�a生效用。
◎�⒖假Y料
portupgrade
◎���H�e例
o 升�glib:
portupgrade glib
如同你看到的,你可以忽略版本��a。
若有安�b�S多版本,�t每一��版本都��被更新unless they share a port origin.
o 升�XFree86及Mesa,�K�裼�-DWANT_GGI�砭��gmake Mesa:
portupgrade XFree86 -m '-DWANT_GGI' Mesa
o 升�所有GNOME的packages,�K建立���n案在/var/tmp/log.portname
portupgrade -L /var/tmp/log. '*gnome*'
o �裼�verbose模式升�sawfish(X-window程式)及其相�P�B的程式,
�K�橹�建立binary packages。
portupgrade -Rpv sawfish
o 升�glib及所有�c其相�P�B的程式:
portupgrade -ri glib
o 重新建立或重新安�b所有�csdl相�P�B的程式,但不包含sdl本身:
portupgrade -rfx sdl sdl
o 重新建立或重新安�b所有早於2001-09-20安�b的程式:
portupgrade -f '=png'
o 一次取得所有升�相�P�n案,但是不做升�:
portupgrade -aFR
加上-R是必�的,因�橛行┏淌��有相�P�B的���}。
o �裼�ghostscript-afpl取代ghostscript-gnu:
portupgrade -o print/ghostscript-afpl ghostscript-gnu
所有原先�cghostscript-gnu相�P�B的程式,����裼�ghostscript-afpl取代之。
o �裼�package的方式升�glib:
portupgrade -P glib
所�^�裼�packages的方式乃是�f先找��packages的方式升�。
o 用光碟片中的packages升�大量的程式,但在�@之前,
想要先察看��有何改�:
env PKG_PATH=/mnt/cdrom/packages/All portupgrade -anPP
若您不想要安�b光碟片之外的任何packages,
您可以�� PKG_FETCH �O成其他的�|西,像是``/bin/false''.
◎操作技巧
o 在升��^後,��烈建�h�绦� pkgdb -F �硇�统淌介g的�P�B性。
o 若要大量升�程式:
portupgrade -aPPR
o 在升�前,��您�a生疑惑,�使用-n 及 -i ���碛^察前後的改�,
或者使用pkg_glob �碛^看���a生作用的程式。
o �榱艘�有效率且正�_的升�,�得�绦�pkgdb -F �硇扪a程式�g的�P�B性,
�K且��每次�裼�CVSup更新完port tree後,�绦�portsdb -Uu �砑�r更新您的
port INDEX�Y料�臁�
o 可以用portversion�泶_定可以�@得升�的程式而非先使用pkg_version。
portversion的用法和pkg_version大同小��,但portversion�绦休^快。
o 若要解除安�bpackages,��o予pkg_deinstall一���C��,
而非直接使用 pkg_delete。
pkg_deinstall有pkg_delete的功效,
但加上了正�_的反安�b及共享(程式��)library的保留。
o 要清理�_人的�n案及��g工作�捍尜Y料�A或是老�f的共享程式��
,可以使用portsclean。
o 可以使用portcvsweb �聿炜茨骋��port的�v史演�M及改�。
panda note:��b�Ow3m lynx links mozilla netscape其中之一的�g�[器
,或自�也可。
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/4206/showart_499922.html