Electron Start - 7. Electron Windows Installer 실행 레지스트리 추가 하는 방법

JavaScript

1. 문제점 확인

  • Windows Installer로 설치를 실행할 때 레지스트리를 추가해야하는 경우가 있습니다.
  • 저의 경우는 Electron으로 채팅앱을 만들면서, 웹소스들을 그대로 Android와 IOS로 들고와 앱으로 감싸는 시도를 하였습니다. Android와 IOS의 공통적인 앱과 통신 하는 방법으로 아래와 같은 코드로 커스텀 스킴을 사용하는 방법을 적용하게 되었습니다.
location.href='togethersTalk://setAlarm';
  • 위와 같이 커스텀 스킴을 사용하여 코드를 작성하고 빌드를 하게되면 Mac에서는 문제가 발생하지 않는데.. Windows에서 프로그램을 설치하고 나면 아래와 같은 팝업이 똬 하고 떠버립니다…

7-1

  • 이러한 현상 때문에 인스톨 시에 레지스트리를 추가하는 방법을 고민해야했습니다.
  • electron-builder를 이용하여 아래와 같은 옵션과 스크립트를 추가하면 해결을 할 수 있습니다.

2. 해결

2.1 package.json 에 옵션 추가

  • package.json파일에서 electron-builder옵션을 작성하는 build 옵션 하위에 아래의 내용을 추가합니다.
"nsis": 
  { 
    "oneClick": false, 
    "allowToChangeInstallationDirectory": true, 
    "include":"build/installer.nsh" 
  },
  • 레지스트리를 추가하는 핵심 부분은 include 부분 입니다.
  • “oneClick” 옵션은 실행하자마자 자동 설치 관련 옵션이고, “allowToChangeInstallationDirectory” 옵션은 oneClick 옵션을 false로 하고 디렉토리 변경을 허용하겠냐는 옵션입니다.
  • 레지스트리를 추가하는 빌드 스크립트 경로를 include에서 지정하게 됩니다, nsis 하위 옵션에 script라는 옵션 또한 빌드 스크립트를 지정할 수 있는데 script 는 모든 인스톨러과정의 모든 스크립트 전체를 작성해야하는 듯 하였습니다. include 는 필요한 부분만 추가 가능하였습니다.
  • NSIS 스크립트도 검색해보면 너무 방대해서.. include옵션에 필요한 내용만 추가하는 방법을 선택하였습니다.

  • NSIS 위키내용

2.2 NSIS 빌드스크립트 작성

  • 위에서 설명한 nsis옵션 하위 include 옵션에서 작성한 경로위치에 installer.nsh파일을 만들고 아래의 코드를 작성합니다.
!macro customInstall 
    DetailPrint "Register togetherstalk URI Handler" 
    DeleteRegKey HKCR "togetherstalk" 
    WriteRegStr HKCR "togetherstalk" "" "URL:togetherstalk" 
    WriteRegStr HKCR "togetherstalk" "URL Protocol" "" 
    WriteRegStr HKCR "togetherstalk\DefaultIcon" "" "$INSTDIR\${APP_EXECUTABLE_FILENAME}" 
    WriteRegStr HKCR "togetherstalk\shell" "" "" 
    WriteRegStr HKCR "togetherstalk\shell\Open" "" "" 
    WriteRegStr HKCR "togetherstalk\shell\Open\command" "" "$INSTDIR\${APP_EXECUTABLE_FILENAME} %1" 
!macroend
  • 저도 자세한 NSIS 스크립트에 관련하여 설명 드릴수는 없는데요 ㅜ
  • 음 대략적으로 인스톨시에 레지스트리가 있다면 지우고 다시 등록하는 과정입니다.
  • DeleteRegeKey가 레지스트리를 지우는 부분, WriteRegStr이 작성 부분, Write첫번째 줄이 url 스킴을 등록하는 부분입니다.
  • 사실 첫번째 작성 부분 빼고는 특별히 필요하지 않지만..여기 스크립트에서 원하는 부분에 레지스트리를 추가하시면 되겠습니다.