logo

한국어

NSIS-Sections

관리자 2010.04.17 23:06 조회 수 : 42

지금까지 이용했던 예제를 보면 전부 Section 이라는 항목이 있었을 것이다. function이나 page 처럼 이것도 마찬가지로 SectionEnd로 끝이 나는데, NSIS로 스크립트를 만들게 되면 무조건 한 개 이상의 section이 있어야 한다. 각 section은 명령어를 하나도 포함하지 않아도 되며, 스크립트에 있는 순서데로 실제로 실행이 된다. 그리고 ComponentText가 셋팅되어 있으면, 사용자가 각각의 section을 보여줄 것인지의 여부를 결정할 수 있다. 그리고 section의 이름이 "Uninstall" 이나 접두어로 "un." 이 있으면 언인스톨러의 section임을 기억해야 한다.

Section Commands

  1. AddSize size_kb


이 명령어는 Section 안에서만 기능을 하며, Section 밖에서는 아무런 기능을 하지 못한다. 이 명령어는 인스톨러에게 현재 section은 추가로 "size_bk" 만큼의 kbytes 의 디스크 여유분이 더 필요함을 알리는 명령어 이다.

  1. Section [/o] [([!]|[-])section_name] [section_index_output]


새로운 section을 시작하는 명령어이다. section 이름을 주지 않거나, '-'로 시작하는 경우에는 숨겨진 section으로 사용자가 사용 못하도록 할 수가 없다. section 이름이 'Uninstall' 이거나 'un.' 으로 시작하는 이름이면 언인스톨러 section이다. section_index_output 이 지정되어 있으면, 파라메터가 section 인덱스와 함께 !defined로 정의된다. 만약 section 이름이 '!'로 시작되면 section 이름은 볼드체로 보여 진다. '/o' 스위치가 지정되면 section은 기본적으로 실행되지 않는다.

  1. # set the name of the installer
  2. outfile "section.exe"
  3.  
  4. Section test1 sec1_id
  5. SectionEnd
  6.  
  7. Section
  8. SectionEnd
  9.  
  10. Section test2 sec2_id
  11. SectionEnd
  12.  
  13. Function .onInit
  14.   SectionGetText ${sec1_id} $0
  15.   SectionGetText ${sec2_id} $1
  16.  
  17.   MessageBox MB_OK "name of ${sec1_id}:$\n$0$\nname of ${sec2_id}:$\n$1"
  18. FunctionEnd

다른 옵션이나 스위치는 신경쓰지 말고 section_index_output 을 보자. 위 코드를 실행시키면 옆과 화면 결과를 보여 준다. Section은 기본적으로 위에서 부터 아래로 순서되로 실행된다. 그리고 순서는 0부터 값을 가진다. sec1_id이 0을 가지며, sec2_id는 2를 가지게 된다. 또한 .onInit 함수안에서 보는 것처럼 SectionGetText 명령어로 Section의 이름을 받아 올 수도 있다. 여기서 주의할 것은 이런 Section Index를 이용할려면 이용할려는 Section이 전부 이 section index를 사용하는 명령어보다 먼저 나와야 한다. 만약 위 코드에서 Function .onInit 이 Section test1 sec1_id 보다 먼저 나오면 에러가 뜬다. 따라서 꼭 순서를 잘 지켜서 사용해야 한다.



  1. SectionEnd

Section의 끝을 알리는 명령어 이다. 항상 Section과 짝을 지어 다녀야 함.

  1. SectionIn insttype_index [insttype_index] [R0]


InstType 명령어로 인스톨 타입을 줄때 어떤 인스톨 타입에 포함될 것인지 결정하는 명령어이다. InstType은 첫번째부터 1, 2 순서로 인덱싱된다.

  1. SectionGroup [/e] section_group_name [index_output]
  2.  
  3. 여러 개의 section을 묶어서 그룹으로 만들 수 있다. SectionGroup으로 그룹을 만들 경우 반드시 SectionGroupEnd로 묶어야 한다. 그리고 내부에 반드시 한 개 이상의 section이 포함되어 있어야 한다. section과 마찬가지로 이름이 '!'로 시작되면 볼드체로 보여 주며, 'un.'으로 이름을 시작하면 언인스톨러에 포함된다.
  4.  
  5. [CODE type=nsis]SectionGroupEnd


SectionGroup 으로 시작되면 반듯이 마지막은 SectionGroupEnd로 끝내야 한다.


Uninstall Section
언인스톨러를 만들려면 'Uninstall' 이라는 이름을 가지는 section을 만들어야 한다. 이 section에서는 인스톨러에 의해서 복사된 파일들이나 레지스트리등을 깨끗하게 지우는 역할을 하게 된다.

  1. Section "Uninstall"
  2.   Delete $INSTDIR\Uninst.exe
  3.   Delete $INSTDIR\myApp.exe
  4.   RMDir $INSTDIR
  5.   DeleteRegKey HKLM SOFTWARE\myApp
  6. SectionEnd


위 코드를 보면 2번째줄에 자기자신을 지우는 명령어가 있다. 이것이 가능한 이유는 NSIS로 만들어진 언인스톨러는 자기 자신을 시스템의 temporary 디렉토리에 복사한 후에 실제로 실행을 하므로 지우는게 가능하다.

또 한 주의 깊게 볼 것은 $INSTDIR이 꼭 프로그램이 인스톨 된 경로를 가지고 있는게 아니고, 실제로 실행될때는 언인스톨러가 있는 디렉토리를 저장하고 있다는 점을 명시해야 한다. 즉 언인스톨러를 프로그램이 인스톨된 곳과 다른 곳에 인스톨하게 되면 $INSTDIR은 프로그램이 인스톨 된 곳을 저장하지 않으므로 인스톨러에서 적당한 위치(레지스트리등)에 표시해서 언인스톨러에게 위치를 알려 줘야 한다. 일반적인 경우 언인스톨러는 프로그램 폴더에 같이 인스톨 되므로 크게 신경쓸 필요는 없다.