상세 컨텐츠

본문 제목

Install Shield 사용기2

개발/Tools

by 대충고양이짤 2013. 11. 6. 18:54

본문

저번에 만들었던 installer 대신, 기능을 더 추가한 새로운 installer를 만들게 되었다.지겹고 머리아픈 install shield에서 드디어 해방인가! 라며 환호하던 두 손을 집어 내리고, 소심하게 내 뻘짓 과정을 서술해본다. 나처럼 맨땅에 헤딩으로 Install shield를 만지작 거리는 사람이 있다면 도움이 되길.


(뻘짓은 많이 했지만 Install shield에 대해 아직 잘 모르고, 제대로 만들었는지 테스트가 많이 부족하다는 것을 염두하기 바랍니다)



마지막 수정일 : 2014.01.15





내가 원하는 Installer의 기능


Server를 구동할 수 있도록 기초 환경 세팅을 해주는 installer를 만들고자 했다.


Install의 경우에는 Tomcat/webapps 폴더에 WAR 파일을 복사하고, 

DB에 각 DB 테이블을 생성하고 기본 정보를 insert 하는 동작이 목표였다.


Uninstall의 경우에는WAR 파일과 새로 생성된 폴더, 그리고 DB를 삭제하는 것이 목표였다.





Installer 생성 과정



1.InstallScript MSI 실행. 


(이전에 사용했던 installScript는제약 사항이 너무 많아서 변경했다)

Create a new Project를 선택하여 InstallScriptMSI로 프로젝트를 생성한다.




2.Project Assistant 메뉴로 넘어가, 아주 기본적인 정보를 세팅하여 뼈대를 만든다.



위에 세개의 탭이 있는데, 

 - StartPage에서는 프로젝트를 추가하거나 불러오기를 할 수 있고,

 - Project Assistant에서는 기본적인 정보를 쉽게 세팅하여 바로 만들 수 있다. 

   복잡한 기능을 추가할게 아니면 여기서 한번에 installer를 만들 수 있다.

 - Installation Designer에서는 사용자가 마음대로 이런저런 기능을 커스텀할 수 있다.



일단 상단의 메뉴를 설명하자면, 

제일 위 빨간 박스는 기본 빌드/디버그 버튼이다.

3번째 Build와 6번째 Run 키를 사용할 예정이니 눈여겨 보자.



Application Information에서는 기본 정보를 입력한다. 

회사명(company name), 어플명(Application name), 버전, 회사 홈페이지 등을 입력할 수 있다.

이와 동일하게, Installation Designer에서는 General information이라는 메뉴에서 아주 자세한 기본 정보를 입력할 수 있게 해 준다. 현재 화면의 왼편에 해당 메뉴 링크가 있으니 나중에 참고하도록.




3. Installation Requirement로 Install 전에 선행으로 체크해야할 동작을 설정한다.



내 경우에는 installer가 실행될 os를 win7으로 선택하고, 미리 install 될 프로그램은 선택하지 않았다.

테스트 결과 win7 선택 시 win7 이상이면 다 되는 것 같다. 

(BUT win7, win8에서 문제없이 설치 되는걸 확인했지만, 하위 버전은 테스트 해보지 않았다)



미리 install 될 프로그램 선택은, 만약 내가 tomcat 프로그램을 선택하고 YES 체크 후 installer를 만들었을 때 tomcat이 없으면 installer가 자동 종료한다. 내 경우에는 tomcat과 MySQL이 설치되어야 하는데 나중에 추가할 예정이다. 왼편의 System Search에서는 이 과정의 세부 사항을 덧붙일 수 있다.



덧붙여, 만약 list에 체크해야할 프로그램(ex:tomcat)이 없어도 추가할 수 있다.




4.Application Files는 제일 중요한 메뉴이다. 

바로 install 될 파일과 설치 위치를 선택할 수 있는 메뉴이다.


나는 서버정보가 담긴 war 파일을 tomcat의 webapps 폴더 하위에 복사할 예정이다. 


처음에는 ProgramFilesFolder 밖에 없으므로, 하위에 new folder로 경로를 만들어 준다. 

그리고 Add Files로 사용할 file을 추가해 준다.




나머지 shortcut 추가나 registry 등등의 정보는 해보면 되므로 스킵한다.




5. Installation Designer 탭으로 넘어 온다. 여기에서는 세부 사항을 세팅할 수 있다.



위의 이것저것들은 별것 아니니 넘어가고,


feature의 개념을 간단하게 설명하자면, 하나의 작업이라 할 수 있겠다. 그 작업 아래 소 작업(components)들을 추가할 수 있고, installer는 여러 작업을 상황에 따라(condition) 분기하면서 수행할 수 있다.

인스톨 되어야 하는 상황이 같은 것들(components)끼리 모아서 feature로 묶는 것을 추천.



