Empaquetar es DIFÍCIL
O ni siquiera eso, quiero que la gente tenga la oportunidad de usarlo.
Eso significa que quiero que funcione en Windows (y tal vez en OSX algún día, si alguien me da una mano). Lo que significa que tengo que hacer una versión para Windows.
hagamos una comparación rápida desde el punto de vista del usuario y del desarrollador.
El usuario, en Linux
Esto es en Arch Linux, que es lo que yo uso, en otras variantes es más o menos lo mismo una vez que Marave sea mas conocido.
yaourt -S marave-svn --noconfirm
Eso obtiene el código de SVN (por ahora es lo mejor, más adelante empaquetaré releases), todas las dependencias, y lo instala. Tarda unos 15 segundos en mi notebook.
Después de eso, tenés un Marave funcionando.
En caso de que no esté en tu distro, tenés que instalar PyQt (que seguro si está) y correr:
easy_install marave
El usuario, en windows
Vas a http://marave.googlecode.com, click en "Marave-0.5.win32.exe" (No lo busques, todavía no está) bajás un programa de 10MB. Eso es un programa de 10MB porque windows no cree en paquetes y en dependencias. En Linux un paquete de Marave sería 1MB (casi todo imágenes), y sería datos, no ejecutable.
Por supuesto hoy en día un browser no te ejecuta un programa que bajaste, asi que... hagamos una galería!
Sí, guardar.
Doble click para abrir.
Sí, estoy de acuerdo.
Hmmm, bueno.
Bárbaro...
Genial!
Ahora este Marave puede funcionar o no pero eso es para más adelante...
El desarrollador, en Linux
Primero, este es el mayor problema un "empaquetador" puede tener en Linux:
Como Marave es una aplicación nueva, y la desarrollo en Arch Linux que es medio cutting edge, usa features que sólo están en versiones nuevas de PyQt. De hecho no funciona con PyQt < 4.6, que no está en algunas distros "lentas" o en un Ubuntu que no es el último.
Solución? Bueno, podría ignorarlo, pero que tanto, vamos a arreglarlo!
Graias a PyInstaller ni siquiera es tan difícil, este es el archivo spec:
a = Analysis([os.path.join(HOMEPATH,'support/_mountzlib.py'), os.path.join(HOMEPATH,'support/useUnicode.py'), 'marave/main.py'], pathex=['/home/ralsina/trunk/trunk']) pyz = PYZ(a.pure) exe = EXE(pyz, a.scripts, exclude_binaries=1, name=os.path.join('build/pyi.linux2/main', 'marave.exe'), debug=False, strip=False, upx=True, console=0 ) coll = COLLECT( exe, a.binaries, [('radios.txt','marave/radios.txt','DATA')], Tree('marave/icons','icons'), Tree('marave/backgrounds','backgrounds'), Tree('marave/clicks','clicks'), Tree('marave/stylesheets','stylesheets'), Tree('marave/themes','themes'), a.zipfiles, a.datas, strip=False, upx=True, name=os.path.join('dist', 'marave'))
Usando esto, PyInstaller produce una linda carpeta llena de todo lo que Marave necesita para funcionar en cualquier Linux.
Por otro lado, si se puede contar con que haya un PyQt reciente disponible, también es fácil. Éste es el archivo de configuración para un paquete similar en Arch Linux (todavía no hice uno para Marave). Para otros Linux es más o menos lo mismo, y normalmente alguien te lo hace:
# Contributor: Roberto Alsina <ralsina@kde.org> pkgname=python-rst2pdf pkgver=0.12.1 pkgrel=4 pkgdesc="Create PDFs from simple text markup, no LaTeX required." arch=('i686' 'x86_64') url="http://rst2pdf.googlecode.com" license=('custom') depends=('python' 'setuptools' 'docutils' 'pygments' 'python-reportlab' 'python-simplejson' 'pil') source=(http://rst2pdf.googlecode.com/files/rst2pdf-$pkgver.tar.gz LICENSE.txt) optdepends=('uniconvertor: vector images support' 'python-svglib: SVG support' 'python-wordaxe: hyphenation' 'pythonmagick: PDF images support') build() { cd $startdir/src/rst2pdf-$pkgver python setup.py install --root=$startdir/pkg || return 1 install -D ../LICENSE.txt $startdir/pkg/usr/share/licenses/python-rst2pdf/COPYING install -D doc/rst2pdf.1 $startdir/pkg/usr/share/man/man1/rst2pdf.1 } md5sums=('ea6beda9a46f34ba42c4c94d48cc607a' '416f8046c66b9476cdbacda69a673afe')
Y eso es todo lo que hay que saber del proceso de empaquetar tu aplicación para Linux, es fácil de hacer, y la mayor parte del tiempo, fácil de hacer bien.
Ahora, la sección final...
Windows para el desarrollador
¿Primero, te acordás de eso de depender de la versión de sistema de Qt? Olvídalo, no hay versión de sistema. Tampoco hay Python, así que no importa. Y nadie los va a instalar para tu aplicación, así que tenemos que meter todo nosotros, o nada.
Pero lo bueno es que PyInstaller funciona para Windows! Entonces, usando el mismo spec funciona, no?
Bueno, hay dos problemas...
Problema 1: El instalador
Los usuarios de Windows no van a abrir un zip y conectar el binario con el menú de inicio ni nada parecido, así que hay que hacer un instalador.
Esto es lo que hice para NSIS, un creador de instaladores gratuito:
;-------------------------------- ;Include Modern UI !include "MUI2.nsh" ;-------------------------------- ;General ;Name and file Name "Marave" OutFile "Marave-0.5.win32.exe" ;Default installation folder InstallDir "$LOCALAPPDATA\Marave" ;Get installation folder from registry if available InstallDirRegKey HKCU "Software\Marave" "" ;Request application privileges for Windows Vista RequestExecutionLevel user ;-------------------------------- ;Interface Settings !define MUI_ABORTWARNING ;-------------------------------- ;Pages !insertmacro MUI_PAGE_LICENSE "LICENSE" !insertmacro MUI_PAGE_DIRECTORY !insertmacro MUI_PAGE_INSTFILES !insertmacro MUI_UNPAGE_CONFIRM !insertmacro MUI_UNPAGE_INSTFILES ;-------------------------------- ;Languages !insertmacro MUI_LANGUAGE "English" ;-------------------------------- ;Installer Sections Section "Install" SetOutPath "$INSTDIR" File /r "dist\marave" ;Store installation folder WriteRegStr HKCU "Software\Marave" "" $INSTDIR ;Create uninstaller WriteUninstaller "$INSTDIR\Uninstall.exe" ;Create shortcuts CreateDirectory $SMPROGRAMS\Marave CreateShortCut "$SMPROGRAMS\Marave\Marave.lnk" "$INSTDIR\marave\marave.exe" ; use defaults for parameters, icon, etc. CreateShortCut "$SMPROGRAMS\Marave\Uninstall Marave.lnk" "$INSTDIR\Uninstall.exe" ; use defaults for parameters, icon, etc. SectionEnd ;-------------------------------- ;Uninstaller Section Section "Uninstall" Delete "$INSTDIR\Uninstall.exe" RMDir /r "$INSTDIR" DeleteRegKey /ifempty HKCU "Software\Marave" SectionEnd
Es comparable al esfuerzo de hacer un arhivo de empaquetado, excepto que cada vez que lo querés probar... lo instalás. No hay manera (que yo vea) de saber qué hay adentro del instalador excepto correrlo.
Cuando las cosas fallan, no hay mensajes de error, por lo menos no del tipo que es útil para un desarrollador, el que necesita saber que salió mal.
Después de que termina, tal vez no funcione porque...
Problema 2: bibliotecas de sistema. Ja!
Los binarios de Python 2.6 están compilados con Visual Studio. Eso quiere decir que necesitan el Visual Studio Runtime, específicamente MSVCR90.DLL. Ésta contiene cosas que en Linux serían considerado parte de la libc (linuxero: imaginate aplicaciones que dependen de una libc específica... ¡no es fácil!)
En Linux eso es parte del sistema. Más aún, si lo necesitas, lo redistribuís. En Windows... es diferente.
Es parte del "Visual C++ redistributables"
Instalarlo no es garantía de que ande (sí, lo probé)
-
La licencia de esos 'redistributables' dice que no lo podés hacer disponible para descarga.
Me han dicho que incluírlo en tu instalador es legal, pero a mí me parece que eso es hacerlo disponible para descarga!
¿Qué se hace cuando necesitás una biblioteca, no la podés distribuir y el usuario no la va a instalar?
Bueno, por algo no hay binarios de Marave para Windows todavía ;-) Por supuesto si alguien lo puede resolver, me encantaría!