010
14.03.2007, 10:15 Uhr
J-jayz-Z
Perl Crack ala Carte (Operator)
|
Also, mittlerweile komme ich relativ gut mit WiX zu recht und werde es auch weiterhin verwenden. Ich schreib hier mal ein wenig darüber, für die, die es selbst noch nicht kennen.
WiX ist ein von Microsoft erstelltes Tool, was das .NET Framework verwenden. Es war das erste Open Source Projekt von M$ und steht unter der Common Public Licence. Es wird dazu genutzt, um MSI Packages aus XML Dateien zu erzeugen. Dazu wird der Kompiler (candle.exe) und der Linker (light.exe) benötigt.
Die ganze XML Struktur ist ziemlich verknüpft aufgebaut. Man kann <Directory> Nodes erzeugen, dieser Id's mitgeben und diese Id's dann später als Variablen verwenden. Es gibt auch einige vordefinierte Variablen, wie zum Beispiel ProgramMenuFolder (CDokumente und Einstellungen\$user\Startmenü\Programme), SystemFolder (CWINDOWS\system32) oder ProgrammFilesFolder (CProgramme). Diese nutze ich auch in meinem Beispiel. Um eine Datei mitzuliefern, muss man Unterhalb der Node <Directory> die Subnode <Component> einfügen. Diese enthällt dann eine weitere Node <File>, die den Namen, die Id und der Ort beinhaltet, wo man Sie findet. Sie wird dann in dem Ordner abgelegt, der mit <Directory> spezifiziert wurde.
Aber genug des ganzen. Die XML Datei, die ich hier kurz poste liefert ein Hello World programm mit QT4 aus. Dazu gehören ein paar Icon's, die QtCore4.dll, die QtGui4.dll und die mingwm10.dll. Die dll's werdem im system32 Ordner abgelegt und die exe in CProgramme\Hello World. Außerdem wird im Startmenu ein neuer Ordner Hello World angelegt, welcher eine Verknüpfung zu der .exe enthällt.
hello.wxs:
Code: |
<?xml version='1.0'?> <Wix xmlns='http://schemas.microsoft.com/wix/2003/01/wi'> <Product Id='12345678-1234-1234-1234-123456789012' Name='Hello World' Language='1033' Version='1.0.0.0' Manufacturer='Microsoft Corporation'> <Package Id='12345678-1234-1234-1234-123456789012' Description='Windows Installer for QT Hello World' Comments='Sample MSI package for installing a Hello World programm, using QT' InstallerVersion='200' Compressed='yes' /> <Media Id='1' Cabinet='product.cab' EmbedCab='yes' />
<Directory Id='INSTALLDIR' Name='SourceDir'> <Directory Id='ProgramFilesFolder' Name='PFiles'> <Directory Id='MyDir' Name='HelloW' LongName='Hello World'> <Component Id='ReadmeComponent' Guid='12345678-1234-1234-1234-123456789012'> <File Id='hello' Name='hello.exe' LongName='hello.exe' DiskId='1' src='release/hello.exe'> <Shortcut Id='Startmenu' Name='Hello' LongName='Hello World' Directory='MenuFolder' Icon='helloi'/> </File> </Component> </Directory> </Directory> <Directory Id='ProgramMenuFolder' Name='Menu'> <Directory Id='MenuFolder' Name='Hello' LongName='Hello World'/> </Directory> <Directory Id='SystemFolder'> <Component Id='QtCore4' Guid='12345678-1234-1234-1234-123456789013'> <File Id='QtCore4.dll' Name='QtCore4.dll' DiskId='1' src='C:/Qt/4.2.2/bin/QtCore4.dll' /> </Component> <Component Id='QtGui4' Guid='12345678-1234-1234-1234-123456789014'> <File Id='QtGui4.dll' Name='QtGui4.dll' DiskId='1' src='C:/Qt/4.2.2/bin/QtGui4.dll' /> </Component> <Component Id='mingwm10' Guid='12345678-1234-1234-1234-123456789015'> <File Id='mingwm10.dll' Name='mingwm10.dll' DiskId='1' src='C:/Qt/4.2.2/bin/mingwm10.dll' /> </Component> </Directory> </Directory> <Feature Id='Complete' Title='My 1st Feature' Display='expand' Level='1' ConfigurableDirectory='INSTALLDIR'> <Feature Id='MyFeature' Title='Programm' Level='1'> <ComponentRef Id='ReadmeComponent' /> </Feature> <Feature Id='QtCoreFeature' Title='My Feature' Level='1'> <ComponentRef Id='QtCore4' /> </Feature> <Feature Id='QtGuiFeature' Title='My GuiFeature' Level='1'> <ComponentRef Id='QtGui4' /> </Feature> <Feature Id='mingwm10Feature' Title='My MinGWFeature' Level='1'> <ComponentRef Id='mingwm10' /> </Feature> </Feature> <UIRef Id="WixUI_Mondo" /> <Icon Id='helloi' SourceFile='delete.gif' /> </Product> </Wix>
|
Das <UIRef Id="WixUI_Mondo" /> bedeutet, das das komplette Packet von WixUI benötigt wird. Das wird mit WiX ausgeliefert und sorgt dafür, das man nicht jeden Button etc. selbst schreiben muss zum Verzeichniss auswählen etc. Das MSI package erstellt man mit
Code: |
foo@bar ~> candle.exe hello.wxs Microsoft (R) Windows Installer Xml Compiler version 2.0.4820.0 Copyright (C) Microsoft Corporation 2003. All rights reserved.
hello.wxs foo@bar ~> light.exe -out hello.msi hello.wixobj wix/wixui.wixlib -loc wix/WixUI_en-us.wxl Microsoft (R) Windows Installer Xml Linker version 2.0.4820.0 Copyright (C) Microsoft Corporation 2003. All rights reserved.
|
Nun haben wir eine lauffähige MSI Datei. Das -loc bedeutet, mit welchen Locales die MSI erstellt werden soll. Ich habe hier Englisch gewählt, weil bei der deutschen Datei (zumindest bei mir) die Umlaute nicht funktioniert haben.
Meiner Meinung nach ist WiX etwas, was man gut benutzen kann, um seine Programme zu verbreiten. Es ähnelt irgendwie Ant. Das einzige, was mich stört, ist die ewige angabe der GUID bei der XML Datei. Wenn man dies allerdings weglässt, schmeißt candle.exe eine Exception ... -- perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="66756e2d736f66742e6465"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"' |