일단 나는 features 메뉴에서 feature를 하나 더 추가했다. 

왜냐면 install 시 war 파일 복사/DB 생성이 따로 수행될 수도 있기 때문에, feature를 나누었다.



     - DB feature : SQL component를 가지고 DB에 table 생성.

     - feature : war 파일 복사.



tomcat + mysql 설치되어 있을 때 : feature + DB feature 동작.

tomcat만 설치되어 있을 때 : feature만 동작.


이렇게 condition에 따라 실행되어야할 feature가 나누어진다.




6.SQL Scripts 메뉴에서 connection을 추가한다. (DB feature의 동작임)



먼저 오른쪽 클릭으로 newSQLConnection을 하나 추가한다. 



[General]탭

Catalog Name을 database 명이 될 것이며, 만약 없을 경우에는 새로 만들거라서 Create Catalog if Absent 항목에 체크를 하였다. 


Default Target Server Name은 나중에 접속할 DB 서버 주소인데, 만약 현재 PC를 database 서버로 쓰려면(MySQL server가 깔려 있어야 함) localhost로, db 서버를 따로 쓰려면 해당 서버의 주소(ex: 10.10.10.10)를 입력하면 된다. 어차피 인스톨러가 돌아갈때 수정할 수 있으므로 여기서는 사용자에게 보여질 default 값을 입력하면 된다.


Server Login ID와 Password는 MySQL server 설치 시 설정한 계정을 입력한다. 물론 이것도 차후 installer 구동 시 변경할 수 있으므로 default 값을 입력해 둔다.



[Requirements] 탭

MySQL server를 사용할 것이므로 해당 서버를 선택한다.

default로 MS SQL server가 선택되어 있는데, MySQL 서버 체크 후 MS SQL server를 체크하면 MS SQL server 선택을 해제할 수 있다.


그리고 MySQL 선택 후 하단의 Add를 눌러 서버 버전을 등록해봤는데, 쓸데없이 버전 체크를 해서 오류만 일으켰다. (add한 버전은 5.0.45이고 PC에 설치한 버전은 5.5인데, install 시 5.0.45 이상 버전만 지원 가능하다며 오류창이 뜸... 뭐지 이건...) 


그냥 아무것도 등록하지 않는게 마음 편하다.





7.추가된 connection 하위에 script를 추가한다.


[General] 탭

에서는 해당 sql문이 포함될 feaure를 선택한다. 내 경우에는 DBfeature와 그냥 feature 2개가 있는데, sql문은 DB feature에서 수행될 거라서 DB feature 항목만 체크해 두었다.



[Runtime] 탭

언제 이 script가 수행될 지 설정하는 탭이다. 

Create table의 경우에는 install 시 수행될 예정이므로 Run Script During Install에 체크했고, drop database를 하는 sql 파일은 Run Script During Uninstall에 체크했다. status message에서는 string을 변경할 수 있다. 


Script Error handling에서는 이 script 수행중 에러가 발생했을때 어떻게 할 것이냐? 라는 건데, table이 하나라도 create 되지 않으면 DB table 생성 의미가 없으므로, Error 시 Abort 하도록 하였다.




[Script] 탭

create table은 하나의 script에서 하나밖에 수행을 못하므로, 만약 table을 22개 만들고 싶다면 오른쪽 메뉴에서 new script를 해서 22개를 하나하나 추가해 줘야 한다.



형식은 아래와 같다.


/*
1.주석
*/
CREATE TABLE 'test_table' (
'table_id' int(11) NOT NULL AUTO_INCREMENT,
'table_name' varchar(12) NOT NULL,
'create_date' datetime NOT NULL,
PRIMARY KEY('table_id')
) ENGINE=InnoDB AUTO_INCREMENT=1361 DEFAULT CHARSET=euckr /*2*/



여기서 주의 사항이 2가지가 있다.


1. 처음 sql  script 파일을 추가하면, 주석부분에는 /*가 없이 ----------가 바로 나오면서 자동등록되어 나오는데, 초록색이라고 해도 속지 말자. 저건 제대로 된 주석이 아니다. /* */로 막아 주어야 정상 동작한다.


2.ENGINE= .... 이 부분은 부끄럽지만 정확히 무슨 뜻인지 모른다. 다른 client 툴로 database를 만들고, 그 툴에 설정된 코드를 빼오다 보니까 저런게 있었다 ^^; 하지만 중요한게, 다른 table과 연계될 때 ENGINE 값이 똑같아야 한다. 



8.ODBC Driver를 설정한다.



왼쪽 메뉴 제일 아래에 있는 Direct Editor에서 ISSQLDBMetaData를 선택한다. 여기에서는 MySQL Script를 사용할 수 있게 ODBC Driver를 설정할 수 있는데, 기본으로 3.51 버전이 추가되어 있다. 5.2 버전을 사용하려면 AdoDriverName 항목에 {};{} 형식으로 추가해 주면 된다.



