Ru-Board.club
← Вернуться в раздел «Программы»

» NSIS (Nullsoft Scriptable Install System)

Автор: Kumga
Дата сообщения: 12.01.2015 02:18
megane68 Если уж очень хотите на NSIS быстренько собирать инсталляторы, загляните на ozone (вы там были), но в другую тему Ссылка. Там найдете программу SFX Creator, которую освоить не составит труда. Ее возможности:
Их много
[more]Возможность создания как полностью silent (скрытых) SFX архивов, так и простых пакетов инсталляторов с графическим интерфейсом
Возможность показать настроенный баннер прогресса распаковки файлов
Возможность показать ваше изображение перед запуском процесса распаковки файлов
Возможность самоудаления архива после распаковки ваших файлов
Возможность создать программу удаления (с добавлением пункта в апплет "Установка и удаление программ")
Возможность блокировки SFX архива от просмотра его содержимого внешними программами (архиваторами)
Возможность установки пароля на архив
Возможность закрыть приложения по точному/части имени окна, по классу окна, по образу процесса
Возможность ожидания запущенных приложений
Возможность проверки операционной системы
Поддержка большинства переменных системных/пользовательских директорий
Поддержка перезагрузки компьютера (по запросу или принудительно)
Создание ярлыков для файлов
Импорт REG-файлов после распаковки файлов
Выполнение приложений
Выполнение операций в реестре (запись/удаление параметров, удаление разделов)
Выполнение файловых операций (копирование/удаление файлов, создание/удаление директорий)
Возможность установить свою иконку на выходной файл
Возможность добавить информацию о версии файла
Возможность выполнить собственные функции, написанные на языке NSIS
Возможность перед распаковкой ваших файлов проверить наличие установленного ПО и выполнить определённые действия, если вас не устравивает результат проверки (например если версия ПО ниже необходимой, можно прекратить
установку и/или показать сообщение пользователю)
Возможность распаковать ваши файлы в каталог, который указан в каком-либо ключе реестра
Регистрация библиотек при распаковке файлов (и возможность отменить регистрацию при удалении приложения)
Возможность при запуске/завершении показать пользователю информационное сообщение
Возможность создавать многотомные архивы
Вы можете создавать пакет инсталлятора с графическим интерфейсом с возможностью выбора внешнего вида интерфейса: Modern UI или Ultra Modern UI, при выборе Ultra Modern UI вы также можете выбрать скин для интерфейса
При создании проекта с графическим интерфейсом, вы можете добавить отображение изображения на задний план
При создании проекта с графическим интерфейсом, вы можете создавать свои группы с компонентами и связывать исполнение команд с вашими компонентами
И многое другое![/more]
Есть внятная простая справка...
Автор: Victor_VG
Дата сообщения: 12.01.2015 02:51
megane68

Загляните в NSIS\Examples и HM NIS - там примеров предостаточно. А так на ощупь вы ничего не освоите. Это метод "мальчиков с длинной отвёрткой" - у них знаний ноль, но они всё знают, а вы хотите научится, а значит нужно читать документацию и разбирать примеры. Иного нам с вами не дано...
Автор: megane68
Дата сообщения: 12.01.2015 12:17
Kumga
Victor_VG
Спасибо огромное за советы.
Буду изучать.
Сейчас надо над интерфейсом поработать, изменить размеры окна, заголовка и т. д.
Автор: Victor_VG
Дата сообщения: 12.01.2015 15:50
megane68

Вы посмотрите примеры как другие решают аналогичные задачи - наверняка иные приёмы работы и вам пригодятся. Зачем придумывать уже известное?
Автор: megane68
Дата сообщения: 12.01.2015 20:07

Цитата:
Вы посмотрите примеры как другие решают аналогичные задачи - наверняка иные приёмы работы и вам пригодятся. Зачем придумывать уже известное?

Да я бы с удовольствием.
Мне вот надо шаблоны для такого сценария:
1. Выбор языка.
2. Окно приветствия.
3. Выбор пользовательских компонентов.
4. Два чекбокса при переключении один остаётся неактивным.
5. Выбор директории.
6. Установка.
7. Завершение с чекбоксом запуском ярлыка.

Из предложенного сценария, по шаблону HM NIS Edit, я реализовал всё кроме 4-ого пункта.
Ну если не считать размеры окна и надписей.

Добавлено:

