Electron 在linux上打包 ---- 国产龙芯

592 阅读5分钟

龙芯开源社区

配置信息

1. vue.config.js

由于我这边项目是使用vue-cli构建的,所以附上vue.config.js的配置信息,主要是linux部分

const { defineConfig } = require("@vue/cli-service");

const AutoImport = require("unplugin-auto-import/webpack");
const Components = require("unplugin-vue-components/webpack");
const { ElementPlusResolver } = require("unplugin-vue-components/resolvers");

const Icons = require("unplugin-icons/webpack");
const IconsResolver = require("unplugin-icons/resolver");
const path = require("path");
const pathSrc = path.resolve(__dirname, "src");

module.exports = defineConfig({
  transpileDependencies: true, // 以避免构建后的代码中出现未转译的第三方依赖;Default `false` babel-loader 会忽略所有node_modules中的文件
  lintOnSave: false, // 取消在开发环境下通过eslint-loader 在每次保存时 lint 代码。
  parallel: false, // 不在生产构建的时候,使用多线程来构建项目,Default 默认启用 thread-loader
  pluginOptions: {
    electronBuilder: {
      preload: "src/preload.ts",
      customFileProtocol: "./", //打包后iconfont路径指向
      builderOptions: {
        // options placed here will be merged with default configuration and passed to electron-builder
        productName: "ip-broadcast", //项目名,也是生成的安装文件名,即ip-broadcast.exe
        appId: "com.example.ip-broadcast",
        copyright: "itc © 2023", //版权信息
        // 设置用户可选择安装目录
        nsis: {
          // "oneClick" : false,// 是否一键安装
          // "allowToChangeInstallationDirectory" : true, // 允许修改安装目录
          installerIcon: "public/ip.ico", // 安装图标
          uninstallerIcon: "public/ip.ico", //卸载图标
          installerHeaderIcon: "public/ip.ico", // 安装时头部图标
          createDesktopShortcut: true, // 创建桌面图标
          createStartMenuShortcut: true, // 创建开始菜单图标
          shortcutName: "ip-broadcast", // 图标名称
          deleteAppDataOnUninstall: true, // 卸载时删除 localStorage 数据
          // "include": "./installer.nsh", // 配置 nsn 如修改默认安装目录
          // "license": "./public/license_zh_CN.txt", // 用户协议-指定语言路径
          // "displayLanguageSelector": true, // 语言选择配置
        },
        // "directories": {//输出文件夹
        //   "buildResources": "./public", // 用户协议-支持多语言
        // },
        win: {
          //win相关配置
          // "requestedExecutionLevel": "highestAvailable", // requireAdministrator: 管理员权限, highestAvailable: 可用的最高权限, asInvoker: 默认配置
          icon: "public/ip.ico", //图标,当前图标在icon目录下,注意这里有两个坑
          target: [
            {
              target: "nsis", // 使用nsis打成安装包,打包成免安装版
              arch: [
                "x64", //64位
                // "ia32"//32位
              ],
            },
          ],
        },
        dmg: {
          // macOSdmg macOS系统上常用的安装包格式
          contents: [
            {
              x: 410,
              y: 150,
              type: "link",
              path: "/Applications",
            },
            {
              x: 130,
              y: 150,
              type: "file",
            },
          ],
        },
        mac: {
          // mac
          icon: "./icon/icon.icns",
        },
        linux: {
          // linux
          icon: "./src/assets/images/logo-linux.png",
          target: [
            {
              target: "deb", // 使用deb打成安装包
            },
          ],
          category:"Development",
        },
      },
    },
  },
  /**
* webpack 配置进行更细粒度的修改  https://cli.vuejs.org/zh/config/#chainwebpack
*/
  chainWebpack(config) {
    // 移除 prefetch 插件
    // prefetch 插件 通常用于在路由导航时 自动预加载页面资源,以提升用户体验,不过可能导致首屏展示到用户可操作性的时间增加
  config.plugins.delete("prefetch");
  // set environment variables 消除 vue-i18n 的 esm-bundler 构建警告
  // 详情查看 https://github.com/intlify/vue-i18n-next/issues/789
  config.plugin("define").tap((definitions) => {
  Object.assign(definitions[0], {
  // ... rest of your injected vars here
  // get rid of vue-i18 warning
  __VUE_I18N_FULL_INSTALL__: JSON.stringify(true),
  __INTLIFY_PROD_DEVTOOLS__: JSON.stringify(false),
  __VUE_I18N_LEGACY_API__: JSON.stringify(false),
  });

  return definitions;
  });
  },
  configureWebpack: {
  // 路径别名配置
  resolve: {
  alias: {
  "@": pathSrc,
  assets: "@/assets",
  components: "@/components",
  views: "@/views",
  },
  },
  /**
  * 向全局自动导入插件配置,配置详情:
  * unplugin-auto-import: https://github.com/antfu/unplugin-auto-import
  * unplugin-vue-components: https://github.com/antfu/unplugin-vue-components
  */
  plugins: [
  AutoImport({
  // 目标文件
  include: [
  /.[tj]sx?$/, // .ts, .tsx, .js, .jsx
  /.vue$/, // .vue
  /.vue?vue/, 
  /.md$/, // .md
  ],
  // 全局注册导入,详情看 auto-imports.d.ts 文件
  imports: [
  "vue",
  "pinia",
  "vue-router",
  {
  "@/utils/storage": [
  // 命名导入 import { localStorage } from '@/utils/storage'
  "localStorage",
  ],
  "@/store/get_store": [["default", "getStore"]],
  "@/utils/global/index": [["default", "usePublicMethod"]],
  "@/utils/global/format_map_type": [["default", "useFormatMap"]],
  "@/utils/global/config": [["default", "useConfig"]],
  "@/utils/global/regex": [["default", "useRegex"]],
  "@/utils/vue/use_current_instance": [
  ["default", "useCurrentInstance"],
  ],
  axios: [
  // 默认导入 import { default as axios } from 'axios'
  ["default", "axios"],
  ],
  },
  ],
  // 声明文件生成位置和文件名称
  dts: path.resolve(pathSrc, "auto-imports.d.ts"),
  // 解析器来进行组件声明
  resolvers: [
  // Element Plus 组件相关函数(带样式)
  ElementPlusResolver(),
  // 图标组件
  IconsResolver({
  prefix: "Icon",
  }),
  ],
  // eslint报错解决
  eslintrc: {
  enabled: true, // Default `false`
  filepath: "./.eslintrc-auto-import.json",
  globalsPropValue: true,
  },
  }),
  Components({
  // 自定义组件的解析器
  resolvers: [
  // Element Plus 组件
  ElementPlusResolver(),
  // 图标库组件
  IconsResolver({
  enabledCollections: ["ep"],
  }),
  ],
  // 声明文件生成位置和文件名称
  dts: path.resolve(pathSrc, "components.d.ts"),
  }),
  Icons({
  autoInstall: true,
  }),
  ],
  },
  /**
  * 向全局sass样式传入共享的全局变量, $src可以配置图片cdn前缀
  * 配置详情: https://cli.vuejs.org/zh/guide/css.html#%E5%90%91%E9%A2%84%E5%A4%84%E7%90%86%E5%99%A8-loader-%E4%BC%A0%E9%80%92%E9%80%89%E9%A1%B9
  */
  css: {
  loaderOptions: {
  scss: {
  // 注意:在 sass-loader v8 中,这个选项名是 "prependData"
  // 但是在配置 `prependData` 选项的时候
  // `scss` 语法会要求语句结尾必须有分号,`sass` 则要求必须没有分号
  additionalData: `
  @import "@/assets/css/color.scss";
  `,
  },
  },
  },
  /**
  * 如果你不需要生产环境的 source map,可以将其设置为 false 以加速生产环境构建。
  * 打包之后发现map文件过大,项目文件体积很大,设置为false就可以不输出map文件
  * map文件的作用在于:项目打包后,代码都是经过压缩加密的,如果运行时报错,输出的错误信息无法准确得知是哪里的代码报错。
  * 有了map就可以像未加密的代码一样,准确的输出是哪一行哪一列有错。
  */
  productionSourceMap: false,
  /**
  * 详情看官网:https://cli.vuejs.org/zh/config/
  * 支持webPack-dev-server的所有选项
  * host: 可以直接写IP地址这样方便真机测试
  * port: 端口号
  * open: 配置自动启动浏览器
  * proxy: 配置多个代理
  */
  devServer: {
  host: "127.0.0.1",
  port: 8010,
  open: false,
  // open: true,
  // https: true,
  proxy: {
  "/api/v29+": {
  target: "http://172.16.39.123:81",
  changeOrigin: true,
  },
  "/api/v1/": {
  target: "http://127.0.0.1:9999",
  changeOrigin: true,
  },
  },
  },
  });

