打造ArchLinux下的類apt-get source工具


轉自:http://crane.is-programmer.com/posts/26726.html

首先廣告一下,Arch Linux 是我用過的最喜歡的一個Linux發行版,它是一個滾動升級模式的i686/x86-64 Linux發行版,它的開發注重於系設計簡潔、結構優雅、代碼 準確、體驗新潮的完美權衡。它給你一個最小的系統,但是提供很強大的包管理,從而你可以自由的構建一個理想的系統,它的包管理強大之處在於它有兩套包管理系統,一個是基於pacman的二進制包管理系統,類似ubuntu下的apt-get 系統,使用官方倉庫,提供大量打包好的軟件包可供直接使用,另外一個就是全功能的類ports的ABS(Arch Build System)軟件包管理系統,類似gentoo的emerge系統,可以很方便的從源碼構建軟件,而且構建出來的軟件也納入pacman的包管理系統,這樣就可以方便的缷載軟件,避免了最普通的configure&&make&&make install這一種從源碼構建方式不易缷載的問題。ABS實際上維護了一個PKGBUILD文件集合,其中每個PKGBUILD文件對應一個軟件,可以使用makepkg命令來通過PKGBUILD構建軟件。ABS其中的軟件包是社區維護用戶的,任何人都可以提交可以構建軟件的PKGBUILD,從而形成了一個非常巨大的倉庫,這個倉庫就叫AURArch Linux User-community Repository)。

很多人習慣了用apt-get source來下載一個軟件的源碼包,但是pacman卻沒有直接提供這樣的功能,顯得有些不便,其實ArchLinux把包源碼相關的事都交給ABS去做了,下載源碼可以通過abs命令及其它的命令組合來完成,稍顯麻煩,所以寫了一個腳本進行了包裝,實現把源碼下載到當前目錄的功能,同時也把下載好的源碼包解開,同時打上patch(如果有的話)。

#!/bin/sh
# This script is used for downloading package source tarball under Archlinux,  just like apt-get source pkg in ubuntu.
 
#make sure abs is installed
pacman -Q abs >/dev/null 2>&1
if [ $? -ne 0 ];then
    echo "abs is not installed."
    echo "installing abs..."
    if [ `whoami` == "root" ];then
        pacman -S abs 
        abs -t
    else
        sudo pacman -S abs 
        if [ $? -ne 0 ];then
            exit
        fi 
        sudo abs -t
    fi 
fi
 
#geting source through the PKGBUILD file
find /var/abs -type d -name $1 -exec cp -a {} /tmp/ \;
if [  -d /tmp/$1 ];then
    echo package found.
else
    echo package not found.
    exit
fi
pushd /tmp/$1 >/dev/null 2>&1
sed -i 's:\./configure.*$:exit:' PKGBUILD
makepkg
popd >/dev/null 2>&1
cp -a /tmp/$1/src ./$1 >/dev/null 2>&1

腳本原理就是利用abs得到AUR中的軟件的PKGBUILD,然後修改一下PKGBUILD從而讓makepkg只做下載源碼包並解開和打補丁的工作,在配置和編譯前停下來,這樣就得到了需要的軟件包的源碼。


轉載於: http://bbs.chinaunix.net/thread-1936426-1-1.html


命令                                 作用 

apt-cache search package    搜索包 
apt-cache show package    獲取包的相關信息,如說明、大小、版本等 
sudo apt-get install package    安裝包 
sudo apt-get install package - - reinstall 重新安裝包 
sudo apt-get -f install    強制安裝?#"-f = --fix-missing"當是修復安裝吧... 
sudo apt-get remove package    刪除包 
sudo apt-get remove package - - purge   刪除包,包括刪除配置文件等 
sudo apt-get update    更新源 
sudo apt-get upgrade   更新已安裝的包 
sudo apt-get dist-upgrade   升級系統 
sudo apt-get dselect-upgrade   使用 dselect 升級 
apt-cache depends package    瞭解使用依賴 
apt-cache rdepends package    瞭解某個具體的依賴?#當是查看該包被哪些包依賴吧... 
sudo apt-get build-dep package    安裝相關的編譯環境 
apt-get source package    下載該包的源代碼 
sudo apt-get clean && sudo apt-get autoclean    清理下載文件的存檔 && 只清理無用的包 
sudo apt-get check    檢查是否有損壞的依賴 


