electron-packager 如何正确处理第三方资源的打包问题
发布于 作者:苏南大叔 来源:程序如此灵动~作为新人打包之后,必掉大坑之一。第三方资源的使用,总是出问题。比如:调用的第三方exe
怎么找不到了啊?为啥注册表文件消失了啊?ffmpeg
咋失效了啊?音乐视频为啥不能播放了啊?诸如此类的问题,很多。上述论点总是附带一个前提,那就是:"打包之后"。
那么,请问,打包的过程中,究竟发生了什么?您想过么?本文主要描述的是electron-packager
如何正确处理第三方资源的打包问题,其它打包工具也是类似的。大家请仔细查看相关文档。
作为苏南大叔推荐大家使用的electron
打包工具,electron-packager
的命令行模式,还是非常好用的。在本篇文字中,苏南大叔将要和大家分享的是:electron-packager
的两个参数,--extra-resource
和 --ignore
。把这两个参数单独拿出来进行讨论的原因,还要从electron-packager
的--asar
参数说起。
前言
大家都知道:electron
的世界里面,有个asar
的打包概念。体现在electron-packager
上的话,就是--asar
:
electron-packager ./ --asar
asar
可以把源码打包到一个文件里面,进而获得一定的代码加密和整合的效果。但是,默认情况下,这个asar
里面的文件,是无差别的打包的。会把一些无用的文件打包进去,甚至一些额外的第三方程序。对于后者,第三方程序打包到asar
之后,虽然代码逻辑层面还行得通。但是执行效果上,却报错了,无法找到这些第三方程序。具体的症状就是:开发的时候,一切正常。一旦打包(打包成asar
),就报错了。
当然,在这里,苏南大叔还要特别说明几句,就是:打包,可不一定有asar
包的出现的。但是,对于大多数小白来说,asar
包的出现是必然的。一旦出现了asar
包,试图调用里面的第三方程序或资源的时候,就一定会报错。换句话说:打包只要不打asar
包,一般不会有大问题。打了asar
包,就一定要特别注意第三方资源的路径问题。
extra-resource
和 ignore
electron-packager
使用了--asar
参数的话,您就很可能需要这两个参数:ignore
和 extra-resource
。
ignore
,在将默认打包的范围内,排除掉一些不打包进去的。例如第三方资源文件,是无论如何,都不能打包到asar
里面的。打包进去的话,或者没有用,占体积。或者影响程序逻辑实现,不能访问到这些第三方资源。extra-resource
,可以将第三方资源,在打包的时候,复制到app.asar
的同级目录。
这两个参数的组合效果就是:把第三方资源文件,提升一个目录层级,从app.asar
的内部,提升到app.asar
的同级。
如果仅仅设置extra-resource
,而不设置ignore
的话,app.asar
里面就会有一份多余的resource
文件。具体见下图。
比如在上述例子中,没有设置ignore
,app.asar的大小是54.7M
,而设置了ignore
,app.asar
的大小是6.7M
。这差额就是res
目录内的文件大小。所以,我们可以得出结论:ignore
参数的设置,还是非常有必要的。
参数的使用范例
下面的例子中,第三方资源都存在于项目根目录下面的res
文件夹中,我们希望把这个electron
打包,并使用asar
加密相关代码。
electron-packager ./ app --asar --ignore=res/ --extra-resource=res/
需要特别指明的是:如果要ignore
的目录或文件,是很多个的话,直接在命令行里面,叠加很多个--ignore=
即可。extra-resource
也是类似的用法,直接在命令行里面,叠加很多个--extra-resource=
即可。
相关内容
- 《electron的asar的具体用法,asar解密加密》 https://newsn.net/say/electron-asar.html
- 《electron-packager命令常用参数大全(含换图标方案》 https://newsn.net/say/electron-packager-command.html
强烈建议您看完本文之后,阅读下面这篇配套文章:
总结
本文中,苏南大叔向大家展示了:在electron-packager
中,如何利用--ignore
和--extr-resource
,处理asar
和第三方资源的问题。当然,不光electron-packager
,使用其他的打包工具,比如electron-builder
也是一样的问题,但是处理方案的细节,是不同的。
另外,通过这种方式打包的代码,对于第三方资源的调用时传递的路径,需要区分处理。因为调试时和打包成asar
的时候,资源的位置已经发生了较大变化,具体的如何区别处理,请参照苏南大叔的这篇文字:
更多苏南大叔带来的electron
系列教程,请参照如下链接:
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。
tray 设置图片 包failed to load image from path ....
困扰许久的问题终于解决了,原来npm模块没有打包进去,我把node_modules加入到忽略里面了,打包进去问题解决
我已经找到原因了,我发现在我代码中的node_modules里面的node-xlsx的几个文件夹都是快捷方式的图标的样子(但是打开后是正常的文件夹),然后我把它拷出来 又考回去图标就变成正常文件夹了。然后再打包就没问题了。
有一点令人困惑。是不是因为电脑错误得以为这几个文件夹是快捷方式 而导致打包失败的呢?
想请教一个问题 【如何在electron中 引用node的第三方模块 怎么打包】
我在写程序的时候 引入了node-xlsx 这一个模块。
打包后 运行程序会报一个 node-xlsx not found in ......\app.asar 的错误
如果我没有打包成Asar的话
在打包出来的 OUT 文件夹 源代码中有\node_modules\xx.symlink
也就是说 它没把文件放过来 放了一个链接。
这个怎么解决呢?
没见过,sorry。直觉上你应该把这个xlsx,在当前项目中install一下,而不是install到系统目录里面。