Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » .: NSIS - все вопросы :. часть 2.

Ответить
Настройки темы
.: NSIS - все вопросы :. часть 2.

Аватара для kotkovets

Ветеран


Сообщения: 1216
Благодарности: 486


Конфигурация

Профиль | Отправить PM | Цитировать


Изменения
Автор: kotkovets
Дата: 07-06-2020
Описание: NSIS 3.05


Данная тема предназначена для обсуждения вопросов, связанных с инсталлятором Nullsoft Scriptable Install System, или просто NSIS. Сайт приложения.


Описание:
читать дальше »
NSIS (Nullsoft Scriptable Install System) - профессиональная система для создания инсталляторов в среде Windows с октрытым исходным кодом. При своем малом размере система очень гибкая, и при с широкими возможностями. Генерируемый ею инсталлятор также имеет очень маленький размер и идеально подходит для распространения продукта через Интернет.


Текущая версия: NSIS 3.05 от 15 декабря 2019 года
Скачать | Архив сборок версии

Первая часть этой темы
Скачать первую часть этой темы одним архивом

ВНИМАНИЕ! прежде, чем задать вопрос, почитайте, где Вы найдете ответы на большинство вопросов:
Справочник по NSIS - создан силами нашего сообщества.
Руководство пользователя. Перевод – Поляков А.В, зеркало

Документация

Утилиты разработчика
Расширение функциональности

Примеры скриптов на нашем форуме
Скрипт NSIS для перепаковки AIMP2+Сборки
Тема для Notepad++(пример парсинга XML)

Достоинства
читать дальше »


◦ Очень маленький размер установочного блока (около 34 Кбайт)
◦ zlib, bzip2 и LZMA-сжатие
◦ Гибкая система скриптов (спецально разработанная для инсталляторов)
◦ Поддержка многоязычности, точнее 53 языка, есть возможность ввода нового языка
◦ Поддержка плагинов
◦ Скрипт Препроцессор
◦ Создание Web-инсталляторов


Ещё немного полезной информации:
читать дальше »

▫ История создания установщика

NSIS создан как альтернатива InstallShield, предназначенного для коммерческих продуктов.

NSIS был создан для распространения Winamp. Он базируется на предыдущем продукте Nullsoft — PiMP (plugin Mini Packager), иначе известным как SuperPiMP. После версии 2.0a0, проект был перемещён на SourceForge.net, где к работе над ним присоединились и сторонние разработчики. NSIS 2.0 был выпущен в свет 2 года спустя.

NSIS версии 1 был очень похож на классический Windows Installer, но он был более управлемым с помощью скриптов и поддерживал другие форматы сжатия. NSIS версии 2 поддерживает новый графический интерфейс пользователя, LZMA-сжатие, многоязычность и имеет хорошую систему плагинов.

Версия 2.01 была первой версией, поддерживающей компиляцию на любой из POSIX-платформ. Это позволило создавать Windows-инсталляторы на GNU/Linux и FreeBSD без использования эмулятора Wine. На данный момент поддерживается компиляция только для Windows.

▫ Описание

Компилятор NSIS — программа makensis — компилирует скрипты в исполняемый код. Каждая строчка скрипта содержит одну команду. Пример:
Код: Выделить весь код
 # Пример скрипта
 Name "Example1"
 OutFile "example1.exe"
 InstallDir "$PROGRAMFILES\Example1"
 Page Directory
 Page InstFiles
 Section
   SetOutPath $INSTDIR
   File ..\makensis.exe
 SectionEnd

Modern User Interface

В версии 2.0 был введён новый графический интерфейс пользователя, названный Modern UI (MUI). MUI очень похож на интерфейс мастеров, он поддерживает splash screen, выбора языка, выбор компонентов для установки и более широкие возможности настройки по сравнению со своим предшественником. Пример:
Код: Выделить весь код
 # Пример скрипта с Modern UI
 !include MUI.nsh
 Name "Example 2"
 OutFile Example2.exe
 !insertmacro MUI_PAGE_WELCOME
 !insertmacro MUI_PAGE_LICENSE "license.rtf"
 !insertmacro MUI_PAGE_DIRECTORY
 !insertmacro MUI_PAGE_COMPONENTS
 !insertmacro MUI_PAGE_INSTFILES
 !insertmacro MUI_PAGE_FINISH
 !insertmacro MUI_LANGUAGE "English"
 !insertmacro MUI_LANGUAGE "German"
 !insertmacro MUI_LANGUAGE "French"
 Section "Extract makensis"
  SetOutPath $INSTDIR
  File ..\makensis.exe
 SectionEnd
