解决Electron ASAR不可使用二进制文件的问题

3,548 阅读3分钟

“不要那么销魂,好不好?”

“小明说:我搞不定啊,搞不定啊!”

我遇到难题了,为此困惑了多日,解决不了,关于Electron在ASAR包中可以使用二进制文件的问题,这个问题解决起来非常的痛苦,但还是得去解决,找办法。

我能想到的第一个办法,官方文档都快被我翻烂了,Google搜来搜去,说是可以在package.json文件中配置asar:false来关闭ASAR,试了试还是没解决问题。虽然开发版可以用,但是如果build过后,安装版本需要验证的签名过不去,而且问题依然没有解决。

第二步,是去官方仓库提交issues:https://github.com/electron/electron/issues/11566,找人帮忙找这方面的专家求教,或去比较知名的社区提交问题https://cnodejs.org/topic/5a557d0eafa0a121784a8ad0,看看有没有其他人遇到同样的问题,并且能解决了。不过,很大程度上,依然需要依赖自己去解决问题,等了很多天还是没有人回答。

感谢狼叔及时帮我去找人看这个问题,看来此路行不通了,咋搞呢?

那么,我先试试硬编码的方式,根据不同的操作系统来替换不同的路径,暂时先拿去测试(捂脸,这不是忽悠人嘛),Mac 10.13.1 ,Mac 10.13.2 可用。

今天在Electron仓库里终于搜索出来一些有价值的信息了:

There are Node APIs that can execute binaries like child_process.exec, child_process.spawn and child_process.execFile, but only execFile is supported to execute binaries inside asar archive.

This is because exec and spawn accept command instead of file as input, and commands are executed under shell.

  • https://github.com/electron/electron/blob/master/docs/tutorial/application-packaging.md#executing-binaries-inside-asar-archive

This is not entirely correct. .spawn() executes the binary directly by default, just as  .execFile()does. .execFile() actually uses  .spawn() underneath. .spawn()  only runs the input in a shell if the shell  option is set.

Not supporting .spawn() means a lot of apps are not able to use ASAR as they need the more flexible  .spawn() method. For example, I need the .spawn()  method so I can stream the output of ffmpeg while it's running.  .execFile() only buffers and reports at the end.

Would also make sense to support .spawnSync() for completeness.

详情可看:

  • https://github.com/electron/electron/issues/9459 

  • https://github.com/electron/electron/issues/9459

大意就是说在ASAR机制下,如果要使用二进制文件,spawn是无法支持的,暂时提供一个临时修复的方式,是的!和我那个办法一样,硬编码。

exports.fixPathForAsarUnpack = path => exports.isUsingAsar ? path.replace('app.asar', 'app.asar.unpacked') : path;

又回来了,nw市场原来是这样推荐来的?是的,社区的朋友们都推荐用nw.js来解决这个问题,问题是,我基于electron基本写完这个事情了啊!! 欲哭无泪有没有?

如果是你,遇到了难题,该如何解决?方式是否和我一样,还是苦苦等待别人帮你解决?其实这就是一种“姿势”的不同,与其等待,不如主动出击,当然也可以期待别人能帮你解决,至少这样能节省很多时间,同时,自己也要有一个迎难而上的心态,上吧,怕猫?你都选择当了程序员,这么恐怖的职业都上了,还怕这一两个难题?

从我解决的思路来看Google对于广大技术同胞的重要性,社区在我们的心里一定要有重要的指导,比如你能及时的提交issues,如果能直达作者,那么就能很快得到解决方案了,当然,提交issues应该是最后一步。如果前面,在Google能搜索出来,咱们还是不要去打扰作者的好,我们应该要自己主动,或者也思考一下,这个设计为什么会这样,要解决什么问题,会产生什么问题。说不定,你还能给知名的项目提交一两个PR。

最后推荐自己做的小工具,有兴趣的可以申请,https://github.com/icepy/blockchain-navigate-code/issues/1 ,当然,看心情通过。另外要学习区块链技术的朋友,可以将 https://icepy.me/blockchain-navigate/#/ 添加到书签,值得拥有。

如果这些分享对你有用,支持打赏:

Cardano打赏地址

DdzFFzCqrhssiX2gAn17QNegNvSEixGi5RtgmEqeNrghMnU3F6GbmD1SWA3ZEKkTCuYnMnXTTpwWZrJpfxxiaLwg1Fm4p5z5WeyQWmbB

ERC 20标准的任意代币,打赏地址

 0x4A40Eb870DcF533D4dC097c3d87aaFE9f64490A1