해당 글의 예제는 Delphi XE5로 테스트 했으며, 다른버전의 화면 및 메뉴 명칭은 약간 다를 수 있습니다.


   가끔 주위에서 배포 시 프로그램 용량이 너무 커서 dll 등으로 폼을 분리하는 방법을 문의합니다. 저는 되도록 UPX로 실행파일 압축을 권하지만, 근본적으로 실행파일 용량을 줄이고자 하시는 분들께 도움이되는 내용입니다.


Runtime Packages란?

  • Runtime packages는 실행파일에 라이브러리를 포함하여 컴파일할지 결정하는 프로젝트 옵션(Project > Options > Packages > Runtime Packages)입니다.
  • Runtime packages 옵션은 기본(신규 프로젝트 생성 시)으로 해제되어 있어, 컴파일된 실행파일에는 정적라이브러리(*.lib)가 모두 포함됩니다.
  • 해당 옵션을 해제하게 되면 옵션명대로 Runtime에서 Package들을 사용해야 합니다. 즉, 라이브러리(bpl: Borland Package Library)를 함께 배포해야 합니다. 대신 실행파일의 용량은 확실하게 줄어들게 됩니다.


| Runtime Package 설정 시 용량차이


RunTimePackage_bpl copy.jpg
  • IncludePackage.exe - 패키지가 포함된 실행파일(Runtime Packages 해제: 기본 설정)
  • RunTimePackages.exe - 패키지가 제외된 실행일(Runtime Packages 설정)

  위의 2개의 실행파일은 Delphi XE5로 신규 프로젝트(폼만 있는 빈 프로젝트)를 컴파일한 실행파일입니다. 빈 프로젝트를 컴파일 한 2개의 실행파일도 서로 용량 차이가 꽤 납니다. 


  Runtime packages으로 설정한 실행파일은 실행 시 라이브러리가 필요합니다. 위와 같이 Bpl파일을 함께 배포해야 합니다. 배포경로는 실행파일과 같은 위치 또는 윈도우 시스템 경로인 C:\Windows\System32, C:\Windows\SysWOW64에 Bpl파일을 복사하면 됩니다. 일반적인 Bpl파일은 델파이 실행파일 경로(C:\Program Files (x86)\Embarcadero\RAD Studio\12.0\bin)에 위치합니다.


  만약, Bpl파일을 배포하지 않는다면, 아래와 같은 오류가 발생합니다.(단, 델파이가 설치된 PC환경에서는 시스템 변수에 해당 경로가 등록되어 오류가 발생하지 않습니다.)

RunTimePackage_err copy.jpg


| 개발된 폼을 bpl로 배포하기


  기본 bpl을 제외해서 용량을 줄이는 방법 외에도 개발에 사용된 폼을 패키지 프로젝트로 작성하여 Bpl로 배포함으로 배포용량을 분산할 수 있습니다. 


  폼이 2개인 어플리케이션에서 하나의 서브 폼을 패키지로 작성 후 배포하는 예로 설명을 하겠습니다.

  전체적인 프로젝트 구성은 아래와 같습니다.

RunTimePackage_Form02 copy.jpg


메인 프로젝트 생성

  1. File > New > VCL Form Application으로 프로젝트 생성
  2. Project Manager에서 Project를 선택하고 Add New > VCL Form으로 폼을 하나 추가
  3. File > Save로 프로젝트 및 Unit을 저장
    • RunTImePackages.dpr로 프로젝트 저장
    • 메인폼을 MainForm.pas로 저장
    • 추가한 폼의 Name을 TfrmSecond로 지정 후 SecondForm.pas로 저장
  4. MainForm에 버튼을 올리고 ShowModal로 SecondForm을 호출하는 코드 추가
  5. 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    uses
      SecondForm;
     
    {$R *.dfm}
     
    procedure TForm4.Button1Click(Sender: TObject);
    begin
      with TfrmSecond.Create(nil) do
      begin
        ShowModal;
        Free;
      end;
    end;

  6. 실행 및 테스트


Second Form Package 생성

  1. 위의 프로젝트의 Project Manager에서 Project Group1 > Add New Project > Package 선택 및 확인
  2. Project Manager > Package1(추가한 Package) > Contains 우측 마우스 클릭 > Add > 위의 프로젝트의 SecondForm.pas 선택
  3. 프로젝트 저장
    • SecondFormPackage.dpk로 프로젝트 저장
  4. 컴파일(Ctrl + F9) - 다른 Package가 필요하다는 메시지 창이 표시되면 확인 후 OK 클릭
Change_Package copy.jpg 
  1. 위와 같이 컴파일하면 Bpl기본 경로(C:\Users\Public\Documents\RAD Studio\12.0\Bpl)에 SecondFormPackage.bpl이 생성됩니다.


