Package PyGObject Uwendungen a Programmer als .deb Package fir de Linux Desktop - Deel 4


Mir fuerderen d'PyGObject Programméierungsserie mat Iech um Linux Desktop weider, am 4. Deel vun der Serie wäerte mir erkläre wéi d'Programmer an Uwendungen packen déi mir erstallt hunn fir de Linux Desktop benotzt PyGObject als Debian Package.

Debian Packagen (.deb) sinn dat am meeschte benotzte Format fir Programmer ënner Linux z'installéieren, dem \dpkg System deen mat .deb Packagen handelt ass de Standard op all Debian-baséiert Linux Verdeelungen wéi Ubuntu a Linux Mint.Dofir wäerte mir nëmmen erkläre wéi mir eis Programmer fir Debian packen.

Erstellt en Debian Package vun Äre PyGObject Uwendungen

Als éischt sollt Dir e puer Basiswëssen iwwer Debian Packagen erstellen, dëse folgende Guide hëlleft Iech vill.

  1. Aféierung an Debian Packaging

Kuerz gesot, wann Dir e Projet mam Numm \myprogram hutt, muss et déi folgend Dateien an Ordner enthalen fir datt Dir et packt.

  1. debian (Dossier): Dësen Dossier enthält all Informatioun iwwer den Debian Package opgedeelt op vill Ënnerdateien.
  2. po (Dossier): De Po Dossier enthält d'Iwwersetzungsdateien fir de Programm (Mir erklären et am Deel 5).
  3. myprogram (Fichier): Dëst ass d'Python-Datei déi mir mat PyGObject erstallt hunn, et ass d'Haaptdatei vum Projet.
  4. ui.glade (Fichier): Déi grafesch User-Interface-Datei.. Wann Dir d'Interface vun der Applikatioun mat Glade erstallt hutt, musst Dir dës Datei an
    Äre Projet.
  5. bMyprogram.desktop (Fichier): Dëst ass déi verantwortlech Datei fir d'Applikatioun am Applikatiounsmenü ze weisen.
  6. setup.py (Fichier): Dëse Fichier ass verantwortlech fir all Python-Programm an de lokale System z'installéieren, et ass ganz wichteg an all Python-Programm, et huet och vill aner Benotzungsméiglechkeeten.

Natierlech .. Et gi vill aner Dateien an Ordner déi Dir an Ärem Projet ophuele kënnt (tatsächlech kënnt Dir alles enthalen wat Dir wëllt) awer dat sinn d'Basis.

Elo, loosst eis ufänken e Projet ze packen. Erstellt en neien Dossier mam Numm \myprogram, erstellt eng Datei mam Numm \myprogram a füügt de folgende Code derbäi.

#!/usr/bin/python 
# -*- coding: utf-8 -*- 

## Replace your name and email. 
# My Name <[email > 

## Here you must add the license of the file, replace "MyProgram" with your program name. 
# License: 
#    MyProgram is free software: you can redistribute it and/or modify 
#    it under the terms of the GNU General Public License as published by 
#    the Free Software Foundation, either version 3 of the License, or 
#    (at your option) any later version. 
# 
#    MyProgram is distributed in the hope that it will be useful, 
#    but WITHOUT ANY WARRANTY; without even the implied warranty of 
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
#    GNU General Public License for more details. 
# 
#    You should have received a copy of the GNU General Public License 
#    along with MyProgram.  If not, see <http://www.gnu.org/licenses/>. 

from gi.repository import Gtk 
import os 

class Handler: 
  
  def openterminal(self, button): 
    ## When the user clicks on the first button, the terminal will be opened. 
    os.system("x-terminal-emulator ") 
  
  def closeprogram(self, button): 
    Gtk.main_quit() 
    
# Nothing new here.. We just imported the 'ui.glade' file. 
builder = Gtk.Builder() 
builder.add_from_file("/usr/lib/myprogram/ui.glade") 
builder.connect_signals(Handler()) 
window = builder.get_object("window1") 
window.connect("delete-event", Gtk.main_quit) 
window.show_all() 
Gtk.main()

Erstellt eng ui.glade Datei a fëllt se mat dësem Code aus.