NSIS может быть расширен при помощи плагинов, которые могут быть написаны на C++, Си, и Delphi. Плагины могут быть использованы для улучшения функциональности и интерфейса инсталлятора. Плагины могут быть вызваны в любой части кода NSIS скрипта.

С пакетом NSIS поставляются несколько плагинов, позволяющих добавлять новые страницы, заменять фоновые изображения, скачивать файлы из Интернета, выполнять математические вычисления, обновлять файлы и многое другое.

▫ Программы, использующие NSIS


◦ Антивирус Касперского
◦ Qip
◦ 3DNA Desktop
◦ 7-Zip
◦ ATI Display Driver
◦ CDex
◦ Dev-C++
◦ DivX
◦ eMule FileZilla
◦ Google Picasa
◦ Google Talk
◦ Intel C (компилятор)
◦ IrfanView
◦ LightAllow
◦ LyX
◦ Miranda IM Mozilla Firefox 2.0
◦ NASA World Wind
◦ Notepad++
◦ OpenOffice.org для Windows
◦ Pidgin
◦ VLC Player
◦ Winamp

▫ Чем я могу распаковать инсталлятор, созданный в NSIS?

В настоящее время инсталляторы NSIS не могут быть полностью декомпилированы. Сам инсталлятор не содержит в себе никаких функций для того, чтобы извлечь сценарий и/или файлы без инсталляции. Это - выбор разработчика, доступны ли исходный текст и/или файлы для инсталлятора для публики или нет. Есть, однако, внешние инструментальные средства, которые позволяют это сделать. 7-zip поддерживает частичную распаковку NSIS инсталляторов с алгоритмом сжатия lzma или bzip. Так же существует мульти-архивный плагин для TotalCommander.
Небольшая заметка для разработчиков: используйте DCryptDll, если хотите скрыть некоторые файлы в вашей инсталляции.


-------
Спасибо ВСЕМ за то, что тратите свое время, что бы ПОМОЧЬ МНЕ.

Это сообщение посчитали полезным следующие участники:

Отправлено: 12:02, 09-12-2012

 

Аватара для K.A.V.

Ленивый кусок мяса


Contributor


Сообщения: 1986
Благодарности: 723

Профиль | Сайт | Отправить PM | Цитировать


Цитата navab:
Как для каждой из них указать свою директорию? »
Не совсем понятно, что вы имеете ввиду...

Как при отметке определённого компонента изменить каталог установки?
читать дальше »
Код: Выделить весь код
Section /o "Мой компонент"
  StrCpy $INSTDIR "C:\Мой путь"
  SetOutPath "$INSTDIR"
  File "мой файл для упаковки.txt"
SectionEnd

Section /o "Мой компонент 2"
  StrCpy $INSTDIR "C:\Мой путь 2"
  SetOutPath "$INSTDIR"
  File "мой файл для упаковки 2.txt"
SectionEnd


Или как создать для каждого компонента отдельное запоминание папки?
читать дальше »
Код: Выделить весь код
Section /o "Мой компонент"
Var /global MyVarComponent1
  StrCpy $MyVarComponent1 "C:\Мой путь"
  SetOutPath "$MyVarComponent1"
  File "мой файл для упаковки.txt"
SectionEnd

Section /o "Мой компонент 2"
Var /global MyVarComponent2
  StrCpy $MyVarComponent2 "C:\Мой путь 2"
  SetOutPath "$MyVarComponent2"
  File "мой файл для упаковки 2.txt"
SectionEnd

-------
[Справочник по командам Windows] -- [Справочник по NSIS] -- [SFX Creator - для создания SFX архивов]


Отправлено: 12:28, 05-02-2014 | #1001



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 21
Благодарности: 0

Профиль | Отправить PM | Цитировать


K.A.V, нужно чтобы для каждого выбранного компонента пользователь мог сам выбрать путь, просто записать его в скрипте нельзя.
MKN, я так понял это примерно то что нужно, только код приведенный там не компилируется.
PHP код: Выделить весь код

# variables to hold the installation directories 
var Component1Dir 
var Component2Dir 
var Component3Dir 

# components page 
!insertmacro MUI_PAGE_COMPONENTS 

# multiple directory pages 
!define MUI_PAGE_CUSTOMFUNCTION_PRE Component1DirPre 
!define MUI_DIRECTORYPAGE_VARIABLE Component1Dir 
!insertmacro MUI_PAGE_DIRECTORY 

