閱讀456 返回首頁    go 阿裏雲 go 技術社區[雲棲]


打造自己的checkinstall

相信使用過rpmbuild 打包的讀者,對整個打包過程都記憶猶新,這個過程對於一個新手來說是異常複雜的。不僅要需要學習spec 格式文件的規 範,還要把文件先打包成tar ,然後再把tar 文件拷貝的到指定的目錄過程去,最後執行rpmbuild 命令。中間任何一步出錯,都要從頭再來。經過多次 往返,才能打成一個rpm 包。這一切複雜的過程,迫使你不等不找一種更簡單的打包方式。

checkinstall ,是一個能從 tar.gz 類的源代碼自動生成 RPMDebian Slackware 安裝包的程序。通過 CheckInstall ,你就能用幾乎所有的 tar.gz 類的源代碼來生成“幹淨”的安裝或者卸載包。

checkinstall 的使用非常方便,可以從checkinstall-1.6.1-1.i386.rpm 獲取checkinstallrpm 包,直接部署到我們的機器上,但是我們要打造自己的checkinstall ,所以我們最好下載源代碼來,獲取源代碼

通過源代碼安裝checkinstall 的過程如下

# tar xzf checkinstall-1.6.1.tgz # cd checkinstall-1.6.1 checkinstall-1.6.1# make checkinstall-1.6.1# make install checkinstall-1.6.1# checkinstall

如果使用checkinstall 打包,首先要確保你的項目中包含有Makefile 文件,我們在包含有Makefile 的目錄內執行

   sudo checkinstall   

指令 checkinstall 不僅默認運行了 make install ,而且還監測所有安裝過程中的寫操作。在 make install 成功完成之後,CheckInstall 會產生一個 Slackware-Debian- RPM- 安裝包,並在當前目錄(或標準安裝包存儲目錄)留下一個生成的安裝包。你可以通過修改變量 PAK_DIR 來修改這個保存目錄。

更詳細的過程可以參考《Linux 的源碼安裝工具 CheckInstall

    Checkinstall 的打包過程相對於rpmbuild 已經很簡單了,至少我們不用寫spec 文件,我們不用tar 文件,也不用拷貝來拷貝去。但是,具體應用中,還是有很多不爽的地方

  1. checkinstall 中有太多的交換命令,我能不能去掉?
  2. checkinstall 獲得項目名稱和版本號,以及依賴關係,都不是我想要的,每次打包時,修改這些信息很麻煩,能不能想spec 文件那樣,NameVersionSummaryPackager 等信息寫到一個文件內,checkinstall 從這個文件內讀取?
  3. 我們的項目需求,一次性需要打多個包,比如我要打一個數據庫包,打一個應用包,checkinstall 可以實現嗎?
  4. 等等,好像是用checkinstall 打的包安裝的時候有問題,提示
  5. error: unpacking of archive failed on file /bin/basename;4877040f: cpio: MD5 sum mismatch
  6. 這是一個 bug ,安裝的時候需要指定 --nomd5 ,這豈不是很麻煩?
  7. 在部署我的 rpm 包前,我希望執行一段 shell 命令,做些初始化工作。安裝完成後,再執行一段 shell 命令,做些清理工作。可是 checkinstall 不支持?難道我隻能用 spec 嘛?
  8.   spec 文件中,我可以在 %changelog 詳細描述,我每次打包時的日誌,而現在似乎我不能這樣,怎麼辦?

    筆者在使用 checkinstall 的時候,也碰到這種問題,尤其是令人惡心的是 MD5 驗證失敗的問題,查到 checkinstall 的官方 faq ,發現第一條就是這個問題

I use checkinstall 1.6.1 and the rpm I create report a faild MD5 verification when installed and/or the package has unrelated files inside. This is a known bug in version 1.6.1 and will be fixed in the next release. As a workaround you can use the --inspect, --review-spec and/or --review-control command line options and edit out the files to be included in the package. 

