欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

electron 如何将任意资源打包的方法步骤

程序员文章站 2022-03-23 07:49:57
如何打包资源只想写个图形小工具,本质上还是调用写好的 java 程序,因为我觉得在命令行里面来回切目录,复制路径等操作实在是太麻烦了。那么我现在已经搞定了如何从 electron 的 js 事件里获得...

如何打包资源

只想写个图形小工具,本质上还是调用写好的 java 程序,因为我觉得在命令行里面来回切目录,复制路径等操作实在是太麻烦了。

那么我现在已经搞定了如何从 electron 的 js 事件里获得文件路径,我也搞定了如何在 electron 的 main.js 里面创建新的进程执行指令,那么如何使用到打包好的 jar 包或者其他资源呢?

直接看下 packages.json 里面吧。

{
 "name": "....",
 "version": "1.0.0",
 "description": "",
 "main": "main.js",
 "scripts": {
  "start": "export favor=debug && electron .",
  "pack": "electron-packager ./ yourappname --platform=darwin --arch=x64 --app-version=0.0.1 --app-bundle-id=com.xxxx.yourappname --out=build --overwrite --extra-resource='./extraresources'"
 },
 "build": {
  "extraresources": [
   "./extraresources/**"
  ]
 },
 
}

需要注意的是 build 里面加了一个 extraresources,另外,通过 electron-packager 打包的参数里面也加上一个 --extra-resource='./extraresources'

然后打包的时候就可以把你想要的任何文件打包进去了,jar 也好,python 脚本也好。

如何引用资源

需要注意的是,debug 运行和 release 运行是不一样的,这里,我们就需要一个东西来在运行时区分,我现在是 debug 还是 release。

注意上面的 json 脚本中,有一个 export favor=debug,这个相当于在 debug 运行的时候加入了一个环境变量。

怎么读取环境变量呢?在 main.js 里面这样读取:

console.log("favor: " + process.env.favor)

接下来就是区分运行时来获取资源路径了。

function getrespath() {
 if (isdebug) {
  return "./extraresources"
 } else {
  return process.resourcespath + "/extraresources"
 }
}

仅此记录一下,给可能需要的人。

electron打包的一些坑

我们知道使用electron打包的时候设置asar为true,electron-builder会智能的把一些native的程序不打包到app.asar里面,但是我碰到一个很奇怪的问题,周五的时候需要使用语音的格式转换,用到了amrtomp3和ffmpeg-static这两个库,其中amrtomp3的主要代码:

const exec = require('child_process').exec
const path = require('path')
const ffmpeg = require('ffmpeg-static')
const ffmpegpath = ffmpeg.path
function amrtomp3(filepath, outputdir = './src/mp3') {
 return new promise((resolve, reject) => {
  const basename = path.basename(filepath)
  const filename = basename.split('.')[0]
  const etc = basename.split('.')[1]
  if (etc != 'amr') {
   console.log('please input a amr file')
   return
  }
  const cmdstr = `${ffmpegpath} -y -i ${filepath} ${outputdir}/${filename}.mp3`
  exec(cmdstr, (err, stdout, stderr) => {
   if (err) {
    console.log('error:' + stderr)
    reject('error:' + stderr)
   } else {
    resolve(`${outputdir}/${filename}.mp3`)
    console.log(`transform to mp3 success! ${filepath}->${outputdir}/${filename}.mp3`)
   }
  })
 })
}

其中用到了exec这个命令,ffmpegpath打包后基本是****/app.asar/src/node_modules/ffmpeg-static/bin/darwin/x64/ffmpeg,但是打包后运行提示了can not found ****/app.asar/src/node_modules/ffmpeg-static/bin/darwin/x64/ffmpeg 很尴尬,但是我去解压了,明明是存在的,后来我去看了类似的一个库node-notifier,发现用的是execfile这个命令,然后我修改了一下,结果。。。。居然就可以了。这个地方谁知道原因,求解答。。。。

修改之后的程序代码:

var ffmpegpath = path.join(
 __dirname,
 'bin',
 platform,
 arch,
 platform === 'win32' ? 'ffmpeg.exe' : 'ffmpeg'
)

execfile(ffmpegpath, ['-y', '-i', inputpath, cmdstr], function (err, stdout, stderr) {
 if (err) {
  console.log('error:' + stderr);
  reject('error:' + stderr);
 } else {
  resolve(outputdir + '/' + filename + '.mp3');
  console.log('transform to mp3 success! ' + filepath + '->' + outputdir + '/' + filename + '.mp3');
 }
});

到此这篇关于electron 如何将任意资源打包的方法步骤的文章就介绍到这了,更多相关electron 任意资源打包 内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!