!define MUI_PAGE_CUSTOMFUNCTION_PRE Component2DirPre 
!define MUI_DIRECTORYPAGE_VARIABLE Component2Dir 
!insertmacro MUI_PAGE_DIRECTORY 

!define MUI_PAGE_CUSTOMFUNCTION_PRE Component3DirPre 
!define MUI_DIRECTORYPAGE_VARIABLE Component3Dir 
!insertmacro MUI_PAGE_DIRECTORY 

# The file installation 'page' 
!insertmacro MUI_PAGE_INSTFILES 

# The components (sections) 
Section Component1 
  
# stuff here. Be sure to use the directory variable corresponding 
  # to the directory page used. In this case, for example: 
  
SetOutPath "$Component1Dir" 
    
File "somefile" 
    
File "someotherfile" 
SectionEnd 

Section Component2 
  
# stuff here 
  
SetOutPath "$Component2Dir" 
    
File "somefile" 
    
File "someotherfile" 
SectionEnd 

Section Component3 
  
# stuff here 
  
SetOutPath "$Component3Dir" 
    
File "somefile" 
    
File "someotherfile" 
SectionEnd 

# Functions run before showing each directory page. 
# Here we'll call Abort to stop the page from showing up 
#  if the user didn't select the component 
Function Component1DirPre 
  
# Get the flags for the section 
  
