Pergunta

Estou me preparando para desenvolver meu primeiro instalador do Windows para um jogo que estou desenvolvendo.Ouvi recomendações do NSIS, mas minhas necessidades são básicas e não consigo descobrir o que exatamente é necessário.

Gostaria de um script NSIS curto que pudesse instalar um diretório de arquivos no diretório "Arquivos de Programas" (solicitando permissão, se necessário), criar um atalho simples no menu Iniciar e registrar um desinstalador no painel de controle Adicionar/Remover Programas .

O desinstalador apenas excluiria o diretório e removeria o atalho, solicitando a reinicialização se os arquivos estivessem em uso.

Por fim, gostaria de oferecer suporte às atualizações desinstalando todos os arquivos antigos e instalando novos, solicitando ao usuário que reinicie se os arquivos antigos estiverem em uso.

Eu vi alguns exemplos de scripts NSH on-line que fazem isso;Estou tentando juntá-lo sozinho e parece que terá centenas de linhas.Meu código cheira a coisa errada.

O programa que estou descrevendo realmente deveria ter centenas de linhas de NSH?Certamente existe uma maneira mais fácil?

Foi útil?

Solução

Download Eclipse e depois instale o plugin Eclipsensis no eclipse.Que não só fornece um editor completo para arquivos NSIS (com conclusão de código e todos os semelhantes), mas também tem um assistente para criar o script para você respondendo apenas algumas perguntas (título do aplicativo, íconepara ser usado, ...).

Outras dicas

Isso deve estar bem próximo (não testei este script). Você deve preencher os espaços em branco e substituir certas strings ...

!define Name "Foo"
Name "${Name}"
Outfile "${Name} setup.exe"
RequestExecutionLevel admin ;Require admin rights on NT6+ (When UAC is turned on)
InstallDir "$ProgramFiles\${Name}"

!include LogicLib.nsh
!include MUI.nsh

Function .onInit
SetShellVarContext all
UserInfo::GetAccountType
pop $0
${If} $0 != "admin" ;Require admin rights on NT4+
    MessageBox mb_iconstop "Administrator rights required!"
    SetErrorLevel 740 ;ERROR_ELEVATION_REQUIRED
    Quit
${EndIf}
FunctionEnd

!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"


Section
SetOutPath "$INSTDIR"
WriteUninstaller "$INSTDIR\Uninstall.exe"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Foo By Bar Inc."   "DisplayName" "${Name}"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Foo By Bar Inc."   "UninstallString" "$INSTDIR\Uninstall.exe"
;TODO: Install your files with the File command
CreateShortCut "$SMPROGRAMS\${Name}.lnk" "$INSTDIR\Foo.exe"
SectionEnd

Section "Uninstall"
;TODO: Delete your files
Delete "$SMPROGRAMS\${Name}.lnk"
DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Foo By Bar Inc."
Delete "$INSTDIR\Uninstall.exe"
RMDir "$INSTDIR"
SectionEnd

Um ótimo assistente para NSIS é o HM NIS Edit, que pode guiá-lo através do seu primeiro instalador, incluindo o que você mencionou acima, acredito.

http://hmne.sourceforge.net/

Se você deseja fornecer um atualizador no NSIS, recomendo algumas coisas:

  1. Crie uma maneira para seu aplicativo verificar atualizações do seu servidor, geralmente feito quando ele é carregado pela primeira vez
  2. Baixe o novo instalador e execute-o (no seu aplicativo, embora provavelmente qualquer pessoa também possa obtê-lo no seu site).
  3. Se o seu programa antigo estiver em execução, você precisará desligá-lo.O NSIS possui plug-ins que podem encontrar um processo e eliminá-lo.Isso não é muito 'legal', mas pode ser necessário.

Eu recomendo este plugin de processo

Se você tiver DLLs em uso, não poderá simplesmente excluí-las.No entanto, no NSIS você pode renomeá-los e marcá-los para exclusão na PRÓXIMA reinicialização, assim:

Delete /REBOOTOK file.txt

Em seguida, copie suas novas DLLs para a pasta.

Para o NSIS, há muitos plug-ins, exemplos e muita ajuda, mas aprender o idioma leva um pouco de tempo.Inno é muito mais fácil de aprender, mas mais difícil de personalizar quando você chega ao âmago da questão.No entanto, eu diria que os dois são comparáveis ​​em geral e qualquer um deles deve funcionar bem.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top