Thiết lập trình cập nhật tự động điện tử với máy chủ riêng (nhà cung cấp chung)


8

Tôi có máy chủ của riêng mình, nơi tôi đã tải lên trình cài đặt ứng dụng qua FTP. Tên của nó là quickmargo Setup 1.0.0.exevà nó có sẵn tại

https://quickmargo.pl/dist/doad/quickmargo Setup 1.0.0.exe

Cũng thông qua FTP tôi đã tải lên latest.ymlcùng một thư mục và nó có sẵn tại

https://quickmargo.pl/dist/doad/latest.yml

Trong dự án của tôi trong index.js tôi có

import { autoUpdater } from 'electron-updater'

autoUpdater.setFeedURL('https://quickmargo.pl/dist/download');

autoUpdater.on('update-downloaded', () => {
    autoUpdater.quitAndInstall()
});

autoUpdater.on('update-available', (ev, info) => {
    alert('Update required!');
});

app.on('ready', async () => {
    if (process.env.NODE_ENV === 'production') {
        await autoUpdater.checkForUpdates()
    }
});

Trong gói.json tôi có "version": "1.0.0",và bên trong build:{}tôi có:

"win": {
  "icon": "build/icons/icon.ico",
  "publish": [{
    "provider": "generic",
    "url": "https://quickmargo.pl/dist/download"
  }]
},

(Tôi không quan tâm đến các nền tảng khác)

Bây giờ, giả sử tôi đã thực hiện một số thay đổi trong ứng dụng của mình và tôi muốn tải lên phiên bản 1.0.1 và tôi muốn ứng dụng của mình tự động cập nhật nếu ai đó đã tải xuống trình cài đặt và cài đặt ứng dụng của tôi trên máy của anh ấy.

Xin vui lòng cho tôi biết nếu tất cả mọi thứ tôi làm cho đến nay là tốt và bước tiếp theo là gì. Tôi xem xét như sau:

  • thay đổi versionthành 1.0.1trong gói.json
  • chạy lệnh build trong terminal lần nữa
  • tải lên trình cài đặt mới theo cách thủ công đến cùng một vị trí tại máy chủ của tôi

Biên tập

Tôi đã thực hiện trên ba bước cộng với tôi cũng đã tải lên bản mới nhất.yml (với phiên bản 1.0.1) và kết quả là khi tôi chạy cài đặt trước đó (trước khi tải phiên bản mới lên máy chủ) phiên bản 1.0.0 trên PC khác thì không phát hiện ra rằng tôi đã thêm 1.0.1 vào máy chủ và nó không cập nhật hoặc hiển thị một số cửa sổ bật lên hoặc bất cứ thứ gì. Tôi đang làm gì sai?

Chỉnh sửa 2

Tôi đang cố gắng tự mình giải quyết và bây giờ tôi đã tải lên 1.0.2 vì vậy bây giờ liên kết để tải xuống ứng dụng là:

https://quickmargo.pl/dist/doad/quickmargo Cài đặt 1.0.2.exe

Chỉnh sửa 3

Tôi đã cố gắng tự giải quyết nó bằng mã tôi đã chỉnh sửa trong index.js. Tôi cũng chỉnh sửa ở trên. alert('Update required!');về update-availablesự kiện không bao giờ xảy ra. Nó sẽ hiển thị cho tôi cửa sổ thông báo lỗi rằng cảnh báo là không xác định. Nhưng rõ ràng sự kiện cập nhật có sẵn không bao giờ được phát ra.


