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!
Si crees que es difícil empaquetar para Windows, tendrías que probar empaquetar para Windows Mobile: ni siquiera se puede instalar más de una aplicación junta. Merge modules? Dependencias? jajaja. Un instalador por cada cosa que necesites, y que el usuario se arregle para instalarlos todos en órden...
Ojalá puedas resolverlo sin tantos problemas, es un editor muy bueno, tendría lindo mercado creo.
"Since Marave is a new app, and I develop it in the rather cutting-edge Arch Linux, it uses some newish features only available in recent versions of Qt. In fact, it doesn't work with PyQt < 4.6, which is not available in some slow distros, like _Linux_, or even in a not-latest Ubuntu."
I think you meant debian here :).
Oops! Thanks for the correction!
Fixed now.
Windows es asi.... 0 facilidades para el desarrollador
Read this:
http://www.py2exe.org/index...
Bingo! Ok, I don't have the right.
http://www.py2exe.org/index...
Then "...you could create an installer for your application (see step 6 below), that includes vcredist_x86.exe (which is itself redistributable by anyone), and then run that as part of your application installation. "
Ys, I still need to figure out that part. And of course, figure out how that's not against the license of vcredist_x86.exe:
"You may not [...] publish the software for others to copy [or] rent, lease or lend the software [or] transfer the software or this agreement to any third party"
Of course I know lots of people do this, but I take software licenses very seriously. I guess I'll just have to ask Microsoft.
Ya lo dijo Raymond... desarrollar en Windows es como bailar en una armadura :)
Ah, pero bailar en una armadura tiene ventajas!
Cuales?!
Nadie te empuja en el pogo?
The redistributables have one problem. They only work if you choose the right one and if _every_ components of you exe, that means Qt, libs your project have all been compile by the same and according compiler version. If every single piece of your resulting exe was compiled with a different version of msvc you need to install all according vcredist files (and there are many version...).
The easiest way to get rid of this problem is to recompile everything (including Qt) as static or to recompile everything at least with the same compiler or to use mingw instead of msvc because then you do not have to deal with this issue anyway.
It looks like there is a "magical version" that makes it all work (it's the one in the py2exe link above). I'll find someone that has VS2008 to help me with the packaging since he will have the license to redistribute those "redistributables".
+1 to using mingw -- msvc dll hell can easily become a nightmare
I'd love to but I lack resources to rebuild python, qt and pyqt on windows with mingw. I just have a small VM with XP :-(
Is there a set pf binaries I could use?
You can redistribuite VCRedist_x86.exe, and even only MSVCR90.DLL.
Quote from here http://msdn.microsoft.com/e...
===========
The Visual C++ Redistributable Package (VCRedist_x86.exe, VCRedist_x64.exe, VCRedist_ia64.exe) has to be executed on the target system as a prerequisite to installation of the application. This package installs and registers all Visual C++ libraries.
NoteNote:
We recommend that you use this package to redistribute Visual C++ libraries for applications that you built with Visual C++ Express and for cases when you want to deploy all Visual C++ libraries at the same time.
=======
Also checkout http://msdn.microsoft.com/e...
The Windows Python installer also includes vcredist_x86.exe, like many other applications: http://bugs.python.org/issu...
BTW, the Linux way has it's problems also. Try installing Anjunta IDE on CentOS to see what I mean.
You get the right to redistribute vc redist as part of licensing Visual Studio. If VS Express gives you that and is free, that may be a workaround.
Never tried Anjuta, sorry :-)
Does Microsoft allow _downloading_ the redistributable in the setup process?
If so, InnoSetup+ InnoTools Downloader would be worth a look.
http://innosetup.org
and
http://www.sherlocksoftware...
InnoSetup is FOSS; and it runs out of the box in wine under ArchLinux.
this is really interesting viewpoint on the subject i might add
!! Man ... Beautiful . Amazing ... I will bookmark your website and use the your RSS feed also
Your blog has the same post as another author but i like your better