그리고 주의 사항이 있다면, 


- 위의 캡쳐 화면에서 5.2 Driver의 값이 잘못 되었는데, {MySQL ODBC 5.2 Unicode Driver}, 혹은 {MySQL ODBC 5.2 ANSI Driver}로 해야 한다.


- 64bit PC에서 ODBC driver를 64bit용으로 설치하면 installer가 제대로 동작하지 않는다. 64ibt PC은 32bit PC든, 모두 32bit용 ODBC driver를 설치하자.



이렇게 하면 대충 sql script 사용 준비는 끝이 난다.




9.사용자의 입맛에 맞게 InstallScript를 수정한다.


Install Shield의 꽃이자 가장 중요한 installscript 메뉴에서는, setup.rul 파일을 수정하여 사용자의 입맛대로 동작을 수정할 수 있다.


Setup.rul 파일 선택 후 오른쪽 창을 보면 Initialization, Before Move Data, After Move Data 등의 메뉴가 있다. 생성된 Installer는 다음과 같은 순서로 진행된다.


OnBegin() -> OnFirstUIBefore() -> OnMoving() -> OnFirstUiAfter() -> OnEnd()


Uninstall 동작은 다음과 같은 순서로 진행된다.


OnMaintUIBefore() -> OnUninstall() -> OnMaintUIAfter()



왼쪽 메뉴 선택 후 오른쪽 박스에서 여러 함수를 추가할 수 있다.

추가한 뒤 사용자는 코드를 내 마음대로 변경하면 된다.




사용 예1)APP Search 추가

선행으로 install 되어야할 프로그램(mysql)을 체크하는 부분을 script에 넣었다. 

(Project Assistant 메뉴에서 버튼 하나로 추가할 수 있다- 4.Application Files... 항목 참조..)


InstallScript의 Setup.Rul 파일을 선택한 뒤, Before Move Data의 OnAppSearch() 항목을 클릭한다. 그러면 setup.rul 파일에 자동으로 OnAppSearch() function이 등록된다. 실행 순서는, OnBegin() 다음 OnFirstUIBefore() 전이다.



mysql.exe 파일을 ProgramFiles 폴더에서 찾는다. 막약 없으면 ProgramFiles64에서 한번 더 찾는다. 

왜냐하면 64 bit 컴퓨터에서는 ProgramFiles64에 mysql이 설치되기 때문이다.



// Included header files ----------------------------------------------------
#include "ifx.h"
STRING svFoundFile; //OnFirstUIBefore() 함수에서도 사용할 값이므로 전역 변수로 설정.

function OnAppSearch()
       NUMBER nResult; 
begin
	MessageBox("Searching mysql.exe...\nClick OK and Wait a minute...", INFORMATION);
	    
	nResult = FindAllFiles(PROGRAMFILES, "mysql.exe", svFoundFile, RESET); 
	if(nResult = 0) then
		MessageBox("Found mysql.exe at: " + svFoundFile + ".\n\nCreate DB.", INFORMATION);
	else
		nResult = FindAllFiles(PROGRAMFILES64, "mysql.exe", svFoundFile, RESET); 
		if(nResult = 0) then
			MessageBox("Found mysql.exe at: " + svFoundFile + ".\n\nCreate DB.", INFORMATION);
		else 
			MessageBox("Can't find mysql.exe.", INFORMATION); 
		endif;
	endif;
end;



사용 예2)

Installer의 UI 순서를 변경한다.


function OnFirstUIBefore()
    NUMBER nResult, nSetupType, nvSize, nUser;
    STRING szTitle, szMsg, szQuestion, svName, svCompany, szFile;
    STRING szLicenseFile;
    BOOL bCustom, bIgnore1, bIgnore2;    
begin	
    // TO DO: if you want to enable background, window title, and caption bar title                                                                   
    // SetTitle( @PRODUCT_NAME, 24, WHITE );                                        
    // SetTitle( @PRODUCT_NAME, 0, BACKGROUNDCAPTION ); 	                  
    // Enable( FULLWINDOWMODE );						   
    // Enable( BACKGROUND );							  
    // SetColor(BACKGROUND,RGB (0, 128, 128));					   

    // Added in InstallShield 15 - Show an appropriate error message if
    // -removeonly is specified and the product is not installed.
    if( REMOVEONLY ) then
        Disable( DIALOGCACHE );
		szMsg = SdLoadString( IDS_IFX_ERROR_PRODUCT_NOT_INSTALLED_UNINST );
   		SdSubstituteProductInfo( szMsg );
		MessageBox( szMsg, SEVERE );
		abort;
    endif;
    
	nSetupType = CUSTOM;