Цитата:
; Welcome page
!insertmacro MUI_PAGE_WELCOME
; Components page
!insertmacro MUI_PAGE_COMPONENTS
; Directory page
!insertmacro MUI_PAGE_DIRECTORY
; Instfiles page
!insertmacro MUI_PAGE_INSTFILES
; Finish page

Вот как должна обзываться страница у 4-ого пункта после MUI_PAGE_COMPONENTS ?
Кнопки из этого пункта вроде называются RadioButton.
Из прочитанного в Help я понял, что добавляется кастомная страница функцией nsDialogs.
Автор: megane68
Дата сообщения: 13.01.2015 02:56
Подскажите плиз, где копать функцию с условием - если программа распаковывается в директорию отличную от Program Files и Program Files (x86), то удалить такой то файл из "$INSTDIR"?
Автор: Victor_VG
Дата сообщения: 13.01.2015 12:02
megane68

По п.4 я это реализую таким приёмом ( на всплывающие диалоги народ ворчит и справедливо ) - в заголовке скрипта определяем несколько переменных-семафоров и в .onInit ставим их в "0" чтобы исключить любые ложные срабатывания. Затем используем механизмы NSIS с добавлением секций установки группы файлов (в мастере HM NIS), но сами секции у нас будут содержать только команды изменения состояния семафора без каких либо команд установки файлов - они и помогут реализовать логику переключателя. Далее используем установленные нами семафоры для перехода на разные ветки алгоритма. Если надо, то я использую скрытую секцию для анализа срабатывания сенсорных секций и управления состоянием семафоров, а логику по месту пишу...

Добавлено:
megane68

Готовой функции с ходу нет, да и задача решается парой строк StrCmp типа такого:

StrCmp $INSTDIR $PROGRAMFILES next
StrCmp $INSTDIR $PROGRAMFILES64 netx
Delete $INSTDIR\File1
...
Delete $INSTDIR\FileN
next:
Автор: megane68
Дата сообщения: 13.01.2015 14:30
Victor_VG
Фух... Вчера таки добил RadioButton. Оказалось даже не пршлось делать отдельную страничку. Реализовал эту функция на странице компонентов.
Правда я думал, что это круглые точки, а это галочки.


Цитата:
StrCmp $INSTDIR $PROGRAMFILES next
StrCmp $INSTDIR $PROGRAMFILES64 netx
Delete $INSTDIR\File1
...
Delete $INSTDIR\FileN
next:

Ага, спасибо. Буду дальше дожимать.
С наступающим Старым НГ Вас!
Автор: megane68
Дата сообщения: 13.01.2015 16:53
Victor_VG
А что такое в вашем примере "next"?
Функцию Delete FILE я прописал в группе, а вот со StrCmp какая то проблема.
Автор: Victor_VG
Дата сообщения: 13.01.2015 18:21
megane68

next: это метка для перехода. Можно посчитать адрес вручную, но так можно и напутать - сам этом нарывался не раз ибо адреса в NSIS считаются от начала строки команды, например:

goto +4
not
not
StrCmp


равносильно записи:

goto next
not
not
next:
StrCmp

метка и следующая за ней команда имеют один относительный адрес +4.

С StrCmp наверное придётся немного поколдовать, но я смогу точно сказать позднее когда разверну на своей машине ОС - проблемы с драйверами Nec/Renesas µPD720201 - плата довольно капризная и не всегда подхватывается ими. Пришлось винты обнулять.

Автор: megane68
Дата сообщения: 13.01.2015 18:25
Victor_VG
На next NSIS ругался.
Взял из хелпа 0 и +2
Пока файл постоянно удаляется, куда бы не устанавливать.

StrCmp $INSTDIR $PROGRAMFILES +2 0
Delete $INSTDIR\user_profiles_enabled
StrCmp $INSTDIR $PROGRAMFILES64 +2 0
Delete $INSTDIR\user_profiles_enabled


Добавлено:

Цитата:
С StrCmp наверное придётся немного поколдовать, но я смогу точно сказать позднее когда разверну на своей машине ОС

ОК!


Добавлено:
Понял я в чём дело.
Мы даём значение $PROGRAMFILES, но путь установки $PROGRAMFILES\foobar2000.
Отсюда возникает вопрос, как сделать, чтобы в значениях учитывалось наличие в пути $PROGREAMFILES.
Вот так работает:

Цитата:
StrCmp "$INSTDIR" "$PROGRAMFILES\foobar2000" +2 0
Delete $INSTDIR\user_profiles_enabled

Автор: Victor_VG
Дата сообщения: 14.01.2015 11:07
megane68

Цитата:
На next NSIS ругался

