engineering/System Eng.2007. 3. 6. 19:40
출처 : http://www.cipher.pe.kr/tt/cipher/107



NSIS 로 인스톨러를 만들면 각각의 페이지를 만드는 것이다. 각 페이지가 모여서 전체적인 인스톨 프로그램을 구성하게 된다. 주로 많이 접하는 페이지가 라이센스 동의에 대한 페이지나 인스톨할 디렉토리 선택등을 알 수 있다. 물론 사용자 구성/작성 페이지를 추가 할 수도 있다. 스크립트를 사용해서 이런 페이지의 순서를 변경할 수도 있으며, 특정한 정보를 제공할때 한 페이지에만 머무르도록 할 수도 있다.

페이지에 관련된 기본적인 명령어는 Page, UninstPage 이다. 첫번째 명령어는 페이지를 인스톨 프로그램에 추가하는 것이고, 두번째는 언인스톨 프로그램에 페이지를 추가하는 것이다. 또 다른 명령어로는 PageEx 가 있다. Ex가 의미하는바가 Extension을 의미하는 것이므로 Page 명령어 보다 더 자세하게 셋팅을 할 경우 사용하는 명령어 이다.

1. 페이지 순서

페이지 순서는 스크립트에서 Page, UninstPage, PageEx 가 나타나는 순서대로 페이지가 실제로 보여지게 된다. 예를 들어

  1. Page license
  2. Page components
  3. Page directory
  4. Page instfiles
  5. UninstPage uninstConfirm
  6. UnistPage instfiles


위의 코드를 이해해 보자면, 인스톨 프로그램에서 제일 먼저 라이센스 관련된 페이지, 컴포넌트 선택하는 페이지, 인스톨 디렉토리 선택 페이지, 마지막으로 인스톨 로그를 보여주는 페이지를 보여 주라는 얘기이다. 그리고 언인스톨 프로그램에서 처음에는 언인스톨 할건지 확인하는 페이지를 보여 주고, 마지막으로 언인스톨 되는 파일에 대한 로그를 보여 주라는 얘기이다.

NSIS 스크립트에서 예전 버전과의 호환성 때문에 Page 명령어가 없을 경우 license, components, directory, instfiles등이 자동으로 포함된다. 물론 각 페이지를 만들기 위한 정보가 제공될 경우 이다. license의 경우 LicenseText와 LicenseData가 지정되어 있어야 하며, directory 페이지의 경우 DirText가 지정되어 있어야 하는 등을 말한다.

2. 페이지 옵션

각 페이지는 페이지를 포함하기 위한 각각의 정보를 필요로 한다.

License page

  1. LicenseText [text [button_text] ]

- text에 적히는 내용이 페이지 위쪽에 라이센스 아이콘 옆에 적히는 글이다. [button_text] 의 경우 라이센스 동의 시에 누르는 "I Agree" 대신에 쓰여질 글을 적는 부분이다.
  1. LicenseData (txt|rtf)

- 라이센스에 사용할 파일을 표시한다. 이 데이타가 없는 경우 라이센스 페이지는 표시되지 않는다. 만약 각 언어마다 다른 라이센스 파일을 추가 하고자 할때는 LicenseLangString 을 이용한다. LicenseLangString은 다중 언어 설명에서 더 자세하게 설명하겠다.
  1. LicenseForceSelection (checkbox [accept_text] | radiobuttons [accept_text] [decline_text] | <b>off</b>)

- 라이센스에 동의하겠다는 라디오 버튼이나 체크 박스를 표시하여서 선택하지 않으면 "next" 버튼을 활성화 시키지 않는 옵션이다.

