NSIS: Совсем коротко про секции
Секции - это удобный механизм, позволяющий обеспечить пользователю выбор компонентов программы, если такие присутствуют. В каждой секции можно создавать свои ярлыки, распаковывать файлы, и производить любые другие действия, практически независимо от других секций. Естественно, значения переменных, измененные в одной секции, в других тоже будут изменены, потому что в NSIS все переменные глобальные.
Для самого простого выбора компонентов в NSIS, необходимо вставить в скрипт, перед, собственно, описанием секции, следующий код:
ComponentText "Какой-то текст"
, например:ComponentText "Choose which features of ${APPNAMEANDVERSION} you want to install."
Естественно,
${APPNAMEANDVERSION}
должна быть заранее определена:!define APPNAME "SectionsExample"
!define APPNAMEANDVERSION " SectionsExample 0.1"
Окно инсталлятора с выбором компонентов
В любом NSIS-скрипте должна быть создана хотя бы одна секция, иначе компилятор будет ругаться, и файл установщика не создаст. В самом простом случае, когда не требуется выбор компонентов, создается единственная секция без названия:
Section
DetailPrint "Hello, world!"
SectionEnd
Примечание: После конструкции
Section
идет имя секции, заключенное в кавычки. Если кавычки пропустить, то имя секции будет некорректным, и неверно отобразится в окне выбора компонентов. Попробуйте вставить следующий код в пример, и посмотрите, как он будет работать. Ссылка на пример в конце заметки.Section Component 4
; Wrong section description
SetOverwrite on
DetailPrint "Component #4 installing..."
SectionEnd
Для чего? Например, у нас есть программа, у которой, в свою очередь есть основные компоненты, например экзешник и DLL, а также дополнительные, которые можно устанавливать, а можно и не устанавливать. И если уж пользователь хочет поставить наше приложение, то он должен установить хотя бы основные компоненты.
Для того, чтобы заблокировать чекбокс, прописываем в начале секции конструкцию:
SectionIn RO
Section "Main Program and components"
; Checkbox select and disable user changes
SectionIn RO
SetOverwrite on
DetailPrint "Main program installing..."
SectionEnd
Для этого ничего делать не надо, только определить секцию с именем в кавычках и дефольными настройками. Пользователь может деактивировать checkbox (снять галочку) в окне выбора компонентов.
Section "Component #2"
; Checkbox enabled by default & user will change it state
SetOverwrite on
DetailPrint "Component #2 installing..."
SectionEnd
Наверное, самый частый вопрос, задаваемый, что в рунете, что в Интернете вообще, по поводу NSIS. Так вот, ларчик открывается просто. Достаточно после
Section
поставить специальный флаг /o
.Пользователь также сможет активировать checkbox (галочку), если ему нужно будет установить данный компонент.
Section /o "Component #3"
; Checkbox disabled by default & user will change it state
SetOverwrite on
DetailPrint "Component #3 installing..."
SectionEnd
Такие секции не будут отображены в окне выбора компонентов. Их названия пишутся без кавычек и без пробела, а перед названием ставится знак "
-
". Код в таких секциях будет выполнен в любом случае, независимо от желания пользователя:Section -HiddenSection
DetailPrint "This is a hidden section"
DetailPrint "This code running anyway."
SectionEnd
К ним, наверное, относится одна -
Uninstall
, ну и еще не совсем секция, а встроенная функция, которую можно переопределить, дописав свой код, т.е. что-то типа обработчика событий в "больших" языках, например в C#О секции
Uninstall
и рассказывать особо не надо, кроме ремарки, что в секции Uninstall
"забываются" все значения глобальных переменных и значение переменной $INSTDIR
На GitHub
Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2019/07/31/nsis-s