[Electron] 쿨 가락 클 라 이언 트 개발 실천 공유 - 소프트웨어 자동 업데이트
클 라 이언 트 업데이트 방안 을 이야기 하기 전에 웹 과 클 라 이언 트 업데이트 의 원 리 를 알 아 보 겠 습 니 다.
웹 응용
웹 응용 세계 에서 우 리 는 보통 웹 서버 의 전단 코드 (템 플 릿, HTML, js, css) 를 업데이트 하여 새로운 기능 을 발표 합 니 다.그 후에 사용 자 는 우리 의 웹 서버 를 다시 방문 하여 업 데 이 트 된 전단 코드 를 받 았 습 니 다.
웹 응용 업데이트 가 이렇게 편리 한 것 은 중심 화 된 저장 방식 덕분 입 니 다.
클 라 이언 트
웹 응용의 중심 화 저장 과 달리 클 라 이언 트 의 코드 는 실제 적 으로 분포 식 저장 이 고 모든 사용자 컴퓨터 에 완전한 코드 파일 이 있 으 며 약간 비슷 하 다
git
.사용 자 는 컴퓨터 에 클 라 이언 트 를 설치 하면 실제로 클 라 이언 트 코드 파일 을 이 컴퓨터 에 영구적 으로 저장 합 니 다.예 를 들 어 MacOS 에 코드 파일 은
/Applications
디 렉 터 리 에 저 장 됩 니 다.클 라 이언 트 에 웹 페이지 를 삽입 하 는 업데이트 방식 은 위 에서 말 한 웹 애플 리 케 이 션 업데이트 와 같 습 니 다. 더 이상 설명 하지 않 습 니 다. (모 바 일 앱 에 설 치 된 H5 페이지 업데이트 참조)
결론.
웹 애플 리 케 이 션 업데이트, 실제 서버 코드 파일 업데이트
클 라 이언 트 의 업 데 이 트 는 실제 적 으로 사용자 컴퓨터 의 코드 파일 을 업데이트 하 는 것 이다.
구체 적 실현
Electron 홈 페이지 에는 업데이트 에 관 한 튜 토리 얼 Updating Applications 가 있 지만 업무 수 요 를 만족 시 킬 수 없습니다.
update.electron.org
코드 는 github 에 위탁 해 야 합 니 다. pass electron-builder
windows 에 서 는 NSIS 만 지원 하고 HTTP 서 비 스 를 구축 해 야 한다.업데이트 프로그램 UI 와 대화 형 맞 춤 형 제작 도 우호 적 이지 않다 Deploying an Update Server
이 방안 은 update server 를 배치 해 야 하고 귀 찮 습 니 다 1. 업데이트 확인
업 데 이 트 를 검사 하 는 것 은 전체 절차 의 첫 번 째 단계 이다.업데이트 가 있어 야 후속 업데이트 논리 가 실 행 됩 니 다.일반적으로 우 리 는 소프트웨어 가 시 작 될 때 업 데 이 트 를 검사 합 니 다.
업 데 이 트 된 정책 을 검사 합 니 다. 실제로 로 컬 클 라 이언 트 의 버 전 을 원 격 버 전과 비교 한 다음 에 버 전 대비 결과 에 따라 서로 다른 업데이트 보 여 줍 니 다.
원 격 버 전
자신 이 update server 를 만 드 는 것 보다 원 격 JSON 데이터 유지 비용 이 낮 습 니 다.이 원 격 데 이 터 는 백 엔 드 인터페이스 나 cdn 의 json 파일 일 수 있 으 며 업데이트 가 필요 할 때 원 격 데이터 의 내용 을 제때에 업데이트 할 수 있 습 니 다.
이 원 격 JSON 데이터 에는 일반적으로 버 전 번호, 업데이트 내용 소개 및 발표 시간 이 저 장 됩 니 다.
const updateData = axios.get('https://some-update.json');
console.log(updateData);
/*
{
version: '1.0.0',
changeLogs: [' ',' '],
time: '2019-06-06',
}
*/
로 컬 버 전
Electron 에서 로 컬 버 전 을 가 져 오 는 것 은 매우 간단 한 app. getVersion 입 니 다.
const localVersion = app.getVersion(); // 0.0.1
버 전 비교
일반적으로 원 격 버 전 번호 가 로 컬 버 전보 다 크 면 업데이트 가 있다 고 인정 합 니 다.업데이트 가 있 는 상황 에서 저 희 는 버 전 번호 의 major, minor, patch 버 전 변동 에 따라 서로 다른 업데이트 전략 을 제정 할 수 있 습 니 다.
// >
const shouldUpdate = semver.gt(removeVersion, localVersion);
// :major , 。
const isMajorUpdate = semver.diff(removeVersion, localVersion) === 'major';
if (!shouldUpdate) return; // ,
if (isMajorUpdate) {
console.log(' ')
} else {
console.log(' ')
}
버 전 번호 조작 에 semver 사용 하기
2. 업데이트 알림
소프트웨어 업 데 이 트 를 확인 한 후 사용자 에 게 업데이트 알림 을 제시 해 야 합 니 다.이 때, 우 리 는 업데이트 알림 을 불 러 오 는 창 을 사용 합 니 다. 그 다음은 업데이트 창 이 라 고 합 니 다.
창 내부 코드 예제 업데이트:
const updateData = axios.get('some-update.json')
// ,
if (!shouldUpdate) return; //
// , 。 ,
ReactDom.render( console.log(' ')}
/>, '#app');
// , ( )
currentWindow.show();
3. 본 컴퓨터 파일 업데이트
사용자 가 업데이트 단 추 를 누 르 면 마지막 단 계 를 시작 할 수 있 음 을 의미 합 니 다.
마지막 단계 에서 우 리 는 두 단계 로 나 누 어 진행한다.
사용자 에 게 업데이트 하도록 맡기다
우선, 우 리 는 사이트 클 라 이언 트 다운로드 페이지 의 설치 프로그램 자원 을 최신 으로 업데이트 해 야 한다.그 다음 에 사용자 가 업데이트 단 추 를 누 르 면 이 컴퓨터 의 기본 브 라 우 저 로 다운로드 페이지 를 열 어 사용자 가 직접 다운로드 하고 설치 하 게 합 니 다. 설치 프로그램 이 정상적으로 실 행 된 후에 그 자체 가 이 컴퓨터 코드 파일 을 덮어 쓸 수 있 습 니 다.
이 방법 은 사용자 체험 이 좋 지 않 지만 장점 도 뚜렷 하 다. 많은 개발 원 가 를 절약 하고 웹 페이지 를 직접 재 활용 하여 업 데 이 트 를 한다.
만약 이런 전략 을 채택 한다 면 코드 는 매우 간단 할 것 이다.
//
function handleUpdate() {
shell.openExternal('https://www.kujiale.com/activity/136'); // ,
}
업데이트
물론 더 좋 은 사용자 체험 을 추구 하기 위해 서 는 창 을 업데이트 하 는 코드 에서 직접 기능 을 실현 하 는 것 이 좋다.
첫 번 째 단 계 는 최신 설치 프로그램 을 다운로드 하고 다운로드 진 도 를 보 여 줍 니 다.다운로드 진행 기능 은 request - progress 를 사용 하 는 것 을 추천 합 니 다.물론 NodeJs 네 이 티 브
http
와 stream
모듈 을 사용 해 다운로드 진도 전 시 를 실현 할 수도 있 으 며 자세 한 설명 은 없다.다운로드 한 설치 프로그램 은 사용자 컴퓨터 의 임시 폴 더 에 잠시 저장 할 수 있 습 니 다.
const fs = require('fs');
const request = require('request');
const progress = require('request-progress');
//
function handleUpdate(){
//
const downloadUrl = `https://someupdate/${updateData.version}/installer.dmg`;
// request
progress(request(downloadUrl))
.on('progress', (state) => {
//
console.log(state)
})
//
.pipe(fs.createWriteStream(path.join(app.getPath('temp'), 'installer.dmg')))
}
진도 보기 예시 그림:
두 번 째 단 계 는 설치 프로그램의 코드 파일 을 사용자 컴퓨터 에 업데이트 합 니 다. 이 때 두 가지 방안 이 있 습 니 다.
windows 에서 설치 프로그램 에는 업무 논리 가 있 습 니 다. 레 지 스 트 리 지, 마 운 트 해제 프로그램, 단축 키 등 이 있 기 때문에 우 리 는 첫 번 째 방안 을 선택 합 니 다.
const { shell, app } = require('electron');
shell.openItem('your installer exe path'); //
app.quit(); //
MacOS 에서 우리 가 발행 한 dmg 파일 은 사실 업무 논리 가 없 기 때문에 방안 2 를 사용 하여
.app
디 렉 터 리 를 직접 압축 해제 한 다음 /Applications
디 렉 터 리 로 복사 하면 됩 니 다.MacOS 에서 dmg 파일 의 압축 을 풀 려 면 hdiutil 을 사용 할 수 있 습 니 다.const cp = require('child_progress');
const path = require('path');
const fs = require('fs-extra');
// dmg , .app Test
const installerPath = '/your_installer.dmg';
// hdiutil dmg , /Volumes/your_installer
cproc.execSync(`hdiutil attach ${installerPath} -nobrowse`, {
stdio: ['ignore', 'ignore', 'ignore']
});
// .app
fs.removeSync('/Applications/Test.app');
// Volumes .app /Applications ,
fs.copySync('/Volums/your_installer/Test.app', '/Applications');
//
app.relaunch();
app.quit();
마지막.
댓 글 에서 토론, 기술 교류 & 내 추 를 환영 합 니 다 - >[email protected]
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Vite 기반의 차세대 Electron 빌드 도구electron-vite는 에 더 빠르고 간결한 개발 환경을 제공하는 것을 목표로 하는 빌드 도구입니다. 코드를 과 번들로 묶고 및 브라우저 환경을 포함한 Electron의 고유한 환경을 처리할 수 있는 빌드 명령입...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.