А метка перехода next: у вас в коде определена в той же секции или функции? Давайте глянем ваш код и лог ошибки и вместе исправим её. Наверняка там что-то очень простое что именно из-за простоты вы не заметили.

И по поводу путей - NSIS динамически детектит х86 и х64 среды, но пути к удаляемым элементам надо указывать с точностью до каталога к примеру:

команда Delete $INSTDIR\myapp\*.dll

удалит все *.dll в каталоге $INSTDIR\mapp, а вот его можно динамически переопределить в .onInit или позднее через оператор присваивания StrCpy $INSTDIR $INSTDIR\myapp , но
во избежание ошибок я бы иначе поступил:

StrCpy $R2 $INSTDIR\myapp
Delete $R2\*.dll

- тут я учитываю что значения регистров 0 - 9 ($0 -$9) динамически могут изменять и сам NSIS или подключаемые макросы и инклюды, а старшие регистры 11 - 19 ($11 - $19 == $r0 - $r9 == $R0 - $R9) они обычно не трогают.

Вот рабочий код который мне пришлось задействовать для исключения установки 64-х битной SumatraPDF на 32-х битных ОС:

Цитата:
ClearErrors
ReadEnvStr $R0 "PROCESSOR_ARCHITECTURE"
StrCmp $R0 "AMD64" +6
ReadEnvStr $R1 "PROCESSOR_ARCHITEW6432"
StrCmp $R1 "AMD64" +4
MessageBox MB_ICONSTOP|MB_OK "Error!$\n$\nYou cann't install 64-bit version SumatraPDF on 32-bit OS.$\nPlease, restart Setup at the 64-bit version of Windows XP or$\nServer 2003 or later version OS Windows.$\n$\nThanks!" IDOK +1
Quit

он стоит в самом начале функции .onInit() и анализирует переменные среды и гарантирует что программа будет установлена только на платформе AMD64.
Автор: megane68
Дата сообщения: 14.01.2015 14:27

Цитата:
Вот рабочий код который мне пришлось задействовать для исключения установки 64-х битной SumatraPDF на 32-х битных ОС:

Это пока выше моего понимания. )))))
Вообще, мне это для самообразования. Так то устраивает и относительно полный путь, ибо программа 32-х битная, и вряд ли кому то придёт в голову изменять директорию в Program Files.
Но для подстраховки надо будет сделать портабельную установку без прав администратора, тогда она будет невозможна в PF.
Автор: Victor_VG
Дата сообщения: 14.01.2015 16:18
megane68

Ну, тогда у вас времени вагон и маленькая тележка и можно не спеша в доках разобраться.
Автор: megane68
Дата сообщения: 14.01.2015 16:37

Цитата:
Ну, тогда у вас времени вагон и маленькая тележка и можно не спеша в доках разобраться.

Времени как у всех не хватает. Просто пока были праздники, задался целью.
Если бы знать где копать, чтобы не читать весь хелп ища то, что нужно.
Не подскажите через какую функцию устанавливаются права пользователя на установку разных секций?
Сейчас два типа установки: стандартная и портабельная. Права заданы на всё или admin, или user, а нужно для стандартной установки права администратора, а для портативной - пользователя.
Автор: Victor_VG
Дата сообщения: 15.01.2015 16:02
megane68

Эти возможности "из коробки" отсутствуют, но сиё решаемо через вызов плагинов MoreInfo/XTInfo - смотрим вызов IsAdmin и идём по нужной ветке алгоритма.
Автор: megane68
Дата сообщения: 15.01.2015 21:49

Цитата:
MoreInfo/XTInf

Я так понимаю это MoreInfo.dll 1.0.1.2? Есть такая.
Буду копать.
Спасибо!
Автор: Victor_VG
Дата сообщения: 16.01.2015 00:19
megane68

Нет, не MoreInfo, а именно XtInfo и формат вызова тут выглядит так:

Цитата:
xtInfo::IsAdministrator
Pop $Var