Thông tin bổ sung:

  • Ứng dụng của tôi đã được tạo ra với nồi hơi vue-electron v1.0.6 .
  • Phiên bản cập nhật điện tử của tôi là 4.1.2
  • npm run buildthực sự gọi một số mã từ mẫu soạn sẵn, .electron-vue/build.jsbạn có thể thấy tệp này trong liên kết ở trên (ví dụ: nó đặt NODE_ENV để sản xuất. Script trong pack.json là : "build": "node .electron-vue/build.js && electron-builder",.
  • Tôi không muốn lưu trữ các bản phát hành tại github vì kho lưu trữ của tôi là riêng tư và tôi đã thấy một số thông tin trong các tài liệu electron.build mà tôi không làm điều đó.
  • Tôi cũng thấy thông tin trong một số vấn đề rằng tôi chỉ có thể tạo repo mới cho các bản phát hành nhưng tôi coi việc lưu trữ mọi thứ tại máy chủ của mình là cách tiếp cận rõ ràng hơn.

Có một ví dụ ở đây: github.com/iffy/electron-updater-example bao gồm các cập nhật "tùy chỉnh"
Lawrence Cherone

Vậy tôi đã làm gì sai?
dopeCode

Chạy ứng dụng đóng gói của bạn thông qua cmd để xem nhật ký, có những điều này trong câu hỏi có thể hữu ích
oktapodia

Tôi có cần ứng dụng được ký với chứng chỉ để chạy tự động cập nhật chính xác không?
dopeCode

@dopeCode không, autoupdate nên làm việc mà không cần chữ ký mã số, nếu bạn không nhìn thấy bất kỳ lỗi sau khi bắt đầu xây dựng exe của bạn ở nhà ga, sử dụng một logger như electron-logđể cung cấp cho các Autoupdater một logger để sử dụng ( const logger = require("electron-log"); autoUpdater.logger = logger; logger.transports.file.level = "debug";) - điều này nên in ra thông tin nếu bạn máy chủ đã được tìm thấy và liệu một bản cập nhật đã được tìm thấy. Nếu bạn gặp lỗi, bạn có thể thêm nó vào câu hỏi của mình.
Rhayene

Câu trả lời:


9

Tôi đã có thể thiết lập cấu hình cập nhật tự động bằng generictùy chọn xuất bản theo tài liệu, chưa bao giờ thực hiện trước đó. Vì vậy, nó hoàn toàn có thể thực hiện được và nó không yêu cầu ký thông qua chứng chỉ, nhưng ban đầu tôi gặp vấn đề vì tôi đã thiết lập publisherNamecấu hình bản dựng, nhưng không có chứng chỉ. Nếu phiên bản hiện tại có nhà xuất bản hoặc chứng chỉ được chỉ định và phiên bản mới thì không, nó cũng sẽ không được cài đặt.

1. Cho phép đăng nhập

Bạn có thể kích hoạt ghi nhật ký electron-updatergói bằng cách cài đặt electron-logvà sau đó gán logger cho autoUpdater:

const log = require('electron-log');
autoUpdater.logger = log;
autoUpdater.logger.transports.file.level = 'info';

Đường dẫn đầu ra mặc định là:

  • Linux: ~/.config/<app name>/log.log
  • hệ điều hành Mac: ~/Library/Logs/<app name>/log.log
  • Các cửa sổ: %USERPROFILE%\AppData\Roaming\<app name>\log.log

Nếu các bước sau không giải quyết được vấn đề của bạn, vui lòng đăng nội dung nhật ký.

2. Đừng gọi autoUpdater.setFeedURL()

Các tài liệu chính thức nêu rõ:

Đừng gọi setFeedURL . Trình tạo electron tự động tạo app-update.ymltệp cho bạn khi xây dựng resources(tệp này là nội bộ, bạn không cần phải biết về nó).

URL đã được xác định trong publishđối tượng nhà cung cấp của bạn và điều đó đủ để trình cập nhật hoạt động. Ngoài ra, một chuỗi URL làm đối số setFeedURL()là không chính xác, nó phải là một đối tượng tùy chọn . Nhưng một lần nữa, chỉ định mọi thứ trong publishnhà cung cấp của bạn là đủ.

3. Đồng thời tải các .blockmaptệp lên máy chủ của bạn

Chúng nên được tạo khi xây dựng cùng với .execác tập tin thiết lập của bạn . Nếu không, bạn sẽ thấy lỗi trong nhật ký của mình rằng không thể tìm thấy các tệp của phiên bản cũ và mới để so sánh.

4. Thêm dấu gạch chéo vào URL máy chủ cập nhật của bạn

Đảm bảo rằng urltham số của đối tượng nhà cung cấp của bạn kết thúc bằng dấu gạch chéo. Mặc dù tệp yml vẫn có thể được tìm thấy mà không có nó, nhưng có thể có vấn đề trong quá trình tải xuống thực tế.

5. Thử phương pháp đơn giản hơn bằng cách sử dụng autoUpdater.checkForUpdatesAndNotify()

Thay vì sử dụng cách linh hoạt hơn, nhưng cũng phức tạp hơn, hãy lắng nghe các sự kiện cập nhật khác nhau và phản ứng với chúng trong ứng dụng của bạn, trước tiên hãy thử làm cho nó hoạt động với đoạn mã sau. Khi nó hoạt động, bạn vẫn có thể quay lại xử lý các sự kiện khác nhau để có trải nghiệm người dùng tốt hơn.

app.on('ready', async () => {
  autoUpdater.checkForUpdatesAndNotify();
});

Điều này sẽ kiểm tra và tải xuống bản cập nhật trong nền và tự động cài đặt nó ngay khi bạn đóng ứng dụng của mình. Một thông báo mặc định của Windows sẽ bật lên để thông báo cho bạn về bản cập nhật có sẵn và quy trình.


Tôi đã thêm logger và bây giờ tôi thấy rằng nó thực sự tìm thấy bản phát hành mới, nó thậm chí còn cho thấy cần phải tải xuống bao nhiêu kb: Full: 151,317.35 KB, To download: 1,152.69 KB (1%) nhưng sau đó không có gì xảy ra .. Ứng dụng không cập nhật. Bạn có chắc checkForUpdatesAndNotifylà đủ để thoát ứng dụng nếu tìm thấy bản phát hành mới sau đó tải xuống bản phát hành mới và cài đặt nó không?
dopeCode

Vâng, tôi đã thêm người nghe này một lần nữa và update-availabletôi đăng nhập một số văn bản mà tôi có thể thấy nhưng update-downloadedkhông bao giờ được phát ra vì tôi không thể thấy nhật ký về sự kiện này. Điều gì có thể là lý do mà nó không bắt đầu / kết thúc (tbh tôi thậm chí không biết cái nào) tải xuống?
dopeCode

checkForUpdatesAndNotifysẽ hiển thị thông báo sau khi quá trình tải xuống thành công và sau đó ứng dụng sẽ cập nhật khi bạn đóng nó. Nhưng nếu update-downloadedsự kiện không bao giờ nổ ra, bạn sẽ không đi xa đến thế. Tuy nhiên, thật khó để tôi nói điều gì gây ra vấn đề.
Constantin Groß

Vâng, về cơ bản, hành vi của tôi update-availableđược phát ra nhưng update-downloadedkhông phải. Tôi không biết tại sao. Tôi sẽ cố gắng tái tạo nó, kho lưu trữ mới.
dopeCode

Yhm bây giờ nó bắt đầu làm việc. Mặc dù tôi đã không thay đổi một dòng mã. Tôi chỉ đợi như một ngày, trong thời gian đó PC cũng khởi động lại. Nó hoạt động nhưng nó đang tải xuống ứng dụng đầy đủ và nó báo lỗi: Cannot download differentially, fallback to full download: Error: Received data length 1527 is not equal to expected 634.Ngoài ra, nó cố gắng cập nhật sau khi thoát ứng dụng và xin phép quản trị viên. Và nếu tôi không cho phép thì tôi có thể chạy lại ứng dụng với phiên bản trước đó là hành vi mà tôi không muốn. Tôi muốn buộc người dùng cài đặt bản cập nhật. Tôi đang sử dụng autoUpdater.quitoAndInstall () nhưng không thoát.
dopeCode
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.