단순히 설명만 보면 잘 모를 수도 있으니 아래와 같은 스크립트를 작성하여서 컴파일하여 실행시켜 보자. 아래 그림과 같이 창이 나오게 된다. Page에 대한 내용을 적어 주지 않아도 디폴트로 라이센스 페이지가 가장 먼저 나오므로 아래와 같이 된다. 아래 코드를 보면 위에 설명한 내용이 어떤 내용을 말하는지 이해가 될것이다. LicenseForceSelection 에서 "위 라이센스에 동의 합니다"와 같이 사용자가 글을 직접 쓸 수도 있고, "" 라고 쓰면 디폴트 값이 쓰여지게 된다. 하나 생각할 것은 license.dat 파일에서 http로 주소를 적으면 자동으로 하이퍼링크가 걸려서 라이센스 파일에서 보여 준다는 것이다.

  1. # set the name of the installer
  2. outfile "pages.exe"
  3. # set license data file
  4. LicenseText "라이센스 동의해 주세요~~~ " "동의"
  5. LicenseData ".\license.txt"
  6. LicenseForceSelection checkbox "위 라이센스에 동의 합니다."
  7. # create a default section.
  8. section
  9. sectionEnd

사용자 삽입 이미지



Component selection page
  1. ComponentText [text [subtext] [subtext2]]

- 컴포넌트 페이지에 쓰여지는 디폴트 글을 바꾸는 옵션이다.
  text : 인스톨 아이콘 옆에 쓰여지는 글 이다. 일종의 제목 글로 생각하면 되겠다.
  subtext : 인스톨 타입 선택 옆에 쓰여지는 글이다.
  subtext2 : 인스톨 타입 아래에 쓰여지는 글이다.
여기에 쓰이는 텍스트는 변수 형태로 미리 써서 포함 시킬 수도 있다. 이해 하기가 어려우니 위에 쓴 코드를 확장해서 아래와 같이 만들어서 사용해 보자. 컴포넌트는 Section의 개념이 포함되므로 일단 여기서는 어떻게 쓰는지만 보고 Section의 내용을 보고 전체적으로 다시 만들어 보자.

  1. # set the name of the installer
  2. outfile "pages.exe"
  3. LicenseText "라이센스 동의해 주세요~~~ " "동의"
  4. # set license data file
  5. LicenseData ".\license.txt"
  6. LicenseForceSelection checkbox "위 라이센스에 동의 합니다."
  7. ComponentText "필요한 컴포넌트를 인스톨 합니다." \
  8.               "내부적인 소제목입니다." "인스톨 하는 설명을 자세하게 여기에 씁니다."
  9. # create a default section.
  10. section
  11. sectionEnd
  12. section "Component1"
  13.         MessageBox MB_OK "You select component1"
  14. SectionEnd
  15. Section "Component2"
  16.         MessageBox MB_OK "You select component2"
  17. SectionEnd

사용자 삽입 이미지

위의 코드와 실행했을때 나오는 화면을 보면 각각이 어떤 역활을 하는지 충분히 이해 할 수 있을 것이다.


Directory selection page

  1. DirText [text] [subtext] [browse_button_text] [browse_dlg_text]

- 인스톨할 디렉토리를 선택하는 페이지를 포함할 경우 그 디렉토를 셋팅하는 페이지에 대한 옵션을 줄 수 있다.
  text : 인스톨 아이콘 옆에 쓰여지는 제목이라고 볼 수 있다.
  subtext : 디렉토리 선택 페이지에 보여지는 글이다.
  browse_button_text : 다른 디렉토리를 선택할때 클릭하는 버튼에 적히는 텍스트 이다.
  browse_dlg_text : 다른 디렉토리를 선택하기 위해 버튼을 클릭한 후 나온 다이얼로그에 적히는 글이다.
