dpkg實現多個deb包合並成一個deb包


使用dpkg制作deb包參考

https://www.cnblogs.com/minseo/p/16074459.html
在實際使用中我們會遇到用戶沒有網絡的情況,無法下載安裝包的情況,一個應用可能會有多個包,這種情況我們需要在其他有網絡的主機下載好deb包並且最后合並成一個deb包

環境查看

本次演示環境為UOS系統,arm系統

# lsb_release -a
No LSB modules are available.
Distributor ID: Uos
Description:    UnionTech OS Desktop 20 Pro
Release:        20
Codename:       eagle

下載deb包

下載但是不安裝deb包,以下載python3-tk包為例

apt -d install python3-tk

以上命令僅下載但是不安裝deb包
下載后的deb位置為

/var/cache/apt/archives/

制作一個需要依賴python3-tk的deb包

下面演示打包一個使用python編寫的腳本
查看目錄結構

root@liuym-virtual-machine:/home/liuym/桌面# tree file_decode_all
file_decode_all
├── DEBIAN
│   ├── control
│   └── postinst
├── readme.md
└── usr
    ├── local
    │   └── bin
    │       ├── background.png
    │       └── file-decode.py
    └── share
        └── applications
            └── file-decode.desktop

文件內容如下,控制文件

root@liuym-virtual-machine:/home/liuym/桌面# cat file_decode_all/DEBIAN/control
Package: file-decode
Version: 1.0.0
Architecture: all
Essential: no
Section: utils
Priority: optional
Maintainer: Liuym
Description: file utf decode gbk

解壓后運行的腳本文件

root@liuym-virtual-machine:/home/liuym/桌面# cat file_decode_all/DEBIAN/postinst
#!/bin/bash
chown root:root /usr/local/bin/file-decode.py
chmod 755 /usr/local/bin/file-decode.py

圖片文件 background.png是腳本需要的一個圖片
Python腳本文件

root@liuym-virtual-machine:/home/liuym/桌面# cat file_decode_all/usr/local/bin/file-decode.py
#!/usr/bin/python3
import tkinter as tk
from tkinter import messagebox
from tkinter import ttk
from tkinter import filedialog
import configparser, os, time
#from PIL import ImageTk, Image

class Login(object):

    def __init__(self):
        # 創建主窗口,用於容納其它組件

        self.root = tk.Tk()
        # 給主窗口設置標題內容
        self.root.title("csv文件轉碼(utf轉gbk)")

        self.root.geometry('800x800')
        # 運行代碼時記得添加一個gif圖片文件,不然是會出錯的
        self.canvas = tk.Canvas(self.root, height=500, width=600)  # 創建畫布
        self.image_file = tk.PhotoImage(file="/usr/local/bin/background.png")  # 加載圖片文件
        self.image = self.canvas.create_image(0, 0, anchor='nw', image=self.image_file)  # 將圖片置於畫布上
        self.canvas.pack(side='top')  # 放置畫布(為上端)

        # 創建一個`Button`名為`選擇文件 `
        self.label_select = tk.Button(self.root, text='選擇文件', command=self.upload_file)
        # 創建一個`Button`名為`轉碼`
        self.label_change = tk.Button(self.root, text='轉碼', command=self.decode_file)
        self.label_entry = tk.Entry(self.root, width='40')
        self.label_out = tk.Text(self.root, width='40', height='5' )
        self.label_show = tk.Label(self.root, text='轉碼輸出路徑')
    def upload_file(self):
        self.selectFile = tk.filedialog.askopenfilename()
        self.label_entry.insert(0, self.selectFile)

    def decode_file(self):
        #print(self.selectFile)
        now_time = time.strftime("%Y%m%d%H%M%S")
        #print(now_time)
        user_desktop = os.path.join(os.environ['HOME'], 'Desktop')
        csv_name= os.path.basename(self.selectFile)
        #os.system('ls -l "' + self.selectFile + '"')
        #os.system("ls -l %s" %(self.selectFile))
        param1 = '%s/%s_%s' %(user_desktop,now_time,csv_name)
        param2 = '>%s/%s_%s' %(user_desktop,now_time,csv_name)
        os.system('iconv -f utf8 -t gb2312 -c %s %s' %(self.selectFile, param2))

        self.label_out.insert("insert", "文件轉碼完成\n")
        self.label_out.insert("insert", param1)
        tk.messagebox.showinfo('提示', '文件轉碼完成,請在桌面查看轉碼后的文件')
        #self.size = os.path.getsize(self.selectFile)
        #print(self.size)

    # 完成布局
    def gui_arrang(self):
        self.label_select.place(x=10, y=520)
        self.label_change.place(x=620, y=520)
        self.label_entry.place(x=150, y=520)
        self.label_show.place(x=10,y=580)
        self.label_out.place(x=150, y=580)

def main():
    # 初始化對象
    app = Login()
    # 進行布局
    app.gui_arrang()
    # 主程序執行
    tk.mainloop()


if __name__ == '__main__':
    main()

file-decode.Desktop文件

