Package PyGObject Applications and Programs as .deb Package para sa Linux Desktop – Part 4


Gipadayon namo ang PyGObject nga serye sa programming uban kanimo sa desktop sa Linux, sa 4th nga bahin sa serye among ipasabut kung unsaon pag-package ang mga programa ug aplikasyon nga among gibuhat para sa Linux desktop gamit ang PyGObject isip Debian package.

Ang mga pakete sa Debian (.deb) mao ang labing gigamit nga pormat sa pag-instalar sa mga programa ubos sa Linux, ang \dpkg nga sistema nga naghisgot sa .deb nga mga pakete mao ang default sa tanang Debian-based Linux distributions sama sa Ubuntu ug Linux Mint. Mao nga ato lang ipasabot kung unsaon pag-package sa atong mga programa para sa Debian.

Paghimo og Debian Package gikan sa imong PyGObject Applications

Una, kinahanglan ka adunay pipila ka sukaranan nga kahibalo bahin sa paghimo sa mga pakete sa Debian, kini nga mosunud nga giya makatabang kaayo kanimo.

  1. Pasiuna sa Debian Packaging

Sa laktod nga pagkasulti, kung ikaw adunay proyekto nga gitawag og \myprogram” kini kinahanglan nga adunay mga mosunod nga mga file ug mga folder aron mahimo nimo kini nga maputos.

  1. debian (Folder): Kini nga folder naglakip sa tanang impormasyon mahitungod sa Debian package nga gibahin ngadto sa daghang mga sub-file.
  2. po (Folder): Ang po folder naglakip sa mga file sa paghubad alang sa programa (Among ipasabut kini sa bahin 5).
  3. myprogram (File): Kini ang Python file nga among gibuhat gamit ang PyGObject, kini ang nag-unang file sa proyekto.
  4. ui.glade (File): Ang graphical user interface file.. Kung gibuhat nimo ang interface sa aplikasyon gamit ang Glade, kinahanglan nimo nga ilakip kini nga file sa
    imong proyekto.
  5. bMyprogram.desktop (File): Kini ang responsable nga file sa pagpakita sa aplikasyon sa menu sa mga aplikasyon.
  6. setup.py (File): Kini nga payl mao ang responsable sa pag-instalar sa bisan unsang Python nga programa sa lokal nga sistema, kini importante kaayo sa bisan unsang Python nga programa, kini adunay daghan pang mga paagi sa paggamit.

Syempre.. Adunay daghan pang mga file ug folder nga mahimo nimong iapil sa imong proyekto (sa tinuud mahimo nimong iapil ang bisan unsang gusto nimo) apan kana ang mga sukaranan.

Karon, magsugod kita sa pagputos sa usa ka proyekto. Paghimo og bag-ong folder nga gitawag og \myprogram, paghimo og file nga gitawag og \myprogram ug idugang ang mosunod nga code niini.

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

Paghimo og ui.glade nga payl ug pun-i kini niini nga code.

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

Wala'y bag-o hangtod karon.. Naghimo lang kami usa ka Python file ug ang interface file niini. Karon paghimo ug \setup.py” nga file sa samang folder, ug idugang ang mosunod nga code niini, ang matag linya gipasabot sa mga komento.

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

Karon paghimo ug \myprogram.desktop” nga payl sa samang folder, ug idugang ang mosunod nga code, gipasabot usab kini sa mga komento.

# 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 

Hapit na mi mahuman dinhi karon.. Kinahanglan na lang namo maghimo ug gagmay nga mga file ubos sa \debian” nga folder aron makahatag og impormasyon mahitungod sa among package para sa \dpkg nga sistema.

Ablihi ang \debian” nga folder, ug paghimo og mosunod nga mga file.

control
compat
changelog
rules

kontrol: Kini nga payl naghatag sa batakang impormasyon mahitungod sa Debian nga pakete, alang sa dugang mga detalye, palihug bisitaha ang 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: Kini usa lamang ka importante nga file alang sa dpkg system, kini naglakip lamang sa mahika nga 9 nga numero, ibilin kini nga ingon niana.

9

changelog: Dinhi mahimo nimong idugang ang mga pagbag-o nga imong gibuhat sa imong programa, alang sa dugang nga kasayuran, palihug bisitaha ang 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

mga lagda: Kini nga file mao ang responsable mahitungod sa pagpadagan sa proseso sa pag-instalar sa lokal nga makina aron ma-install ang package, mahimo nimong tan-awon ang dugang nga impormasyon
mahitungod niini nga file gikan dinhi: Debian Package Default Rules.

Bisan kung dili nimo kinahanglan ang bisan unsa pa alang sa imong programa sa Python.

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

Karon nga nahimo namon ang tanan nga kinahanglan nga mga file alang sa among programa nga malampuson, karon magsugod kami sa pagputos niini. Una, siguruha nga na-install nimo ang pipila nga mga pagsalig alang sa proseso sa pagtukod sa dili ka pa magsugod.

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

Karon hunahunaa nga ang \myprogram nga folder anaa sa imong home folder (/home/user/myprogram) aron ma-package kini isip Debian package, padagana ang mosunod nga mga command .

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

Ug mao kana! Ang imong pakete sa Debian malampuson nga nahimo:

Aron ma-install kini sa bisan unsang pag-apod-apod nga nakabase sa Debian, pagdagan.

$ sudo dpkg -i myprogram_1.0_all.deb

Ayaw kalimti ang pag-ilis sa ibabaw nga file sa ngalan sa package.. Karon human nimo ma-install ang package, mahimo nimong ipadagan ang programa gikan sa menu sa mga aplikasyon.

Ug kini molihok ..

Dinhi natapos ang ika-upat nga bahin sa among serye bahin sa PyGObject.. Sa sunod nga leksyon among ipasabut kung giunsa nga dali nga ma-localize ang aplikasyon sa PyGObject, hangtod nga magpadayon nga magtan-aw niini…