electron (doc云文档)(2)打包部署及自动化更新

844 阅读2分钟

electron-builder 打包

  1. npm run pack

  2. npm i electron-builder -D

  • 打包包括

  • 打包 react 界面,npm run build

  • 打包 electron 相关的

  • electron 相关,用 webpack 优化下文件,主入口 main.js,直接打到和react项目同一个文件夹build中, npm run buildMain


// $ package.json

{

    "pack": "electron-builder --dir", // 可以直接打包成 安装后的应用程序,方便测试

    "dist": "electron-builder", // 打包成安装包

    "prepack": "npm run build && npm run buildMain",

    "predist": "npm run build && npm run buildMain",

    "build": "react-scripts build",

    "buildMain": "webpack",

}

  • bundle electron 文件,用webpack优化下,直接打到和react项目同一个文件夹build中

/**

* 打包 electron 主进程相关js文件,作为 electron 的起始入口。如 main,menuTemplate

*/

const path = require('path')

module.exports = {

    target: 'electron-main',

    entry: './main.js',

    mode:'production',

    output: {

        path: path.resolve(__dirname, './build'),

        filename: 'main.js'

    },

    node: { // 这个感觉不打开也行

        __dirname: false

    }

}

  • 记得在 pkg 中设置 electron 入口文件, 打包后的地址

"extraMetadata": {

    "main": "./build/main.js" // 修改 electron 打包后的主入口

},

"extends": null, // 修改 electron 打包后的主入口

优化打包产物

反解析打包产物

  1. 打包后,主要的文件,是 app.asar , asar 是 electron 的一个加密文件,保护源码,可以使用 asar 反解析

  2. npm i asar -g 可以反解析 app.asar 看看打包里面是啥


asar extract ./dist/mac/七牛云文档.app/Contents/Resources/app.asar ./app

  1. 反解析打包后的产物

    1. Resources

      1. App.asar

        1. react build 静态文件

        2. node_modules

        3. Electron主进程代码

优化思路

  1. electron 不会打包 devDependencies,所以单独的react中的依赖,全部放在 devDependencies 中;如果是主进程需要的,还是要在 dependencies 中,node_module要打进去
  1. 主进程的代码,main.js 可以用 webpack 直接打一个 bundle 和 react build 的放在一起

"homepage": "./", // 修改 cra 生成的静态文件(默认是绝对路径),修改为相对路径

"build": {

    "appId": "cloudDoc",

    "productName": "七牛云文档",

    "copyright": "Copyright © 2023 ${author}",

    "files": [ // 声明需要 electron 打包的文件,集成在 app.asar 中

        "build/**/*", // react 打包的文件

        "dist/**/*", // 打包出的 应用

        "node_modules/**/*", // 主进程中的依赖,直接放进去

        "settings/**/*", // 七牛云项目,业务中的 “设置”页面(单独的静态文件)

        "package.json"

    ],

    "directories": {

        "buildResources": "assets" // 静态资源的目录,如小icon

    },

    "extraMetadata": {

        "main": "./build/main.js" // 修改 electron 打包后的主入口

    },

    "publish": [

        "github"

    ],

    "extends": null, // 修改 electron 打包后的主入口

    "mac": {

        "category": "public.app-category.productivity", // mac 下的应用程序的 分类

        "artifactName": "${productName}-${version}-${arch}.${ext}"

    },

    "dmg": {

        "background": "assets/appdmg.png", // 到 assets 下找到文件

        "icon": "assets/icon.icns",

        "iconSize": 100,

        "contents": [

            {

                "x": 380,

                "y": 280,

                "type": "link",

                "path": "/Applications"

            },

            {

                "x": 110,

                "y": 280,

                "type": "file"

            }

        ],

        "window": {

            "width": 500,

            "height": 500

        }

    },

    "win": {

    "target": [

        "msi",

        "nsis"

    ],

    "icon": "assets/icon.ico",

    "artifactName": "${productName}-Web-Setup-${version}.${ext}",

    "publisherName": "raoju"

    },

    "nsis": {

        "allowToChangeInstallationDirectory": true,

        "oneClick": false,

        "perMachine": false

    }

},

部署

  1. 托管到github中,需要 github Token

  2. 执行publish,会在github上生成 draft 草稿,再在github上发布


{

// TOKEN 加在环境变量中

"release": "cross-env GH_TOKEN=??? electron-builder",

"prerelease": "npm run build && npm run buildMain",

}

electron-updater 自动化更新

  1. npm i electron-updater -D

// main.js

const { autoUpdater } = require('electron-updater')

const checkUpdate = () => {

    if(isDev){

        // 本地调试自动更新,手动指定加载对应的更新配置文件,

        // 自己写一个测试配置文件 dev-app-update.yml

        autoUpdater.updateConfigPath = path.join(__dirname,'dev-app-update.yml')

    }

    autoUpdater.autoDownload = false

    autoUpdater.checkForUpdatesAndNotify()

    autoUpdater.on('error',error =>{

        dialog.showErrorBox('Error: ',error === null?"unknown":(error.stack))

    })
    

    autoUpdater.on('update-available',()=>{

        dialog.showMessageBox({

            type:'info',

            title:'应用有新的版本',

            message:'发现新版本,是否现在更新',

            buttons:['是','否'],

            },(buttonIndex)=>{

                if(buttonIndex === 0){

                    autoUpdater.downloadUpdate()

                }

                autoUpdater.on('download-progress', (progressObj) => {

                let log_message = "Download speed: " + progressObj.bytesPerSecond;

                log_message = log_message + ' - Downloaded ' + progressObj.percent + '%';

                log_message = log_message + ' (' + progressObj.transferred + "/" + progressObj.total + ')';

                console.log(log_message);

            })

            autoUpdater.on('update-downloaded', (info) => {

                console.log('Update downloaded');

            })

        })

    })

}

// 在 ready 时,检查

app.on('ready', () => {

    // 检查自动更新

    checkUpdate()

    // ...

})

  • dev-app-update.yml 用于本地测试自动更新

# 开发环境,测试自动更新,配置文件

owner:rowin90

repo:electron-doc

provider:github