root@liuym-virtual-machine:/home/liuym/桌面# cat file_decode_all/usr/share/applications/file-decode.desktop
[Desktop Entry]
Version=1.0
Encoding=UTF-8
Name=utf轉碼gbk工具
comment=utf轉碼gbk工具
Exec=/usr/local/bin/file-decode.py
Icon=deepin-terminal
Type=Application
Categories=Application;

打包

dpkg -b file_decode_all/ file_decode-1.0.0.deb
dpkg-deb: 正在 'file_decode-1.0.0.deb' 中構建軟件包 'file-decode'。

合並制作deb包

現在我們拿到兩個deb包,需要把這兩個deb包合並成一個deb包
制作思路把多個deb包解壓至一個文件夾,然后使用原始或者創建控制文件重新打包
查看deb包

# pwd
/root/file_decode
# ls
file_decode-1.0.0.deb  python3-tk_3.7.3-1_arm64.deb

解壓

dpkg -X file_decode-1.0.0.deb file_decode
dpkg -X python3-tk_3.7.3-1_arm64.deb file_decode

解析

dpkg -X # 參數-X把deb解壓
file_decode # 自定義解壓文件夾,如果沒有這個文件夾會自動創建

解壓詳細過程

# dpkg -X file_decode-1.0.0.deb file_decode
./
./usr/
./usr/local/
./usr/local/bin/
./usr/local/bin/background.png
./usr/local/bin/file-decode.py
./usr/share/
./usr/share/applications/
./usr/share/applications/file-decode.desktop
# dpkg -X python3-tk_3.7.3-1_arm64.deb file_decode
./
./usr/
./usr/lib/
./usr/lib/python3.7/
./usr/lib/python3.7/lib-dynload/
./usr/lib/python3.7/lib-dynload/_tkinter.cpython-37m-aarch64-linux-gnu.so
./usr/lib/python3.7/tkinter/
./usr/lib/python3.7/tkinter/__init__.py
./usr/lib/python3.7/tkinter/__main__.py
./usr/lib/python3.7/tkinter/colorchooser.py
./usr/lib/python3.7/tkinter/commondialog.py
./usr/lib/python3.7/tkinter/constants.py
./usr/lib/python3.7/tkinter/dialog.py
./usr/lib/python3.7/tkinter/dnd.py
./usr/lib/python3.7/tkinter/filedialog.py
./usr/lib/python3.7/tkinter/font.py
./usr/lib/python3.7/tkinter/messagebox.py
./usr/lib/python3.7/tkinter/scrolledtext.py
./usr/lib/python3.7/tkinter/simpledialog.py
./usr/lib/python3.7/tkinter/tix.py
./usr/lib/python3.7/tkinter/ttk.py
./usr/share/
./usr/share/doc/
./usr/share/doc/python3-tk/
./usr/share/doc/python3-tk/README.Debian
./usr/share/doc/python3-tk/README.Tk
./usr/share/doc/python3-tk/changelog.Debian.gz
./usr/share/doc/python3-tk/copyright
./usr/share/lintian/
./usr/share/lintian/overrides/
./usr/share/lintian/overrides/python3-tk

查看解壓后的文件夾

# tree file_decode
file_decode
└── usr
    ├── lib
    │   └── python3.7
    │       ├── lib-dynload
    │       │   └── _tkinter.cpython-37m-aarch64-linux-gnu.so
    │       └── tkinter
    │           ├── colorchooser.py
    │           ├── commondialog.py
    │           ├── constants.py
    │           ├── dialog.py
    │           ├── dnd.py
    │           ├── filedialog.py
    │           ├── font.py
    │           ├── __init__.py
    │           ├── __main__.py
    │           ├── messagebox.py
    │           ├── scrolledtext.py
    │           ├── simpledialog.py
    │           ├── tix.py
    │           └── ttk.py
    ├── local
    │   └── bin
    │       ├── background.png
    │       └── file-decode.py
    └── share
        ├── applications
        │   └── file-decode.desktop
        ├── doc
        │   └── python3-tk
        │       ├── changelog.Debian.gz
        │       ├── copyright
        │       ├── README.Debian
        │       └── README.Tk
        └── lintian
            └── overrides
                └── python3-tk

13 directories, 24 files

現在還缺少控制文件,可以創建一個,也可以直接從deb包中解壓出來然后修改,本次我們直接使用原來的控制文件使用參數-e

 dpkg -e file_decode-1.0.0.deb file_decode/DEBIAN

查看解壓后的控制文件

# cat file_decode/DEBIAN/control
Package: file-decode
Version: 1.0.0
Architecture: all
Essential: no
Section: utils
Priority: optional
Maintainer: paic.com.cn
Description: file utf decode gbk

使用新的文件夾打包成一個deb

e# dpkg -b file_decode/ file_decode-2.0.0.deb
dpkg-deb: 正在 'file_decode-2.0.0.deb' 中構建軟件包 'file-decode'。

使用新打包的deb安裝即可,安裝一個deb包相對於安裝了剛剛合並的兩個deb包

# dpkg -i file_decode-2.0.0.deb

提示:如果一次性打包的deb過多,可以編寫一個腳本執行


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM