|
'NSIS'에 해당되는 글 3건
[Yuno.org, 2010/03/27 02:27, Programming/Code Story]
예전에 NSIS를 이용 할 경우 대용량 파일을 배포 할때 오류가 나는 문제에 대해서 포스팅을 한 적이 있다. (자세한 내용은 http://www.yuno.org/295 을 참고)
이 때, 해결 했던 방법 중에서 일반적으로 쓰인 방법이 인스톨러와 데이터 파일을 배포해서 2개 이상의 파일을 이용한 배포였다. 그런데, NSIS 자체에서 압축 기능을 지원하고는 있지만, 별도의 압축 파일을 처리 하는 모듈은 없기 때문에 NSIS의 EXCUTE SCRIPT 를 이용해서 COMMAND로 실행 가능한 7Z 압축 바이너리에 압축 풀 파일을 넘겨주어 압축을 푸는 방식을 이용했다. 즉, INSTALL.EXE 와 DATA.7Z 이렇게 2개의 파일을 배포 하지만 INSTALL.EXE 는 설치 능력은 있지만 DATA.7Z 파일의 압축을 풀 능력이 없기 때문에 INSTALL.EXE 자체에 7Z.EXE 를 함께 넣어서 설치 과정중에 7Z.EXE를 별도의 프로세스로 실행해서 DATA.7Z 를 압축 푸는 방식을 이용했다. 하지만, 이 방식이 조금 문제가 있는 것이.. 표준 스트림 버퍼를 이용을 하고는 있지만 7Z.EXE 에서 출력 되는 메세지가 이유를 알 수 없게 버퍼링이 되어서 현재 상태를 바로 보여 줄 수 없다는 문제가 있다. 다시 말하면, 100개의 파일을 압축 푸는데, 어떤 파일을 압축을 풀었다 라고 100번의 메세지가 DETAIL LOG에 나와야 하지만 어떠한 이유에서 이 출력될 LOG가 버퍼링 되어서 뭉쳐서 나오는 문제가 생긴 것이다. 따라서 설치 시간이 오래 걸리는 대용량 설치의 경우 유저들은 이게 설치가 되는건가? 하는 의구심을 품게 된다. 또한 현재 설치가 어느 정도 진행 됐는지 알 수가 없어서 답답함을 가질 수 밖에 없었다. 우리 회사에서도 NSIS를 이용한 배포를 하는데 항상 저 문제가 마음에 걸렸다. 언젠가 시간이 나면 NSIS용 7Z PLUG-IN을 만들어야겠다! 라고 생각하고 있었는데, 최근에 제작 할 시간이 생겨서 작업을 시작하고 보니.. 이런! 이미 나와있다. -_- Nsis7z plug-in ( 참고 : http://nsis.sourceforge.net/Nsis7z_plug-in ) 을 이용할 경우 NSIS 인스톨러를 이용해서 압축을 풀 수 있게 된다. 대용량 파일을 압축 풀더라도 버퍼링으로 인한 메세지가 밀려서 나오는 문제도 해결 할 수 있을 뿐만 아니라, 현재 설치 상태를 % 로도 표시를 할 수 있다. 사용법도 매우 간단해서, 기존의 처럼 7Z.EXE 를 더 이상 인스톨러에 포함하지 않아도 된다. 플러그인을 다운 받아서 NSIS7Z.DLL 파일은 NSIS의 PLUGIN 폴더에 넣어주면 준비 끝. 그 다음에는 인스톨 스크립트에 몇줄만 추가 하면 완료다. 이 플러그인을 이용 할 경우 2가지 배포 방법을 이용 할 수 있다. NSIS는 인스톨러 컴파일을 할때 설치 데이터를 인스톨러에 함께 묶는데, 1) 이때 데이터 파일을 함께 묶는 방법, 그리고 2) 데이터 파일을 인스톨러와 별도로 배포 하는 방법으로 나뉘어 진다 1)의 경우는 작은 용량의 배포에 알맞다. 2)의 경우는 대용량 파일을 배포 할때 알맞다. NSIS가 단일 파일을 2GB 이상 지원 하지 않기 때문에 2GB 이상의 데이터를 배포 한다면 별개의 데이터 파일로 배포 하는 것이 좋다. 또한 비스타에서 실행 파일의 용량이 대용량일 경우 실행 시간이 매우 오래 걸리는 문제가 있는데, 이 문제 역시 별도의 데이터 파일을 이용 할 경우 해결 된다. 자, 그러면 플러그인에서 지원하는 명령어들을 확인해 보자. 이 플러그인은 총 3개의 명령어를 지원한다. Nsis7z::Extract 제일 기본 적인 압축 해제 명령으로 Nsis7z::Extract "ArchiveName.7z" 와 같은 방식으로 사용을 한다. 압축이 풀리는 동안 인스톨러에 표시 되는 프로그레스바는 정상적으로 그 값을 표시 한다.
참고로, 인스톨러의 실행 위치에 함께 있는 파일을 압축 풀기 위해서는 Nsis7z::Extract "$EXEDIR\ArchiveName.7z" 로 경로를 함께 지정해주어야 한다. 경로를 반환하는 상수들에 대해서는 여기를 참고! Nsis7z::ExtractWithDetails
기본 압축 해제 명령에 % 표시 기능을 추가 한 명령. Nsis7z::ExtractWithDetails "DATA.7z" "Installing package %s..." 와 같이 2번째 파라미터에 스트링을 넘겨 주면 그에 알맞게 % 표시를 해준다. 위의 명령을 예로 들면 Installing package %s... 을 Installing package 퍼센트% ( 현재 용량 / 전체 용량 ) 으로 표시해준다. Nsis7z::ExtractWithCallback
마지막으로 ExtractWithCallback의 경우 압축을 다 푼후 지정한 콜백 함수를 호출한다. 콜백을 호출 해줄 뿐 명령 자체는 Extract와 동일하다.
GetFunctionAddress $R9 CallbackFunction ; CallbackFunction의 호출 주소를 $R9에 저장 Nsis7z::ExtractWithCallback "Data.7z" $R9 ; Data.7z의 압축 해제 후 $R9 주소 함수 호출 위의 3개 함수를 이용하면 각 현재 진행 상태를 안정적으로 표시 할 수 있다. 다만, 이 플러그인의 조금 아쉬운 점은 압축 풀고 있는 파일명을 표시 안해주는 것이다. 하지만, 이 플러그인은 코드가 공개 되어 있으므로 조금만 수정하면 현재 압축 해제 파일명을 DetailPrint 를 이용하여 표시하는 것은 큰 문제가 되지 않을 것이라 생각된다. 'Programming > Code Story' 카테고리의 다른 글
[Yuno.org, 2009/04/12 05:58, Programming/Code Story]
NSIS ( Nullsoft Scriptable Install System )을 사용해서 소프트웨어를 패키징 & 배포를 할때 비스타에서 문제점이 발생한다. 물론 배포 전에 각 OS 별로 테스트를 진행하지만 어떤 조건이 갖추어진 경우에만 티가 나는 경우가 있어서 짜증을 불러 온다. 모든 문제는 Vista의 UAC ( User Account Control )에서 부터 시작 되는 문제이다. Microsft가 Vista를 출시 하면서 기존에는 그다지 신경 쓰지 않던 사용자 계정 간의 보안 문제를 적용하기 시작했다. 즉 계정 별로 시스템에 큰 영향을 줄지 모르는 것들에 대해서 제한적으로 실행을 허가 하는 기능을 추가 한 것이다. 프로그램을 설치 할때 일반적으로 시스템 정보에 접근해서 레지스트리, 유저별, 전체, 단축 아이콘, 바탕화면 아이콘 등을 작업하는 설치 프로그램 역시 UAC의 영향을 받게 되어 버린것이다! 현재 리포트 되어 있는 대표적인 2 가지 문제는 전부 UAC 서비스를 사용하지 않는 상태에서는 문제가 전혀 발생 되지 않는다. 첫번째 문제, Vista에서 대용량 실행 파일을 관리자 권한으로 실행하면 UAC 의 영향을 받아서 소프트웨어 구동 시간이 매우 오래 걸린다. ( 소니 TZ 노트북에서 200MB 짜리 단일 NSIS 설치 파일 실행시 약 20초, 1.5GB 짜리 실행시 약 1분 이상, 거의 10MB당 1초의 구동 대기 시간 소요 ) 결국 이것은 사실상 비스타의 버그!!!!! 이 문제는 예상되는 바로는 UAC가 실행 되는 파일을 전체 검사를 하여 인증서와 같은 것을 검색 하는 것으로 보인다. (관리자로 실행 하기 위해서 manifest 파일 같은 것을 응용 프로그램에 포함시키기도 하기 때문에) 두번째 문제, Vista에서 User 권한으로 프로그램을 설치 하려 하면 관리자 권한 (Administrator )의 폴더에 접근을 할 수 없으며 단축 아이콘 및 레지스트리에 접근이 불가능하다. 아쉽게도 첫번째 문제는 아직 해결 방법이 없다. NSIS 에서 컴파일을 할때 RequestExecutionLever 을 User 로 설정해서 실행 권한을 낮추면 문제 없이 정상적인 속도로 실행이 된다. 하지만 이 경우에는 바로 두번째 문제에 봉착 하게 되어진다. -_- 첫번째 문제를 해결 하는 제일 좋은 방법은 설치 파일을 분할 하는 것이다. 이것은 NSIS에서 분할 파일 배포 방법( http://www.yuno.org/295 ) 을 이용하면 된다. 두번째 문제는 NSIS의 UAC 플러그인을 사용하면 된다. UAC Plugin은 사용자 권한(USER LEVEL)로 실행 되었을 경우 내부에서 해당 실행 파일을 다른 프로세스를 이용하여 관리자 권한으로 다시 한번 실행 시켜주는 방식을 통해서 두번째 문제를 해결 하고 있다. 하지만 첫번째, 두번째 문제가 엮인 경우 두번째 문제를 해결 하기 위해 UAC 플러그인을 사용하면 다시 첫번째 문제로 돌아가게 된다는 것을 명심하자. ( 쪼개는 방법 밖에 없단 이야기 ) 또한 UAC 플러그인은 유저단의 아이콘 만들기 라던가, 유저 레벨로의 별도 실행 파일 실행 등의 기본적인 기능을 포함하고 있다. 만약 두번째 문제만 겪고 있을 경우는 UAC Plugin으로 가볍게 문제를 해결 할 수 있다. 이것과 관련된 NSIS Forum의 thread가 있으니 한번 읽어 볼만하다. 'Programming > Code Story' 카테고리의 다른 글
[Yuno.org, 2008/08/02 00:58, Programming/Code Story]
NSIS(Nullsoft Scriptable Install System)는 어느새인가 국내 배포 프로그램에서 나름 차지 비율을 높여만 갔다. 아직 해외에서 발매되는 주요 상용 소프트웨어는 Install shield를 쓰고 있지만 전 세계의 수 많은 공개 프로그램들은 NSIS를 사용하고 있다. 'Programming > Code Story' 카테고리의 다른 글
|
||||||||||||||||||||||||||||||||||||||




