Секции — это удобный механизм, позволяющий обеспечить пользователю выбор компонентов программы, если такие присутствуют. В каждой секции можно создавать свои ярлыки, распаковывать файлы, и производить любые другие действия, практически независимо от других секций. Естественно, значения переменных, измененные в одной секции, в других тоже будут изменены, потому что в 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