Pakke PyGObject applikationer og programmer som ".deb" pakke til Linux Desktop - del 4


Vi fortsætter programmeringsserien PyGObject med dig på Linux-skrivebordet. I 4. del af serien forklarer vi, hvordan vi pakker de programmer og applikationer, som vi oprettede til Linux-skrivebord ved hjælp af PyGObject som en Debian-pakke.

Debian-pakker ( .deb ) er det mest anvendte format til installation af programmer under Linux, " dpkg " -systemet, der beskæftiger sig med .deb -pakker, er standard på alle Debian-baserede Linux-distributioner som Ubuntu og Linux Mint. Derfor forklarer vi kun, hvordan vi pakker vores programmer til Debian.

Opret en Debian-pakke fra dine PyGObject-applikationer

For det første skal du have nogle grundlæggende viden om oprettelse af Debian-pakker, denne følgende guide hjælper dig meget.

  1. Introduktion til Debian Packaging

Kort sagt, hvis du har et projekt, der hedder “ mit program ”, skal det indeholde følgende filer og mapper, så du kan pakke det.

  1. debian (mappe): Denne mappe indeholder alle oplysninger om Debian-pakken opdelt i mange underfiler.
  2. po (mappe): po-mappen indeholder programmets oversættelsesfiler (vi forklarer det i del 5).
  3. myprogram (File): Dette er den Python-fil, vi oprettede ved hjælp af PyGObject, det er projektets hovedfil.
  4. ui.glade (File): Den grafiske brugergrænsefladesfil .. Hvis du oprettede applikationens interface ved hjælp af Glade, skal du medtage denne fil i
    dit projekt.
  5. bMyprogram.desktop (File): Dette er den ansvarlige fil til visning af applikationen i applikationsmenuen.
  6. setup.py (File): Denne fil er ansvarlig for at installere ethvert Python-program i det lokale system, det er meget vigtigt i ethvert Python-program, det har også mange andre måder at bruge det på.

Selvfølgelig .. Der er mange andre filer og mapper, som du kan medtage i dit projekt (faktisk kan du medtage alt hvad du vil), men det er de grundlæggende.

Lad os nu pakke et projekt. Opret en ny mappe kaldet “ mit program ”, opret en fil kaldet “ mit program ” og tilføj følgende kode til den.

#!/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()

Opret en ui.glade fil, og udfyld den med denne kode.

<?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>

Der er intet nyt indtil nu. Vi har lige oprettet en Python-fil og dens interfacefil. Opret nu en " setup.py " fil i den samme mappe, og tilføj følgende kode til den, hver linje forklares i kommentarerne.

# 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. 

Opret nu en " myprogram.desktop " fil i samme mappe, og tilføj følgende kode, det er også forklaret i kommentarerne.

# 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 

Vi er næsten færdige her nu .. Vi skal bare oprette nogle små filer under mappen " debian " for at give oplysninger om vores pakke til " dpkg " system.

Åbn mappen " debian ", og opret følgende filer.

control
compat
changelog
rules

kontrol : Denne fil giver de grundlæggende oplysninger om Debian-pakken. For flere detaljer, se venligst Debian-pakkekontrolfelter.

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 : Dette er bare en vigtig fil til dpkg-systemet, det inkluderer bare det magiske 9-tal, lad det være sådan.

9

changelog : Her vil du være i stand til at tilføje de ændringer, du foretager i dit program. For mere information, besøg venligst 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

regler : Denne fil er ansvarlig for at køre installationsprocessen på den lokale maskine for at installere pakken, du kan se flere oplysninger
om denne fil herfra: Standardregler for Debian-pakke.

Selvom du ikke har brug for mere til dit Python-program.

#!/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:

Nu er vi oprettet alle de nødvendige filer til vores program med succes, lad os nu begynde at pakke det. Først skal du sørge for, at du har installeret nogle afhængigheder til byggeprocessen, før du starter.

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

Forestil dig nu, at mappen " mit program " er i din hjemmemappe (/hjem/bruger/mit program ) for at pakke den som en Debian-pakke skal du køre følgende kommandoer.

$ 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.

Og det er det ! Din Debian-pakke blev oprettet med succes:

For at installere det på enhver Debian-baseret distribution skal du køre.

$ sudo dpkg -i myprogram_1.0_all.deb

Glem ikke at erstatte ovenstående fil med navnet på pakken. Nu efter du har installeret pakken, kan du køre programmet fra applikationsmenuen.

Og det fungerer ..

Her slutter den 4. del af vores serie om PyGObject .. I den næste lektion forklarer vi, hvordan man nemt kan lokalisere PyGObject-applikationen, indtil vi forbliver tunede for det ...