<?xml version="1.0" encoding="UTF-8"?> 
<!-- Generated with glade 3.16.1 --> 
<interface> 
  <requires lib="gtk+" version="3.10"/> 
  <object class="GtkWindow" id="window1"> 
    <property name="can_focus">False</property> 
    <property name="title" translatable="yes">My Program</property> 
    <property name="window_position">center</property> 
    <property name="icon_name">applications-utilities</property> 
    <property name="gravity">center</property> 
    <child> 
      <object class="GtkBox" id="box1"> 
        <property name="visible">True</property> 
        <property name="can_focus">False</property> 
        <property name="margin_left">5</property> 
        <property name="margin_right">5</property> 
        <property name="margin_top">5</property> 
        <property name="margin_bottom">5</property> 
        <property name="orientation">vertical</property> 
        <property name="homogeneous">True</property> 
        <child> 
          <object class="GtkLabel" id="label1"> 
            <property name="visible">True</property> 
            <property name="can_focus">False</property> 
            <property name="label" translatable="yes">Welcome to this Test Program !</property> 
          </object> 
          <packing> 
            <property name="expand">False</property> 
            <property name="fill">True</property> 
            <property name="position">0</property> 
          </packing> 
        </child> 
        <child> 
          <object class="GtkButton" id="button2"> 
            <property name="label" translatable="yes">Click on me to open the Terminal</property> 
            <property name="visible">True</property> 
            <property name="can_focus">True</property> 
            <property name="receives_default">True</property> 
            <signal name="clicked" handler="openterminal" swapped="no"/> 
          </object> 
          <packing> 
            <property name="expand">False</property> 
            <property name="fill">True</property> 
            <property name="position">1</property> 
          </packing> 
        </child> 
        <child> 
          <object class="GtkButton" id="button3"> 
            <property name="label">gtk-preferences</property> 
            <property name="visible">True</property> 
            <property name="can_focus">True</property> 
            <property name="receives_default">True</property> 
            <property name="use_stock">True</property> 
          </object> 
          <packing> 
            <property name="expand">False</property> 
            <property name="fill">True</property> 
            <property name="position">2</property> 
          </packing> 
        </child> 
        <child> 
          <object class="GtkButton" id="button4"> 
            <property name="label">gtk-about</property> 
            <property name="visible">True</property> 
            <property name="can_focus">True</property> 
            <property name="receives_default">True</property> 
            <property name="use_stock">True</property> 
          </object> 
          <packing> 
            <property name="expand">False</property> 
            <property name="fill">True</property> 
            <property name="position">3</property> 
          </packing> 
        </child> 
        <child> 
          <object class="GtkButton" id="button1"> 
            <property name="label">gtk-close</property> 
            <property name="visible">True</property> 
            <property name="can_focus">True</property> 
            <property name="receives_default">True</property> 
            <property name="use_stock">True</property> 
            <signal name="clicked" handler="closeprogram" swapped="no"/> 
          </object> 
          <packing> 
            <property name="expand">False</property> 
            <property name="fill">True</property> 
            <property name="position">4</property> 
          </packing> 
        </child> 
      </object> 
    </child> 
  </object> 
</interface>

Et gëtt näischt Neies bis elo .. Mir hunn just eng Python Datei a seng Interface Datei erstallt. Erstellt elo eng \setup.py Datei am selwechten Dossier, a füügt de folgende Code derbäi, all Zeil gëtt an de Kommentaren erkläert.

# Here we imported the 'setup' module which allows us to install Python scripts to the local system beside performing some other tasks, you can find the documentation here: https://docs.python.org/2/distutils/apiref.html 
from distutils.core import setup 

setup(name = "myprogram", # Name of the program. 
      version = "1.0", # Version of the program. 
      description = "An easy-to-use web interface to create & share pastes easily", # You don't need any help here. 
      author = "TecMint", # Nor here. 
      author_email = "[email ",# Nor here :D 
      url = "http://example.com", # If you have a website for you program.. put it here. 
      license='GPLv3', # The license of the program. 
      scripts=['myprogram'], # This is the name of the main Python script file, in our case it's "myprogram", it's the file that we added under the "myprogram" folder. 

# Here you can choose where do you want to install your files on the local system, the "myprogram" file will be automatically installed in its correct place later, so you have only to choose where do you want to install the optional files that you shape with the Python script 
      data_files = [ ("lib/myprogram", ["ui.glade"]), # This is going to install the "ui.glade" file under the /usr/lib/myprogram path. 
                     ("share/applications", ["myprogram.desktop"]) ] ) # And this is going to install the .desktop file under the /usr/share/applications folder, all the folder are automatically installed under the /usr folder in your root partition, you don't need to add "/usr/ to the path. 

Erstellt elo eng \myprogram.desktop Datei am selwechten Dossier, a füügt de folgende Code un, et gëtt och an de Kommentaren erkläert.

# This is the .desktop file, this file is the responsible file about showing your application in the applications menu in any desktop interface, it's important to add this file to your project, you can view more details about this file from here: https://developer.gnome.org/integration-guide/stable/desktop-files.html.en 
[Desktop Entry] 
# The default name of the program. 
Name=My Program 
# The name of the program in the Arabic language, this name will be used to display the application under the applications menu when the default language of the system is Arabic, use the languages codes to change the name for each language. 
Name[ar]=برنامجي 
# Description of the file. 
Comment=A simple test program developed by me. 
# Description of the file in Arabic. 
Comment[ar]=برنامج تجريبي بسيط تم تطويره بواسطتي. 
# The command that's going to be executed when the application is launched from the applications menu, you can enter the name of the Python script or the full path if you want like /usr/bin/myprogram 
Exec=myprogram 
# Do you want to run your program from the terminal? 
Terminal=false 
# Leave this like that. 
Type=Application 
# Enter the name of the icon you want to use for the application, you can enter a path for the icon as well like /usr/share/pixmaps/icon.png but make sure to include the icon.png file in your project folder first and in the setup.py file as well. Here we'll use the "system" icon for now. 
Icon=system 
# The category of the file, you can view the available categories from the freedesktop website.
Categories=GNOME;GTK;Utility; 
StartupNotify=false 