디폴트 값을 이용하고자 할 경우에는 "" 로 자리를 차지하면 되겠다. 글을 보면 좀 이해하기가 힘들겠지만, 코드와 함께 실행된 화면을 보면 이해할 거라고 생각한다.

  1. # set the name of the installer
  2. outfile "pages.exe"
  3. LicenseText "라이센스 동의해 주세요~~~ " "동의"
  4. # set license data file
  5. LicenseData ".\license.txt"
  6. LicenseForceSelection checkbox "위 라이센스에 동의 합니다."
  7. ComponentText "필요한 컴포넌트를 인스톨 합니다." \
  8.               "내부적인 소제목입니다." "인스톨 하는 설명을 자세하게 여기에 씁니다."
  9. DirText "인스톨 할 디렉토리 선택 창입니다." "본 프로그램을 인스톨 할 디렉토리를 선택해 주십시오." \
  10.         "클릭해줘!" "디렉토리 선택하는 다이얼로그 설명입니다."
  11. # create a default section.
  12. section
  13. sectionEnd
  14. section "Component1"
  15.         MessageBox MB_OK "You select component1"
  16. SectionEnd
  17. Section "Component2"
  18.         MessageBox MB_OK "You select component2"
  19. SectionEnd


위 스크립트를 컴파일하고 실행한 후, 라이센스를 동의하고 컴포넌트 선택하고 나면 아래와 같이 디렉토리 선택하는 윈도우가 나오고, "클릭해줘!" 라는 버튼을 클릭하면 실제로 디렉토리를 선택할 수 있는 창이 나온다. 위 코드에서 사용한 문자열과 실제로 어떻게 화면에 출력되는지 확인을 해보면 되겠다.
사용자 삽입 이미지


  1. DirVar user_var

- 일반적으로 디렉토리를 선택할 경우에 $INSTDIR에 그 값이 저장된다. 만약 사용자가 선택한 폴더와 디폴트 폴더 모두 사용하고자 하면 이 명령어를 써서 사용자가 선택한 변수에 선택한 디렉토리를 저장할 수 있게 된다. 이 명령어는 반드시 PageEx 내에서만 사용해야 한다. 예제는 밑에 있는 한 가지 옵션을 더 보고 동시에 셋팅한 예제를 보겠다.

  1. DirVerify auto|leave

- 이 명령어는 기본적으로 사용하지 않아도 auto로 셋팅되어 있다. 이 옵션은 인스톨 할 디렉토리가 제대로 되어 있지 않던가, 디스크에 프로그램을 인스톨 할 여유 공간이 없을 경우 next 버튼이 활성화되지 않게 된다. 하지만 이 명령어를 사용해서 leave로 하게 되면 이러한 체크에 상관없이 항상 next 버튼이 활성화 되게 된다. 일반적으로는 사용할 필요가 없는 그런 옵션이다.

아래 예제 코드를 살펴 보자. 이제 코드가 좀 복잡해 진것 처럼 보이지만, 앞의 코드를 약간 수정한 내용이다. 먼저 봐야 할 부분이 19째 줄부터 보면 PageEx~PageExEnd 가 있다. DirVar의 기능을 보여 주기 전에 먼저 보여 줄것이 있어서 코드 자체를 주석 처리해 놓았다. 6번째 줄을 보면 InstallDir 명령어가 있는데, 이 명령어는 $INSTDIR에 문자열을 포함시키는 역할을 한다. 디폴트로 여기로 인스톨 하겠다는 디렉토리를 정하는 명령어 이다. 아래의 코드를 실행 시키면 인스톨 디렉토리를 선택하는 부분에 6번째 줄에 있는 디렉토리로 디폴트 값이 저장되게 된다. 디렉토리 페이지에서 이 디폴트 값을 보여 주는 역할을 한다. 아래 그림과 같이 나오게 된다. PageEx 명령어를 쓰게 되면 디폴트로 license 페이지부터 보여 주던 것을 더 이상 보여 주지 않고 directory 페이지만 보여 주므로 명시적으로 라이센스부터 끝까지 페이지를 보여 주기 위해서 17번째 줄에서 22번째 줄까지 직접 page 를 삽입했다. 앞에서 봤듯이 이 페이지의 순서는 적혀 있는 순서이므로 나중에 순서를 바꾸어서 한번 테스트 해보기 바란다.
  1. # set the name of the installer
  2. outfile "pages.exe"
  3. Var ANOTHER_DIR
  4. InstallDir "$PROGRAMFILES\testing"
  5. LicenseText "라이센스 동의해 주세요~~~ " "동의"
  6. # set license data file
  7. LicenseData ".\license.txt"
  8. LicenseForceSelection checkbox "위 라이센스에 동의 합니다."
  9. ComponentText "필요한 컴포넌트를 인스톨 합니다." \
  10.               "내부적인 소제목입니다." "인스톨 하는 설명을 자세하게 여기에 씁니다."
  11. DirText "인스톨 할 디렉토리 선택 창입니다." "본 프로그램을 인스톨 할 디렉토리를 선택해 주십시오." \
  12.         "클릭해줘!" "디렉토리 선택하는 다이얼로그 설명입니다."
  13. Page License
  14. Page Components
  15. PageEx directory
  16. #       DirVar $ANOTHER_DIR
  17. PageExEnd
  18. Page instfiles
  19. # create a default section.
  20. section
  21. MessageBox MB_OK "$INSTDIR" # , $ANOTHER_DIR"
  22. sectionEnd
  23. section "Component1"
  24.         MessageBox MB_OK "You select component1"
  25. SectionEnd
  26. Section "Component2"
  27.         MessageBox MB_OK "You select component2"
  28. SectionEnd


