2016-09-22 4 views
1

J'utilise NSIS pour générer des gestionnaires d'exécutables.Générer une archive zip à la place de l'exécutable avec NSIS

Actuellement, le contenu de ces produits pré-packagés peut être personnalisé par le développeur qui génère le programme d'installation. Pour cela, j'ai créé plusieurs scripts .nsh, un par composant, et un script .nsi qui utilise des composants pour créer l'exécutable.

On m'a récemment demandé d'offrir un fichier .zip simple en plus des conditionneurs .exe. Pour éviter la duplication de code et assurez-vous que le programme d'installation généré .zip et .exe partagent le même contenu, je voudrais utiliser les mêmes composants de scripts .nsh pour créer une archive .zip au lieu d'un exécutable.

Je pensais que ce pourrait être facile car .exe généré par NSIS peut être ouvert avec 7zip, et est essentiellement une archive, mais je ne pouvais pas trouver comment.

Savez-vous si c'est faisable?

Répondre

0

7-zip a inversé le format NSIS, mais comme NSIS est basé sur un script, les résultats ne sont pas parfaits.

Je recommande que vous donnez à votre installateur un mode d'extraction spécial:

Setup.nsi

Name "Test" 
OutFile "Test.exe" 
RequestExecutionLevel user 
InstallDir "c:\some\path\Test" 

Page Components 
Page Directory 
Page InstFiles 

Section "Required program files" INSTSEC_MAIN 
SectionIn RO 
SetOutPath $InstDir 
File "/oname=$InstDir\MyApp.exe" "${__FILE__}" 
SectionEnd 

Section "Documentation" 
SetOutPath $InstDir\Docs 
File "/oname=$InstDir\Docs\Foo.txt" "${__FILE__}" 
File "/oname=$InstDir\Docs\Bar.txt" "${__FILE__}" 
SectionEnd 

Section -Uninstaller INSTSEC_UNINST 
WriteUninstaller "$InstDir\Uninst.exe" 
#WriteRegStr ... 
SectionEnd 

Section -un.Uninstaller 
Delete "$InstDir\Docs\Foo.txt" 
Delete "$InstDir\Docs\Bar.txt" 
RMDir "$InstDir\Docs" 
Delete "$InstDir\MyApp.exe" 
Delete "$InstDir\Uninst.exe" 
RMDir "$InstDir" 
#DeleteRegKey ... 
SectionEnd 

!include LogicLib.nsh 
!include FileFunc.nsh 
!include Sections.nsh 
Function .onInit 
${GetParameters} $0 
ClearErrors 
${GetOptions} "$0 " "/X" $1 
${IfNot} ${Errors} 
    SetSilent silent 
    !insertmacro UnselectSection ${INSTSEC_UNINST} ; Don't include uninstaller in .zip file 
${EndIf} 
FunctionEnd 

MakeZip.cmd

@echo off 
setlocal 
set OUTPUT=%~dp0test.zip 
set INSTALLER=%~dp0test.exe 
set SEVENZIP=7z.exe 
set TMPROOT=%temp%\tmpinst%RANDOM%%RANDOM% 

call "%INSTALLER%" /X /D=%TMPROOT% && (
    call "%SEVENZIP%" a "%OUTPUT%" -tzip -mx9 -r "%TMPROOT%\*" 
    rmdir /S /Q "%TMPROOT%" 
) 

Note: Si vous êtes en utilisant RequestExecutionLevel admin dans votre .nsi puis vous devez exécuter le fichier batch até.