apt-get install 
下載  以及所有倚賴的包裹,同時進行包裹的安裝或升級.如果某個包裹被設置了 hold (停止標誌,就會被擱在一邊(即不會被升級).更多 hold 細節請看下面.

apt-get remove [--purge] 
移除  以及任何倚賴這個包裹的其它包裹.
--purge 指明這個包裹應該被完全清除 (purged) ,更多信息請看 dpkg -P .

apt-get update
升級來自 Debian 鏡像的包裹列表,如果你想安裝當天的任何軟件,至少每天運行一次,而且每次修改了
/etc/apt/sources.list 後,必須執行.

apt-get upgrade [-u]
升級所以已經安裝的包裹爲最新可用版本.不會安裝新的或移除老的包裹.如果一個包改變了倚賴關係而需要安裝一個新的包裹,那麼它將不會被升級,而是標誌爲 hold .apt-get update 不會升級被標誌爲 hold 的包裹 (這個也就是 hold 的意思).請看下文如何手動設置包裹爲 hold .我建議同時使用 '-u' 選項,因爲這樣你就能看到哪些包裹將會被升級.

apt-get dist-upgrade [-u]
和 apt-get upgrade 類似,除了 dist-upgrade 會安裝和移除包裹來滿足倚賴關係.因此具有一定的危險性.

apt-cache search 
搜索滿足  的包裹和描述.

apt-cache show 
顯示  的完整的描述.

apt-cache showpkg 
顯示  許多細節,以及和其它包裹的關係.
dselect
console-apt
aptitude
gnome-apt
APT 的幾個圖形前端(其中一些在使用前得先安裝).這裏 dselect 無疑是最強大的,也是最古老,最難駕馭.

普通 Dpkg 用法
dpkg -i 
安裝一個 Debian 包裹文件;如你手動下載的文件.

dpkg -c 
列出  的內容.

dpkg -I 
從  中提取包裹信息.

dpkg -r 
移除一個已安裝的包裹.

dpkg -P 
完全清除一個已安裝的包裹.和 remove 不同的是, remove 只是刪掉數據和可執行文件, purge 另外還刪除所有的配製文件.

dpkg -L 
列出  安裝的所有文件清單.同時請看 dpkg -c 來檢查一個 .deb 文件的內容.

dpkg -s 
顯示已安裝包裹的信息.同時請看 apt-cache 顯示 Debian 存檔中的包裹信息,以及 dpkg -I 來顯示從一個
.deb 文件中提取的包裹信息.

dpkg-reconfigure 
重新配製一個已經安裝的包裹,如果它使用的是 debconf (debconf 爲包裹安裝提供了一個統一的配製界面).你能夠重新配製 debconf 它本身,如你想改變它的前端或提問的優先權.例如,重新配製 debconf ,使用一個 dialog 前端,簡單運行:
dpkg-reconfigure --frontend=dialog debconf (如果你安裝時選錯了,這裏可以改回來喲
echo " hold" | dpkg --set-selections
設置  的狀態爲 hlod (命令行方式)
dpkg --get-selections ""
取的  的當前狀態 (命令行方式)
支持通配符,如:
Debian:~# dpkg --get-selections *wine*
libwine hold
libwine-alsa hold
libwine-arts hold
libwine-dev hold
libwine-nas hold
libwine-print hold
libwine-twain hold
wine hold
wine+ hold
wine-doc hold
wine-utils hold
例如:
大家現在用的都是 gaim-0.58 + QQ-plugin,爲了防止 gaim 被升級,我們可以採用如下方法:
方法一:
Debian:~# echo "gaim hold" | dpkg --set-selections
然後用下面命令檢查一下:
Debian:~# dpkg --get-selections "gaim"
gaim hold
現在的狀態標誌是 hold,就不能被升級了.
如果想恢復怎麼辦呢?
Debian:~# echo "gaim install" | dpkg --set-selections
Debian:~# dpkg --get-selections "gaim"
gaim install
這時狀態標誌又被重置爲 install,可以繼續升級了.
同志們會問,哪個這些狀態標誌都寫在哪個文件中呢?
在 /var/lib/dpkg/status 裏,你也可以通過修改這個文件實現 hold.
有時你會發現有的軟件狀態標誌是 purge,不要奇怪.
如:事先已經安裝了 amsn, 然後把它卸了.
apt-get remove --purge amsn
那麼狀態標誌就從 install 變成 purge.
方法二:
在/etc/apt 下手動建一個 preferences 文件
內容:
Package: gaim
Pin: version 0.58*
保存
更詳細內容請看:
http://linuxsir.com/bbs/showthread....&threadid=22601
dpkg -S 
在包裹數據庫中查找 ,並告訴你哪個包裹包含了這個文件.(注:查找的是事先已經安裝的包裹)
從源碼建立deb packages
apt-get source [-b]  
下載一個源碼的包並解開。

你必須在你的/etc/apt/sources.list文件裏寫入一條 deb-src 的記錄才能完成這項工作。
如果你輸入了一個-b參數,並且是以root的身份,deb包會被自動的創建。

apt-get build-dep  
自動下載並安裝通過源碼創建  時需要的包。
只有apt 0.5以上版本才支持這個功能。
現在woody和以上版本包含了這個功能。
如果你使有一箇舊版本的apt,查找依賴性最簡單的方法是查看源碼包中 debian/control 這個文件,
注意這個路徑是相對的,是包內的路徑。

普通的用法,結合 apt-get source -b,例子 (as root):
apt-get build-dep 
apt-get source -b 
會下載源碼包,建立依賴性,然後嘗試編譯源碼。

dpkg-source -x 
如果你手工下載了一個程序的源碼包,其中包含了幾個類似 .orig.tar.gz , .dsc ,
以及 .diff.gz 之類的文件,
那麼你就可以對 .dsc 文件使用這個命令來 unpack 源碼包。


dpkg-buildpackage
從 Debian 源碼樹建立一個deb包。你必須在source tree的主目錄才能生效。例如:
dpkg-buildpackage -rfakeroot -uc -b
這裏 '-rfakeroot' 指定命令使用 fakeroot 程序來模仿 root 權限 (來實現所有者(ownership)目的),
'-uc' 表示 "Don't cryptographically sign the changelog", '-b' 代表只建立二進制包.
debuild
一個快速打包腳本類似 dpkg-buildpackage ,能自動的識別是否使用 fakeroot,
同時爲你運行 lintian 和 gpg 
修正倚賴關係
dpkg --configure --pending
如果dpkg在apt-get install upgrade dist-uptradeing 的時候出錯退出,
嘗試使用此命令來配置已經unpack的包。
然後再用 apt-get install ,upgrade, or dist-upgrade -f ,
然後再用 apt-get install, upgrade, or dist-upgrade.
可能會重複多次,這樣通常可以解決大多數的依賴性問題。
(同時,如果提示由於某種原因需要某個特定的包裹,你可以常識安裝或卸載這個包)
apt-get install -f
apt-get upgrade -f
apt-get dist-upgrade -f 
嘗試修正上述過程中出現依賴性關係
注意 apt-get install -f 不需要  作爲參數。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章