2. package.json

{
  "name": "ip-broadcast",
  "version": "3.0.6",
  "private": true,
  "description": "ip广播3.0", // linux
  "homepage": "https://www.itc.vip/", // linux
  "asar": false, // linux
  "author": { // linux
    "name": "itc",
    "email": "xxx"
  },
  "license": "CC0-1.0", // linux
  "repository": "/IPBroadCastV3.0/IPBroadCastWeb-Electron", // linux
  "keywords": [ // linux loong
    "Electron",
    "quick",
    "start",
    "tutorial",
    "demo"
  ],
  "scripts": {
    "serve": "vue-cli-service serve",
    "build": "vue-cli-service build",
    "lint": "vue-cli-service lint",
    "electron:build": "vue-cli-service electron:build",
    "electron:serve": "vue-cli-service electron:serve",
    "postinstall": "electron-builder install-app-deps",
    "postuninstall": "electron-builder install-app-deps"
  },
  "dependencies": {
    "@element-plus/icons-vue": "^2.0.4",
    "axios": "^1.3.4",
    "core-js": "^3.8.3",
    "element-plus": "^2.3.1",
    "pinia": "^2.0.14",
    "pinia-plugin-persist": "^1.0.0",
    "ts-md5": "^1.2.11",
    "vue": "^3.2.47",
    "vue-i18n": "^9.2.2",
    "vue-router": "^4.0.3",
    "vue-upload-component": "^3.1.2"
  },
  "devDependencies": {
    "@types/electron-devtools-installer": "^2.2.0",
    "@typescript-eslint/eslint-plugin": "^5.4.0",
    "@typescript-eslint/parser": "^5.4.0",
    "@vue/cli-plugin-babel": "~5.0.0",
    "@vue/cli-plugin-eslint": "~5.0.0",
    "@vue/cli-plugin-router": "~5.0.0",
    "@vue/cli-plugin-typescript": "~5.0.0",
    "@vue/cli-service": "~5.0.0",
    "@vue/eslint-config-typescript": "^9.1.0",
    "electron": "^17.0.0",
    "electron-devtools-installer": "^3.1.0",
    "eslint": "^7.32.0",
    "eslint-plugin-vue": "^8.0.3",
    "sass": "^1.32.7",
    "sass-loader": "^12.0.0",
    "typescript": "~4.7.4",
    "unplugin-auto-import": "^0.8.7",
    "unplugin-icons": "^0.14.3",
    "unplugin-vue-components": "^0.19.6",
    "vue-cli-plugin-electron-builder": "^3.0.0-alpha.4"
  },
  "volta": {
    "node": "16.16.0",
    "yarn": "1.22.1"
  }
}