плагин вернёт на стеке значение "true" если у пользователя есть права админа, или "false". А само это значение мы получим в той переменной или регистре которые укажем в качестве $Var в команде чтения стека Pop $Var . И что в нём удобно его не надо подключать через оператор Include - достаточно чтобы он лежал в каталоге ./NSIS/plugins и компилятор сам всё что надо сделает.
Автор: megane68
Дата сообщения: 16.01.2015 18:16
Victor_VG
Я пока плохо понимаю логику функций, если нет конкретного примера.
Вот например создал кастомную страницу с RadioButton через функцию Init, но не могу понять как прописать Destroy и привязать обе кнопки к группам.
В хелпе другой пример, который как я не крутил, не подходит. (((

Цитата:

Function fnCustomInit
nsDialogs::Create 1018
Pop $Dialog

${NSD_CreateRadioButton} 0 25u 100u 10u "Standart installation"
Pop $RadioButton

${NSD_CreateLabel} 0 40u 300u 10u "Установить для текущего пользователя этого компьютера."
Pop $Label

${NSD_CreateRadioButton} 0 75u 100u 10u "All users or Portable"
Pop $RadioButton

${NSD_CreateLabel} 0 90u 300u 10u "Установить для всех пользователей этого компьютера."
Pop $Label

nsDialogs::Show
FunctionEnd



Цитата:

Function fnCustomDestroy
${NSD_GetState} $RadioButton $R0
StrCpy $R1 "$R1Состояние флажка:$R0$\n"
MessageBox MB_OK $R1
FunctionEnd
Автор: Victor_VG
Дата сообщения: 16.01.2015 19:52
megane68

Тут можно и без кастомной страницы обойтись т.к. для новичка это слишком сложно - просто создаём установку с выбором секций, а после проверяем кто из них сработал. Позднее поищу вам рабочий пример и сами увидите как это можно сделать. А логику проще сделать используя лист бумаги и таблицу в которую вносим условия и что мы получим, а после строим цепочку сравнений. Чем она выйдет проще тем меньше шанс ошибки в алгоритме.
Автор: megane68
Дата сообщения: 17.01.2015 04:11

Цитата:
Тут можно и без кастомной страницы обойтись т.к. для новичка это слишком сложно - просто создаём установку с выбором секций

Это я просто хотел разобраться как создавать самому страницу, так как на дефолтной странице компонентов я кнопки реализовал через .onSelChange.

Цитата:
А логику проще сделать используя лист бумаги и таблицу в которую вносим условия и что мы получим, а после строим цепочку сравнений. Чем она выйдет проще тем меньше шанс ошибки в алгоритме.

Так и стараюсь делать.

Цитата:
Позднее поищу вам рабочий пример и сами увидите как это можно сделать.

ОК.
Автор: Victor_VG
Дата сообщения: 17.01.2015 06:22
megane68

Я с железяками своими разгребусь и пойду компилеры ставить - вот тогда и залезу в свои старые проекты чтобы дать вам простой, но понятный пример. Не забуду, ну а коли что - или сам по теме гляну, либо вы мне в ПМ напомните. У меня в сети происходит Большое Переселение Железяк что требует определённых усилий, но их конечный результат по идее того стоит.
Автор: megane68
Дата сообщения: 17.01.2015 07:35
Victor_VG
ОК. Через сколько напомнить?
Автор: Victor_VG
Дата сообщения: 17.01.2015 14:06
megane68

Надеюсь быстро разобраться, но многое будет зависеть от наличия у ребят подходящих планок ОЗУ - явно пару корсаров нужно поменять из-за совместимости с платой-мамой.
Автор: FanIT
Дата сообщения: 17.01.2015 16:31
Всем привет. Возникла проблема. При распаковки файлов установщик ругается, что путь распаковки слишком длинный. И правда путь получается больше чем 260 символов. Можно ли обойти это ограничение? К сожалению путь нельзя сократить.
Автор: rooleg
Дата сообщения: 17.01.2015 17:13
последняя версия проги стабильно работает? не глюкавая?
никто ничего случайно не заметел?
Автор: dodakaedr
Дата сообщения: 18.01.2015 19:17
подскажите как перемещать папки с содержимым и при необходимости заменять текущий файл\папка без подтверждения. Так не хочет перемещать:
Код:
Rename $EXEDIR\App\IFX $LOCALAPPDATA
Rename $EXEDIR\App\Set\IFX $APPDATA
Автор: Victor_VG
Дата сообщения: 18.01.2015 19:21
dodakaedr

И не станет, верно - ОС не разрешит. А вы иной приём используйте - вызов CreateDirectory создаст каталог, а файлы можно в него скопировать. Почему бы и нет?
Автор: dodakaedr
Дата сообщения: 18.01.2015 20:42
Victor_VG
требуется именно перемещение. Копировать папку можно и через CopyFiles.
Автор: Sanch8
Дата сообщения: 18.01.2015 20:48
megane68

Пример использования Custom страницы и логика переключения чекбоксов

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364

Предыдущая тема: The Bat!


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.