SectionGetFlags ${Component1$R0 
  
# Binary 'and' with value '1' (selected or not) 
  
IntOp $R0 $R0 
  
# If it is not selected 
  
IntCmp $R0 0 0 +
    
# Then Abort. This will prevent the page from showing up 
    
Abort 
  
# Otherwise, continue 
FunctionEnd 

Function Component2DirPre 
  SectionGetFlags 
${Component2$R0 
  IntOp $R0 $R0 

  IntCmp $R0 0 0 
+
    Abort 
FunctionEnd 

Function Component3DirPre 
  SectionGetFlags 
${Component3$R0 
  IntOp $R0 $R0 

  IntCmp $R0 0 0 
+
    Abort 
FunctionEnd 

Error in macro MUI_PAGE_DIRECTORY on line 21

Отправлено: 12:45, 05-02-2014 | #1002


Аватара для K.A.V.

Ленивый кусок мяса


Contributor


Сообщения: 1986
Благодарности: 723

Профиль | Сайт | Отправить PM | Цитировать


Код: Выделить весь код
var Component1Dir 
var Component2Dir 
var Component3Dir 

!insertmacro MUI_PAGE_COMPONENTS 

!define MUI_DIRECTORYPAGE_VARIABLE $Component1Dir 
!insertmacro MUI_PAGE_DIRECTORY 

!define MUI_DIRECTORYPAGE_VARIABLE $Component2Dir 
!insertmacro MUI_PAGE_DIRECTORY 

!define MUI_DIRECTORYPAGE_VARIABLE $Component3Dir 
!insertmacro MUI_PAGE_DIRECTORY 

!insertmacro MUI_PAGE_INSTFILES 






Section TEST1 Component1 
  SetOutPath "$Component1Dir"
#    File "..." 
#    File "..." 
SectionEnd 

Section TEST2 Component2 
  SetOutPath "$Component2Dir" 
#    File "..." 
#    File "..." 
SectionEnd 

Section TEST3 Component3 
  SetOutPath "$Component3Dir" 
#    File "..." 
#    File "..." 
SectionEnd

-------
[Справочник по командам Windows] -- [Справочник по NSIS] -- [SFX Creator - для создания SFX архивов]


Отправлено: 13:23, 05-02-2014 | #1003


Новый участник


Сообщения: 21
Благодарности: 0

Профиль | Отправить PM | Цитировать


я так понимаю, что мы объявляем две константы времени компиляции. В эти переменные заносится результат возвращаемый Component1Dir например, вызывается макрос и вываливается ошибка в самом макросе:
PHP код: Выделить весь код

!ifdef MUI_DIRECTORYPAGE_VARIABLE
      DirVar 
"${MUI_DIRECTORYPAGE_VARIABLE}"
    
!endif 

K.A.V., сделал как Вы написали, всегда выскакивают 3 окна с указанием директории, сколько бы компонентов не было выбрано.

Отправлено: 13:27, 05-02-2014 | #1004


Аватара для K.A.V.

Ленивый кусок мяса


Contributor


Сообщения: 1986
Благодарности: 723

Профиль | Сайт | Отправить PM | Цитировать


Цитата navab:
K.A.V., сделал как Вы написали, всегда выскакивают 3 окна с указанием директории, сколько бы компонентов не было выбрано. »
Я вам дал часть проблемного кода, из-за которого вы получали ошибку компиляции

Код: Выделить весь код
var Component1Dir 
var Component2Dir 
var Component3Dir 

!insertmacro MUI_PAGE_COMPONENTS 

!define MUI_PAGE_CUSTOMFUNCTION_PRE Component1DirPre
!define MUI_DIRECTORYPAGE_VARIABLE $Component1Dir 
!insertmacro MUI_PAGE_DIRECTORY 

!define MUI_PAGE_CUSTOMFUNCTION_PRE Component2DirPre
!define MUI_DIRECTORYPAGE_VARIABLE $Component2Dir 
!insertmacro MUI_PAGE_DIRECTORY 

!define MUI_PAGE_CUSTOMFUNCTION_PRE Component3DirPre
!define MUI_DIRECTORYPAGE_VARIABLE $Component3Dir 
!insertmacro MUI_PAGE_DIRECTORY 

!insertmacro MUI_PAGE_INSTFILES 





Section TEST1 Component1 
  SetOutPath "$Component1Dir"
#    File "..." 
#    File "..." 
SectionEnd 

Section TEST2 Component2 
  SetOutPath "$Component2Dir" 
#    File "..." 
#    File "..." 
SectionEnd 

Section TEST3 Component3 
  SetOutPath "$Component3Dir" 
#    File "..." 
#    File "..." 
SectionEnd 
             

   
Function Component1DirPre 
  SectionGetFlags ${Component1} $R0 
  IntOp $R0 $R0 & 1 
  StrCmp $R0 "1" +2 0
    Abort 
FunctionEnd 

Function Component2DirPre 
  SectionGetFlags ${Component2} $R0 
  IntOp $R0 $R0 & 1 
  StrCmp $R0 "1" +2 0
    Abort 
FunctionEnd 

Function Component3DirPre 
  SectionGetFlags ${Component3} $R0 
  IntOp $R0 $R0 & 1 
  StrCmp $R0 "1" +2 0
    Abort 
FunctionEnd

-------
[Справочник по командам Windows] -- [Справочник по NSIS] -- [SFX Creator - для создания SFX архивов]

Это сообщение посчитали полезным следующие участники:

Отправлено: 14:24, 05-02-2014 | #1005


Новый участник


Сообщения: 21
Благодарности: 0

Профиль | Отправить PM | Цитировать


Спасибо, все работает. Если можно еще пару вопросов, просто хотел бы разобраться:
1.
PHP код: Выделить весь код

StrCmp $R0 "1" +2 0
Abort 

что тут происходит?
2. Попробовал переделать функции таким образом:
PHP код: Выделить весь код

var Component1Dir
var Component2Dir
var Component3Dir

var chek1
var chek2
var chek3

!insertmacro MUI_PAGE_COMPONENTS

!define MUI_PAGE_CUSTOMFUNCTION_PRE Component1DirPre
!define MUI_DIRECTORYPAGE_VARIABLE $Component1Dir
!insertmacro MUI_PAGE_DIRECTORY

!define MUI_PAGE_CUSTOMFUNCTION_PRE Component2DirPre
!define MUI_DIRECTORYPAGE_VARIABLE $Component2Dir
!insertmacro MUI_PAGE_DIRECTORY

!define MUI_PAGE_CUSTOMFUNCTION_PRE Component3DirPre
!define MUI_DIRECTORYPAGE_VARIABLE $Component3Dir
!insertmacro MUI_PAGE_DIRECTORY


!insertmacro MUI_PAGE_INSTFILES

# The components (sections)
Section Component1
  StrLen 
$"$MUI_PAGE_CUSTOMFUNCTION_PRE"
  
SetOutPath "$Component1Dir"
SectionEnd

Section Component2
  
# stuff here
  
SetOutPath "$Component2Dir"
SectionEnd

Section Component3
  
# stuff here
  
SetOutPath "$Component3Dir"
SectionEnd


Function Component1DirPre
  SectionGetFlags 
${Component1$chek3
    MessageBox MB_OK 
"$chek3"
    
${If} $chek3 == 0
    Abort
    
${EndIf}
FunctionEnd

Function Component2DirPre
  SectionGetFlags 
${Component2$chek1
    MessageBox MB_OK 
"$chek1"
    
${If} $chek1 == 0
    Abort
    
${EndIf}
FunctionEnd

Function Component3DirPre
  SectionGetFlags 
${Component3$chek2
    MessageBox MB_OK 
"$chek2"
    
${If} $chek2 == 0
    Abort
    
${EndIf}
FunctionEnd 

Значения chek1-chek3 получаю все время одинаковые, либо все 0, либо все 1, соответственно вывод страниц работает не правильно. Что не так?

Отправлено: 14:40, 05-02-2014 | #1006


Аватара для K.A.V.

Ленивый кусок мяса


Contributor


Сообщения: 1986
Благодарности: 723

Профиль | Сайт | Отправить PM | Цитировать


Цитата navab:
что тут происходит? »
Плохо читали справочник, попробуйте сами разобраться
Справочник по NSIS => Перевод справки NSIS => SectionGetFlags
+
Справочник по NSIS => Перевод справки NSIS => StrCmp

Цитата navab:
2. Попробовал переделать функции таким образом: »
Я же вам сразу дал переделанные части кода, читайте в справочнике, как правильно прописывать секции
Справочник по NSIS => Перевод справки NSIS => Section
У вас секции без индексов (в ссылке, данной MKN изначально код не совсем рабочий), а в моём коде там поправлено, смотрите внимательней

Было (без указаний идентификаторов секций, как у вас сейчас):

Код: Выделить весь код
Section Component3
  # stuff here
  SetOutPath "$Component3Dir"
SectionEnd
В моём коде:
Код: Выделить весь код
Section TEST3 Component3
  SetOutPath "$Component3Dir" 
#    File "..." 
#    File "..." 
SectionEnd

-------
[Справочник по командам Windows] -- [Справочник по NSIS] -- [SFX Creator - для создания SFX архивов]


Отправлено: 14:56, 05-02-2014 | #1007

MKN MKN вне форума

Ветеран


Сообщения: 2355
Благодарности: 557

Профиль | Отправить PM | Цитировать


По моему, идея использовать стандартные страницы PAGE_COMPONENTS для выбора INSTDIR - не удачная...
Ладно, когда компонентов 2-3, а если 10 или более ? Задолбаешься страницы перелистывать и вообще забудешь для какого компонента чего выбрать и уже выбрал...
Такие вещи надо делать на кастомной странице, где всё удобно и наглядно.

Отправлено: 15:11, 05-02-2014 | #1008


Новый участник


Сообщения: 21
Благодарности: 0

Профиль | Отправить PM | Цитировать


Читал и то и другое, я так понял, что полсле опрератора должны идти метки, типа isless, isequal и т.п.
А такая форма
StrCmp $R0 "1" +2 0
означает, что если R0==1, то пропускаем следующую строчку? Но тогда мы просто попадаем на EndFunction, каким образом в этом случае срабатывает механизм отмены показа страницы?
По SectionGetFlags вопросов не было.
Да, идентификаторы я не заметил, а как они влияют на выполнение функций? Мы то вызываем SectionGetFlags ${Component1}, т.е. по имени обращаемся?

MKN, подскажите каким образом это сделать? Про кастом пайдж прочитал в справочнике, но как реализовать не совсем понятно.

Отправлено: 15:26, 05-02-2014 | #1009


Новый участник


Сообщения: 21
Благодарности: 0

Профиль | Отправить PM | Цитировать


и вдогонку, перед !insertmacro MUI_PAGE_COMPONENTS пишу !insertmacro MUI_PAGE_WELCOME - свал,
Error: resolving install function "Nsis2Io" in function "mui.WelcomePre_23.5.9"
Error - aborting creation process

Отправлено: 15:47, 05-02-2014 | #1010



Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » .: NSIS - все вопросы :. часть 2.

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Инфо - [ликбез] Помощь начинающим .:[все вопросы]:. часть 2 dimadr Наборы обновлений для Windows XP/2003/Windows 7 267 14-02-2020 08:25
[архив].: NSIS - все вопросы :. kotkovets Автоматическая установка приложений 3387 09-12-2012 11:56
Инфо - [ликбез] Помощь начинающим .:[все вопросы]:. часть 1 jameszero Наборы обновлений для Windows XP/2003/Windows 7 1491 22-07-2011 22:42
Выбор|модернизация процессора .:[все вопросы]:. Часть I Myxa Выбор отдельных компонентов компьютера и конфигурации в целом 1845 01-01-2011 19:18
Вопросы по создателю инсталляций NSIS MaxDELETE Программное обеспечение Windows 14 04-07-2007 10:01




 
Переход