Main 프로젝트를 Runtime Packages로 설정

  1. Runtime Packages 옵션 호출(Project > Options > Packages > Runtime Packages)
  2. 아래 그림과 같이 설정
    • Runtime Packages > Inherit > True로 변경
    • 입력된 값을 모두 지우고, 위에서 만든 패키지 이름 입력
RunTImePackage_Option copy.jpg 
  
  위와 같이 컴파일하면 Bpl기본 경로(C:\Users\Public\Documents\RAD Studio\12.0\Bpl)에 SecondFormPackage.bpl이 생성됩니다.
RunTimePackage_FormBpl copy.jpg

| 주의할 사항


  • 패키지로 배포할 경우 패키지 파일에서 사용하는 패키지도 함께 배포해야 합니다.
  • 위의 이유로 사용하는 컴포넌트 및 패키지의 구조를 정확히 인지하는 경우만 위의 방식을 사용해야 합니다.
  • 배포 전 반드시 델파이가 설치되지 않은 위치에서 배포 테스트를 진행해야 합니다.


사실 저도 이번 기회에 패키지를 처음 만들어 봤습니다. 테스트하는 과정에서 나온 내용을 공유하는 것이니 혹시 잘못된 내용이나 개선사항이 보이시면 http://blog.hjf.pe.kr/103/ 댓글이나 hjfactory@gmail.com으로 보내주시면 수정반영하겠습니다.


감사합니다.


번호 제목 글쓴이 날짜 조회 수
공지 [DelphiCon 요약] 코드사이트 로깅 실전 활용 기법 (Real-world CodeSite Logging Techniques) 관리자 2021.01.19 14387
공지 [UX Summit 요약] 오른쪽 클릭은 옳다 (Right Click is Right) 관리자 2020.11.16 13023
공지 [10.4 시드니] What's NEW! 신기능 자세히 보기 관리자 2020.05.27 15532
공지 RAD스튜디오(델파이,C++빌더) - 고객 사례 목록 관리자 2018.10.23 21064
공지 [데브기어 컨설팅] 모바일 앱 & 업그레이드 마이그레이션 [1] 관리자 2017.02.06 22297
공지 [전체 목록] 이 달의 기술자료 & 기술레터 관리자 2017.02.06 17933
공지 RAD스튜디오(델파이, C++빌더) - 시작하기 [1] 관리자 2015.06.30 38228
공지 RAD스튜디오(델파이,C++빌더) - 모바일 앱 개발 사례 (2020년 11월 업데이트 됨) 험프리 2014.01.16 173741
190 [따라하기] 인공지능 오목게임(2) - 최종결과물 [2] file 대화마을 2017.09.14 1611
189 [따라하기] 인공지능 오목게임(1) - 만들기 [2] file 대화마을 2017.09.12 5488
188 TListView 행별로 배경색 설정 및 글꼴변경하기 험프리 2017.09.08 1659
187 [FireDac] FDConnection 데이터베이스 Connection 설정 file 김원경 2017.09.01 4514
186 델파이의 새 달력콤포넌트 기능향상 및 버그수정.. 나비스 2017.08.18 1195
185 QR/바코드 스캐너 앱 샘플코드(ZXing, TFrameStand 사용) [1] 험프리 2017.08.04 3028
184 블루투스 바코드 스캐너(BI-07) 안드로이드 라이브러리를 델파이에서 연동하는 방법 [1] file 험프리 2017.03.24 2637
183 리팩토링 3-메소드 추출 file 김원경 2017.02.24 721
182 리팩토링 2-수퍼 클래스(인터페이스) 추출하기 file 김원경 2017.02.23 548
181 리펙토링 1-클래스, 정적메소드, 속성, 필드 이동하기 file 김원경 2017.02.23 645
180 [오픈소스] 델파이 컴포넌트, 프레임워크, 라이브러리, 리소스 등등 관리자 2017.02.15 2024
179 [마이그레이션] 64비트 적용 시 검토할 사항들 file 험프리 2017.02.08 3341
178 [따라하기] 도서대여 프로그램 만들기 - 6, 통합테스트 file 험프리 2017.02.02 1341
177 [따라하기] 도서대여 프로그램 만들기 - 5, 도서대여 기능 개발 file 험프리 2017.02.02 2757
176 [따라하기] 도서대여 프로그램 만들기 - 4, 회원관리 기능 개발 [1] file 험프리 2017.02.01 1785
175 델파이 개체를 메모리에서 해제할 때 Free와 FreeAndNil의 차이점 김원경 2017.02.01 2392
174 [따라하기] 도서대여 프로그램 만들기 - 3, 도서관리 기능 개발 [2] file 험프리 2017.01.26 4975
173 [따라하기] 도서대여 프로그램 만들기 - 2, 메인화면 개발 [2] file 험프리 2017.01.26 2426
172 [따라하기] 도서대여 프로그램 만들기 - 1, 분석, 설계 [4] file 험프리 2017.01.26 5775
171 델파이에서 사용하는 각 Stream(스트림) 정리 김원경 2017.01.04 6003