Mir sinn elo bal fäerdeg.. Mir mussen just e puer kleng Dateien ënner dem Dossier \debian erstellen fir Informatiounen iwwer eise Package fir den \dpkg ze ginn. > System.

Öffnen den Dossier \debian, a erstellt déi folgend Dateien.

control
compat
changelog
rules

Kontroll: Dëse Fichier liwwert d'Basisinformatioun iwwer den Debian Package, fir méi Detailer, besicht w.e.g. Debian Package Control Fields.

Source: myprogram
Maintainer: My Name <[email > 
Section: utils 
Priority: optional 
Standards-Version: 3.9.2 
Build-Depends: debhelper (>= 9), python2.7 

Package: myprogram 
Architecture: all 
Depends: python-gi 
Description: My Program 
Here you can add a short description about your program.

compat: Dëst ass just eng wichteg Datei fir den dpkg System, et enthält just déi magesch 9 Nummer, loosst et esou.

9

changelog: Hei kënnt Dir d'Ännerungen addéieren, déi Dir op Ärem Programm maacht, fir méi Informatioun, besicht w.e.g. Debian Package Changelog Source.

myprogram (1.0) trusty; urgency=medium 

  * Add the new features here. 
  * Continue adding new changes here. 
  * And here. 

 -- My Name Here <[email >  Sat, 27 Dec 2014 21:36:33 +0200

Regelen: Dëse Fichier ass verantwortlech fir den Installatiounsprozess op der lokaler Maschinn auszeféieren fir de Package z'installéieren, Dir kënnt méi Informatioun kucken
iwwer dëse Fichier vun hei: Debian Package Default Rules.

Och wann Dir näischt méi braucht fir Äre Python Programm.

#!/usr/bin/make -f 
# This file is responsible about running the installation process on the local machine to install the package, you can view more information about this file from here: https://www.debian.org/doc/manuals/maint-guide/dreq.en.html#defaultrules Though you won't need anything more for your Python program. 
%: 
    dh [email  
override_dh_auto_install: 
    python setup.py install --root=debian/myprogram --install-layout=deb --install-scripts=/usr/bin/ # This is going to run the setup.py file to install the program as a Python script on the system, it's also going to install the "myprogram" script under /usr/bin/ using the --install-scripts option, DON'T FORGET TO REPLACE "myprogram" WITH YOUR PROGRAM NAME. 
override_dh_auto_build:

Elo datt mir all déi néideg Dateie fir eise Programm erfollegräich erstallt hunn, loosst eis et ufänken ze packen. Als éischt gitt sécher datt Dir e puer Ofhängegkeete fir de Bauprozess installéiert hutt ier Dir ufänkt.

$ sudo apt-get update
$ sudo apt-get install devscripts

Stellt Iech elo vir datt den \myprogram Dossier an Ärem Dossier doheem ass (/home/user/myprogram) fir en als Debian Package ze packen, fuert déi folgend Kommandoen .

$ cd /home/user/myprogram
$ debuild -us -uc
[email :~/Projects/myprogram$
debuild -us -uc dpkg-buildpackage -rfakeroot -D -us -uc
dpkg-buildpackage: source package myprogram
dpkg-buildpackage: source version 1.0
dpkg-buildpackage: source distribution trusty
dpkg-buildpackage: source changed by My Name Here
<[email >
dpkg-source --before-build myprogram
dpkg-buildpackage: host architecture i386
fakeroot debian/rules clean
dh clean
dh_testdir
dh_auto_clean
....
.....
Finished running lintian.

An dat ass et! Ären Debian Package gouf erfollegräich erstallt:

Fir et op all Debian-baséiert Verdeelung z'installéieren, lafen.

$ sudo dpkg -i myprogram_1.0_all.deb

Vergiesst net déi uewe genannte Datei mam Numm vum Package z'ersetzen.. Elo nodeems Dir de Package installéiert hutt, kënnt Dir de Programm aus dem Applikatiounsmenü lafen.

An et wäert funktionnéieren..

Hei endet de 4ten Deel vun eiser Serie iwwer PyGObject.. An der nächster Lektioun erkläre mir wéi Dir d'PyGObject Applikatioun einfach lokaliséiert, bis dohinner bleift ofgeschloss ...