NSIS рекурсивный файл журнала - PullRequest
4 голосов
/ 08 декабря 2011

Рассказ

Привет всем,

Есть ли способ рекурсивного перемещения каталога с NSIS во время компиляции?

Спасибо


Длинная история

Привет всем,

Я пытаюсь создать установщик с NSIS для программного обеспечения, которое я разрабатываю.Устанавливаемая нами система сборки создает папку со всем необходимым для запуска этого программного обеспечения в Windows (библиотеки DLL, исполняемые файлы, изображения, библиотеки, примеры и т. Д.).В этой папке +400 файлов и папок.С HM NIS Edit можно было сгенерировать последовательность «File» и «SetOutPath», необходимую для установки всего контента, но она просто огромна, уродлива, и если некоторые файлы добавляются или удаляются, то мы должны изменить скрипт вручную.

Итак ... мы удалили сгенерированную последовательность «File» и «SetOutPath» и просто добавили:

File /r "C:\path\to\output\dir"

Отлично работает ... но теперь у нас проблема с деинсталляторомпотому что мы не можем сделать это:

RMDir /r $INSTDIR

Потому что это опасно (как указано здесь: http://nsis.sourceforge.net/Docs/Chapter4.html#4.9.1.8).

Итак, мы попытались выполнить приведенную там рекомендацию: http://nsis.sourceforge.net/Uninstall_only_installed_files

Это решение создает журнал, в котором NSIS записывает все выполненные операции «Файл» и «SetOutPath», поэтому он может откатиться (удалить) при удалении. Проблема в том, что включенные макросы не поддерживаютрекурсивная опция «Файл».

Я пытался реализовать рекурсивную версию, рекурсивно гуляя по папке, но я думаю, что я делаю это неправильно (ну, я почти уверен: P):

!include "RecFind.nsh"

Section "Principal" SEC01
  ${SetOutPath} "$INSTDIR"
  SetOverwrite try

  ${RecFindOpen} "..\executable" $R0 $R1
   DetailPrint "Looking into directory: $R0"
   ${SetOutPath} "$R0"
  ${RecFindFirst}
   DetailPrint "Looking file: $R0\$R1"
   ${File} "$R0" "$R1"
  ${RecFindNext}
  ${RecFindClose}

Используя это http://nsis.sourceforge.net/RecFind:_Recursive_FindFirst,_FindNext,_FindClose Но я думаю, что это работает только во время установки.

Решение, которое я нашел до сих пор, заключается в создании сценария установщика с файлом NSIS, используемым в качестве шаблона (с некоторым заполнителемтокен для списка «Файл» и «SetOutPath»), сценарий Python, который проходит по выходному каталогу и создает необходимую последовательность «Файл» и «SetOutPath», а затем записывает окончательный сценарий NSIS ... но я действительно неt like it: S

Итак, мой вопрос:

Есть ли способ рекурсивного перемещения каталога с NSIS во время компиляции?

(Или как мне добитьсяэто только с NSIS?).

Заранее спасибо.

С уважением

Ответы [ 2 ]

3 голосов
/ 08 декабря 2011
!ifdef GENFILELIST
outfile "${GENFILELIST}.exe"
requestexecutionlevel user
silentinstall silent
Var ins
Var uns
Function ProcessDir
Pop $R1 ;reldir
Pop $R0 ;absdir
Push $0
Push $1
FileWrite $ins 'Push $$Outdir$\n'
FileWrite $ins 'SetOutPath "$$instdir\$R1"$\n'
FindFirst $0 $1 "$R0\*"
loop:
    StrCmp "" $1  done
    StrCmp "." $1 next
    StrCmp ".." $1 next
    IfFileExists "$R0\$1\*.*" 0 processfile
        Push $R0
        Push $R1
        Push "$R0\$1"
        Push "$R1$1\"
        call ProcessDir
        Pop $R1
        Pop $R0
        goto next
processfile:
    FileWrite $ins 'File "${SRCDIR}\$R1$1"$\n'
    FileWrite $uns 'Delete "$$instdir\$R1$1"$\n'
next:
    FindNext $0 $1
    Goto loop
done:
FindClose $0
FileWrite $uns 'RMDir "$$instdir\$R1"$\n'
FileWrite $ins 'Pop $$Outdir$\n'
Pop $1
Pop $0
FunctionEnd
section
FileOpen $ins "${GENFILELIST}ins" w
FileOpen $uns "${GENFILELIST}uns" w
Push "${SRCDIR}"
Push ""
call ProcessDir
sectionend
!else
!tempfile FILELIST
!system '"${NSISDIR}\makensis" -NOCD "-DGENFILELIST=${FILELIST}" "-DSRCDIR=.\myfiles" "${__FILE__}"' = 0
!system '"${FILELIST}.exe"' = 0
!delfile "${FILELIST}"
!delfile "${FILELIST}.exe"

### Main script starts here ###

outfile test.exe

page directory
page instfiles

section
SetOutPath $instdir
WriteUninstaller "$instdir\uninst.exe"
!include "${FILELIST}ins"
!delfile "${FILELIST}ins"
sectionend

section uninstall
!include "${FILELIST}uns"
!delfile "${FILELIST}uns"
Delete "$instdir\uninst.exe"
RMDir "$instdir"
sectionend

!endif

При этом используется! System для генерации установщика без вывода сообщений, и при запуске этого установщика без вывода сообщений он генерирует текстовые файлы с помощью команд «Файл» и «Удалить» (настоящий скрипт установщика!) Включает их для выполнения команд установки / удаления.

Вы можете использовать! System для выполнения чего угодно, командного файла, хоста сценариев Windows, Python и т. Д.

0 голосов
/ 24 февраля 2014

Вы были на правильном пути.

Вместо этого используйте этот набор скриптов.

http://nsis.sourceforge.net/Advanced_Uninstall_Log_NSIS_Header

Позволяет использовать рекурсивную функциональность функции «Файл» и создает для вас журнал удаления.

...