Empacotar aplicativos e programas PyGObject como pacote ".deb" para o Linux Desktop - Parte 4
Continuamos a série de programação PyGObject com você no desktop Linux, na 4ª parte da série explicaremos como empacotar os programas e aplicativos que criamos para o Desktop Linux usando PyGObject como um pacote Debian.
Pacotes Debian (.deb) são o formato mais usado para instalar programas no Linux, o sistema “dpkg ” que lida com pacotes .deb é o padrão em todas as distribuições Linux baseadas em Debian, como Ubuntu e Linux Mint. É por isso que explicaremos apenas como empacotar nossos programas para Debian.
Crie um pacote Debian a partir de seus aplicativos PyGObject
Primeiro, você deve ter algum conhecimento básico sobre a criação de pacotes Debian, este guia a seguir irá ajudá-lo muito.
- Introdução ao empacotamento Debian
Resumindo, se você tiver um projeto chamado “meuprograma”, ele deverá conter os seguintes arquivos e pastas para que você possa empacotá-lo.
- debian (pasta): Esta pasta inclui todas as informações sobre o pacote Debian divididas em vários subarquivos.
- po (Pasta): A pasta po contém os arquivos de tradução do programa (explicaremos na parte 5).
- myprogram (Arquivo): Este é o arquivo Python que criamos usando PyGObject, é o arquivo principal do projeto.
- ui.glade (Arquivo): O arquivo da interface gráfica do usuário. Se você criou a interface do aplicativo usando o Glade, você deve incluir este arquivo em
seu projecto. - bMyprogram.desktop (Arquivo): Este é o arquivo responsável por mostrar a aplicação no menu de aplicações.
- setup.py (Arquivo): Este arquivo é o responsável por instalar qualquer programa Python no sistema local, é muito importante em qualquer programa Python, possui muitas outras formas de utilização também.
Claro.. Existem muitos outros arquivos e pastas que você pode incluir em seu projeto (na verdade você pode incluir o que quiser), mas esses são os básicos.
Agora, vamos começar a empacotar um projeto. Crie uma nova pasta chamada “meuprograma”, crie um arquivo chamado “meuprograma” e adicione o seguinte código a ela.
#!/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()
Crie um arquivo ui.glade e preencha-o com este código.
<?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>
Não há nada de novo até agora. Acabamos de criar um arquivo Python e seu arquivo de interface. Agora crie um arquivo “setup.py” na mesma pasta e adicione o seguinte código a ele, cada linha é explicada nos comentários.
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.
Agora crie um arquivo “myprogram.desktop” na mesma pasta e adicione o código a seguir, também explicado nos comentários.
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
Estamos quase terminando aqui. Só precisamos criar alguns pequenos arquivos na pasta “debian” para fornecer informações sobre nosso pacote para o “dpkg” sistema.
Abra a pasta “debian” e crie os seguintes arquivos.
control
compat
changelog
rules
control: Este arquivo fornece as informações básicas sobre o pacote Debian, para mais detalhes, visite Campos de controle do pacote Debian.
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: Este é apenas um arquivo importante para o sistema dpkg, inclui apenas o número mágico 9, deixe assim.
9
changelog: Aqui você poderá adicionar as alterações feitas em seu programa. Para obter mais informações, visite a fonte do changelog do pacote Debian.
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
regras: Este arquivo é responsável por executar o processo de instalação na máquina local para instalar o pacote, você pode ver mais informações
sobre este arquivo aqui: Regras padrão do pacote Debian.
Embora você não precise de mais nada para o seu programa 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 $@
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:
Agora que criamos todos os arquivos necessários para o nosso programa com sucesso, agora vamos começar a empacotá-lo. Primeiro, certifique-se de ter instalado algumas dependências para o processo de construção antes de começar.
sudo apt-get update
sudo apt-get install devscripts
Agora imagine que a pasta “meuprograma” está na sua pasta pessoal (/home/user/meuprograma) para empacotá-la como um pacote Debian, execute os seguintes comandos.
cd /home/user/myprogram
debuild -us -uc
Saída de amostra
hanny@hanny-HP-Pavilion-15-Notebook-PC:~/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.
E é isso ! Seu pacote Debian foi criado com sucesso:
Para instalá-lo em qualquer distribuição baseada em Debian, execute.
sudo dpkg -i myprogram_1.0_all.deb
Não se esqueça de substituir o arquivo acima pelo nome do pacote. Agora, depois de instalar o pacote, você pode executar o programa no menu de aplicativos.
E vai funcionar..
Aqui termina a 4ª parte da nossa série sobre PyGObject. Na próxima lição explicaremos como localizar facilmente a aplicação PyGObject, até então fique atento…