electron-updater의 노트

7054 단어 Electrontech


  • 문서에서 설명한 대로 setFeedUrl을 사용하지 않습니다.
    - 원본만 보면 움직일 것 같지만 머리글을 붙일 수 없습니다.

  • cons tructor에서 Http Header 지정

  • package.json | electron-builder.yml ...등 설정은 앱-업데이트입니다.yml에 반영되었지만 덮어쓸 수 있습니다.다만, 현금의directory에도 사용된다.
    구축하지 않을 때 적당한dev-appdate.yml 해줄 수 있어.
  • 카테고리


    Provider > GenericProvicer
             > GithubProvicer
    
    AppUpdater > MacUpdater
    AppUpdater > BaseUpdater > NsisUpdater
    AppUpdater > BaseUpdater > AppImageUpdater
    

    default


    electron-bulilderのbiuld時のpublishの値が使われる。
    
    app-update.yml
    

    Provider 생성


    configOnDisk를 따라잡으면 app-update.YML을 보고 있는 곳을 만났다.
      protected async getUpdateInfoAndProvider(): Promise<UpdateInfoAndProvider> {
        await this.app.whenReady()
    
        if (this.clientPromise == null) {
          // ここでつくる 
          this.clientPromise = this.configOnDisk.value.then(it => createClient(it, this, this.createProviderRuntimeOptions()))
        }
    
        const client = await this.clientPromise
        const stagingUserId = await this.stagingUserIdPromise.value
        client.setRequestHeaders(this.computeFinalHeaders({"x-user-staging-id": stagingUserId}))
        return {
          info: await client.getLatestVersion(),
          provider: client,
        }
      }
    
    
      private async loadUpdateConfig(): Promise<any> {
        if (this._appUpdateConfigPath == null) {
          this._appUpdateConfigPath = this.app.appUpdateConfigPath
        }
        return load(await readFile(this._appUpdateConfigPath, "utf-8"))
      }
    
    or SetFeed Url
      get appUpdateConfigPath(): string {
        return this.isPackaged ? path.join(process.resourcesPath!!, "app-update.yml") : path.join(this.app.getAppPath(), "dev-app-update.yml")
      }
    
    이것도cons tructor에서 옵션을 지정한 것으로 불린다.
     setFeedURL(options: PublishConfiguration | AllPublishOptions | string) {
        const runtimeOptions = this.createProviderRuntimeOptions()
        // https://github.com/electron-userland/electron-builder/issues/1105
        let provider: Provider<any>
        if (typeof options === "string") {
          provider = new GenericProvider({provider: "generic", url: options}, this, {
            ...runtimeOptions,
            isUseMultipleRangeRequest: isUrlProbablySupportMultiRangeRequests(options),
          })
        }
        else {
          provider = createClient(options, this, runtimeOptions)
        }
        this.clientPromise = Promise.resolve(provider)
      }
    

    autoUpdater.setFeedUrl()


    원래는 문서에서 사용하지 말라고 쓰여 있었다.
  • httpHeaders를 지정할 수 없는 것 같습니다.
  • https://github.com/electron-userland/electron-builder/blob/1643d569600/packages/electron-updater/src/AppUpdater.ts#L178
    cons tructor에서 지정한 녀석은 헤더를 유지하지만 set Feed Url에서는 무시됩니다.
    (혹은 실제로는 효과가 없다)
    https://github.com/electron-userland/electron-builder/blob/1643d569600a197858585e895e3176948d3eec85/packages/electron-updater/src/providerFactory.ts#L46
    https://github.com/electron-userland/electron-builder/blob/1643d569600a197858585e895e3176948d3eec85/packages/electron-updater/src/providers/GenericProvider.ts
    configuration에 헤더의 참고가 없습니다.
        if (options != null) {
          this.setFeedURL(options)
    
          if (typeof options !== "string" && options.requestHeaders) {
            this.requestHeaders = options.requestHeaders
          }
        }
    
      protected async getUpdateInfoAndProvider(): Promise<UpdateInfoAndProvider> {
        await this.app.whenReady()
    
        if (this.clientPromise == null) {
          this.clientPromise = this.configOnDisk.value.then(it => createClient(it, this, this.createProviderRuntimeOptions()))
        }
    
        const client = await this.clientPromise
        const stagingUserId = await this.stagingUserIdPromise.value
        // ここでheaderをつけている。
        client.setRequestHeaders(this.computeFinalHeaders({"x-user-staging-id": stagingUserId}))
        return {
          info: await client.getLatestVersion(),
          provider: client,
        }
      }
    

    NsisUpdater


      private computeFinalHeaders(headers: OutgoingHttpHeaders) {
        if (this.requestHeaders != null) {
          Object.assign(headers, this.requestHeaders)
        }
        return headers
      }
    
    quit에 불과하지만 quit 활동에는 hook이 있다.
      quitAndInstall(isSilent = false, isForceRunAfter = false): void {
        this._logger.info(`Install on explicit quitAndInstall`)
        const isInstalled = this.install(isSilent, isSilent ? isForceRunAfter : true)
        if (isInstalled) {
          setImmediate(() => {
            this.app.quit()
          })
        }
        else {
          this.quitAndInstallCalled = false
        }
      }
    
    그리고 설치어를 실행합니다.
    https://github.com/electron-userland/electron-builder/blob/1643d569600a197858585e895e3176948d3eec85/packages/electron-updater/src/NsisUpdater.ts#L117
    관리자 권한이 필요할 때elevate입니다.실행
    installer의 실제 상태는 다운로드한 exe처럼 보입니다
    https://github.com/electron-userland/electron-builder/blob/1643d569600a197858585e895e3176948d3eec85/packages/electron-updater/src/BaseUpdater.ts#L47
    https://github.com/electron-userland/electron-builder/blob/1643d569600a197858585e895e3176948d3eec85/packages/electron-updater/src/DownloadedUpdateHelper.ts#L55 this._fileprivte라서 여기 전부예요.
    nsis installer 다운로드되나요?
    Setup.exe 같은 걸 뱉은 것 같아. 아마 이게 설치 프로그램일 거야.이해
    응, Windows 기계가 없으면 조작하기 좀 어려워.
    download와 설치의 차이점

    좋은 웹페이지 즐겨찾기