再看一下,最新版本的官方更新時間是 November 1st, 2006 ,很明顯,指望官方修改這個 bug 已經不可能了。看來隻能操刀子自己從頭修改吧。

經過修改後的 checkinstall_cn ,不但解決了 MD5 驗證失敗的問題,還增加了支持一種新的文件格式。參考我的 rar 中的 example.citb 文件

# 包的名稱 Name: test # 包的版本信息 Version: 1.0.0 Release: 1 # 依賴包 Requires: php , httpd # 創建者 Packager: ugg # 摘要信息 Summary: by ugg test # 版權 copyright: hehexiao PEARPATH=/usr/lib/php/pear/tbs/apps/customhtml HTDOCSPATH=/var/www/htdocs/apps/customhtml # 安裝腳本開始命令 , 以下部分可以從和 Makefile 中的內容相同即可 install: mkdir -p $(PEARPATH) mkdir -p $(HTDOCSPATH) cp -r ../../src/htdocs/*.php $(PEARPATH)/customhtml cp -r ../../src/pear/*.php $($HTDOCSPATH)/customhtml # 以下 shell 命令,要以 TAB 開始每一行 pre: # 每行命令以 TAB 開始 # sudo apachectl restart # 安裝包後執行命令,同 rpm 中的 %post 功能, post: # 每行命令以 TAB 開始 # sudo apachectl restart # 打包日誌,同 rpm 中的 %changelog changelog: # 每行日誌以 TAB 開始 * Wed May 20 2009 changjing.xu <guangzhao@taobao.com> %{Version} - this is test

如上所示,通過上麵這個配置文件,我們可以在這個配置文件中寫要打包的NameVersion 等信息,還可以寫包的prepostchangelog ,而我們打rpm 包隻需執行

    Sudo checkinstall –citb=example.citb  

並且筆者還對checkinstall 的文件進行配置,減少了打包過程中的交互。可能還有一個需求沒有滿足就是,就是如何打多個包?

    其實這個功能也做了,參考包內的mmt_create ,有了mmt_create 之後,我就不在直接使用checkinstall 進行打包了,而是

    mmt_create –citb checkinstall.citb mmt_create –citb *.citb mmt_create –citb checkinstall.citb example.citb 

    使用mmt_create 後,經過打造的checkinstall 就具有如下功能了。

  • 打包命令簡單,所需要操作就是指定要打包的citb 文件。
  • 目錄隨意,citb 可以放置在任意目錄內。
  • 打包後的文件,放在和citb 同級目錄內。
  • 相對於spec ,更簡單的citb 格式文件編寫。隻要您會寫shell ,就會寫citb 文件。
  • 支持多個citb 文件同時打包
  • 支持spec 格式文件打包
  • 支持自更新
  • 支持32-64 係統(已經經過測試)

如果使用checkinstall_cn

獲取到checkinstall_cn 後,解包到你的目錄,然後

如果使用checkinstall_cn
獲取到checkinstall_cn後,解包到你的目錄,然後
    # cd checkinstall-1.6.1
    checkinstall-1.6.1# make
    checkinstall-1.6.1# make install
    checkinstall-1.6.1# checkinstall
如果要使用mmt_create,可以在經過上述步驟後把mmt_create拷貝到/usr/local/bin/目錄內,但是我的推薦方法是
    1:先打checkinstall_cn包
    Sudo checkinstall –citb=checkinstall.citb
    2:安裝checkinstall_cn包
    Sudo rpm –ivh checkinstall-1.7.1-1.i386.rpm
    3:使用mmt_create
哈哈,現在你就可以是使用mmt_create打rpm包了。


下載checkinstll_cn
有任何問題或者建議,請聯係我,CSDN ID: 逸學堂(ugg)。

轉帖請注明:https://blog.csdn.net/ugg/archive/2009/05/26/4217660.aspx

最後更新:2017-04-02 00:06:46

  上一篇:go Web Service 使用分布式事務出錯(OLE DB provider &#39;SQLOLEDB&#39;無法啟動分布式事務)
  下一篇:go php數據庫抽象層PDO的簡單測試