Dlg_SdWelcome:   
    szTitle = "";
    szMsg   = "";
    nResult = SdWelcome(szTitle, szMsg);  //SdWelcome은 dialog 화면으로, install이 준비 화면이 뜬다.
    //Back이나 next 버튼을 누르면 결과가 nResult로 전해져 back 일때 이벤트를 정할 수 있다. 이벤트를 따로 설정하지 않으면 다음 Dialog(Dlg_)로 넘어간다.

    if (nResult = BACK) goto Dlg_SdWelcome;
	
	szTitle   = "";
	svName    = "";
    svCompany = "";
    
/* 필요없어서 없앰
Dlg_SdRegisterUser:
    szMsg = "";
    szTitle = "";
    nResult = SdRegisterUser( szTitle, szMsg, svName, svCompany );
    if (nResult = BACK) goto Dlg_SdWelcome;
*/
/* 너두 필요없음
Dlg_SetupType:
    szTitle = "";
    szMsg   = "";
    nResult = SetupType2(szTitle, szMsg, "", nSetupType, 0);
    if (nResult = BACK) then
        goto Dlg_SdRegisterUser;
    else
	    nSetupType = nResult;
        if (nSetupType != CUSTOM) then
	        nvSize = 0;
	        FeatureCompareSizeRequired(MEDIA, INSTALLDIR, nvSize);
	        if (nvSize != 0) then      
            	MessageBox(szSdStr_NotEnoughSpace, WARNING);
	            goto Dlg_SetupType;
            endif;
			bCustom = FALSE;
			goto Dlg_SQL;
		else
			bCustom = TRUE;
        endif;
    endif;
*/    

//설치할 path를 설정할 수 있다.
Dlg_SdAskDestPath:    	
    nResult = SdAskDestPath(szTitle, szMsg, INSTALLDIR, 0); //Default로 설정된 dialog는 SdAskDestPath2인데, 나는 SdAskDestPath Dialog가 더 좋아서 변경했다. 각 dialog의 UI를 확인하려면 왼쪽 하단의 Dialog 메뉴에서 확인 한다.

    if (nResult = BACK) goto Dlg_SdWelcome;//Dlg_SetupType;  
    
    if(svFoundFile = "") then
    	FeatureSetData(MEDIA, "DBFeature", FEATURE_FIELD_SELECTED, FALSE, ""); 
    	goto Dlg_SdStartCopy;
    endif;

//SQL이 설치되어 있지 않으면 DBFeature를 실행하지 않고 copy만 한다. 사실 이건 Dlg_SdFeatureTree에서 써먹으려고 추가한건데, feature 분기하는데 도움이 되므로 그냥 씀. 

/*
Dlg_SdFeatureTree: 
    szTitle    = "";
    szMsg      = "";
    
    if (nSetupType = CUSTOM) then
		nResult = SdFeatureTree(szTitle, szMsg, INSTALLDIR, "", 2);
		if (nResult = BACK) goto Dlg_SdAskDestPath;  
    endif;
*/

//SQL Script를 실행한다. 
Dlg_SQL:
    nResult = OnSQLLogin( nResult );
    if( nResult = BACK ) then
    	if (!bCustom) then
    		goto Dlg_SdAskDestPath;//Dlg_SetupType;    //세심한 back키 설정.
    	else
    		goto Dlg_SdAskDestPath;//Dlg_SdFeatureTree;
    	endif;
    endif;

Dlg_SdStartCopy:
    szTitle = "";
    szMsg   = "";
    nResult = SdStartCopy2( szTitle, szMsg );			
	
    if (nResult = BACK) then
    	if(svFoundFile = "") then goto Dlg_SdAskDestPath;
    	else goto Dlg_SQL;
    	endif;
    endif;

    // Added in IS 2009 - Set appropriate StatusEx static text.
    SetStatusExStaticText( SdLoadString( IDS_IFX_STATUSEX_STATICTEXT_FIRSTUI ) );

    // setup default status
    Enable(STATUSEX);
 
    return 0;
 end; 




10.마지막으로, Dialog도 입맛대로 바꿔준다.


사용자에게 보여질 String을 변경하거나, 이런저런 실험을 할 수 있다.

왼쪽의 Dialog 메뉴에서 원하는 Dialog를 선택하고, Edit Dialog layout을 선택하면 변경할 수 있다.






참고 사이트


'개발 > Tools' 카테고리의 다른 글

WAS 서버 WEB 서버  (0) 2014.12.04
[Tistory] 카테고리 펼치기  (0) 2014.12.04
제우스 라이선스 관련  (0) 2013.12.13
Install Shield 활용기  (0) 2013.10.24
eclipse 웹프로젝트 실행 시 http status 404 error  (2) 2013.09.06

관련글 더보기

댓글 영역