사용자 삽입 이미지


DirVar 의 기능을 보기 위해서 먼저 아래 코드에서 20번째줄에 있는 주석 표시를 지우고, 28번째 줄을 [code type=nsis]MessageBox MB_OK "$INSTDIR, $ANOTHER_DIR"[/CODE] 로 변경해 보자. 실행시키면 directory 페이지에 디폴트 값이 나오지 않는 것을 알 수 있을 것이다. 그리고 디렉토리를 아무거나 선택해 보면 창에 적히는 것이 선택한 디렉토리\testing 으로 나오는 것을 알 수 있을 것이다. 그리고 "Install" 버튼을 클릭해 보면 아래 그림과 같이 $INSTDIR과 $ANOTHER_DIR 모두 다른 값을 가짐을 알 수 있다.
사용자 삽입 이미지

여기서 문제는 디렉토리 페이지에 디폴트 값이 표시 되지 않는 것인데, 이는 DirVar로 선택한 $ANOTHER_DIR가 초기 값을 아무것도 안 가지기 때문이다. 여기에 디폴트 값을 뭔가 주면 되겠다. 어떻게 하면 되는지 한번 고민해 보기 바란다. 간단하게 $ANOTHER_DIR의 초기화를 PageEx~PageExEnd 안에 두면 되지 않겠느냐고 생각할 수도 있지만, PageEx~PageExEnd 안에는 StrCpy 명령어를 쓸 수 없다.

  1. function .onInit
  2.        StrCpy $ANOTHER_DIR "$WINDIR"
  3. functionEnd


위 코드를 그 위에 있는 코드 23번째줄에 삽입하고 실행하면 원하는 데로 되는 것을 알 수 있을 것이다. function에 대해서는 아직 배우지 않았으므로 여기서는 .onInit 에서 필요한 초기화를 해주면 된다는 것만 알고 넘어 가자.

  1. DetailsButtonText [text]

DetailsButtonText는 위에 전체 코드 중에서 22번째 줄에 있는 Page instfiles 대신에 아래 코드로 변경하고 컴파일을 하면 아래 창 처럼 버튼에 적히는 글의 내용이 달라 진다.
  1. CompletedText [text]

CompletedText는 인스톨이 끝났을 경우 "Completed" 라는 것 말고 다른 말을 적을 때 사용한다.

  1. PageEx instfiles
  2.        DetailsButtonText "자세히 보여줘~~"
  3.        CompletedText "끝났당~~"
  4. PageExEnd

사용자 삽입 이미지

위에 있는 DetailsButtonText와 CompletedText는 모두 언인스톨 창에서도 사용할 수 있다. 또 한 DirVar도 마찬가지로 언인스톨시에 사용할 수 있다.

페이지 옵션으로 마지막으로 남은것은 UninstallText가 남아 있다. 이 옵션은 나중에 언인스톨러를 공부할 때 실제로 보도록 하겠다.
Posted by theYoungman