龙芯系统下构建项目步骤

1. // 安装nvm
wget -c http://ftp.loongnix.cn/nodejs/npm-registry/LoongArch/abi-v1.0/nvm/nvm-0.39.1.tar.gz

export NVM_DIR="$HOME/.nvm"

tar -xf nvm-0.39.1.tar.gz

mv nvm-0.39.1 $NVM_DIR

export NVM_DIR="$HOME/.nvm"

bash $NVM_DIR/nvm.sh

[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"

2. // 安装node
nvm ls-remote node

nvm install 16.17.1(安装与项目最近的版本)

3. // 拉代码
git clone https://github.com/electron/electron-quick-start.git(拉代码)

4. // 设置龙芯npm源
npm config set registry https://registry.loongnix.cn:4873/

5. // 安装electron
ELECTRON_MIRROR=http://ftp.loongnix.cn/electron/LoongArch/ electron_use_remote_checksums=1 npm install electron@20.0.3
	// 最好用高一点版本的,我使用17.4.0 就遇到了很多不兼容的坑

6. // 安装electron-builder
npm i electron-builder@23.0.3 --verbose
	// 这个版本有做vue-cli-electron-builder 的适配,同时也有python版本的适配,有些会因为python2与python3版本的问题而报一些错
	// 这个版本是官方测试通过的,可以少遇坑

7. // 安装龙芯特等依赖
sudo apt-get install ruby ruby-dev rubygems build-essential

sudo gem install --no-document fpm(安装完electron-builder之后再安装,不同版本的electron-builder的fpm会有差别)

export USE_SYSTEM_FPM="true"

8. 打包构建
npm run build

问题解析

  1. 这里不知什么原因:electron-builder的version一直显示22.14.13,可能之前设置的缓存问题,但是实际如果不是重新安装了23.0.3版本的话,是会报错的

  1. electron-builder@23.0.3 + electron@17.4.0

  1. 在上述 2 的基础上重装electron-builder@23.0.3

ps:这就是需要重新重复

  1. 这是安装了多个electron版本后导致的,最好是重新开一个文件夹重头开始

  1. 这种情况就是需要用electron-builder@23.0.3版本