很多时候我们安装Pc应用,都会遇到让我们去安装依赖的情况,比如,安装Visual studio需要安装Microsoft .NET Framework x.x 这种,所以当我们用Node.js去开发一个混合App的时候,就会遇到类似的情况:安装依赖包。
通常我们会在命令行完成这个动作,但是在App中显然不太友好,本文将提供一种动态安装依赖包的解决方案,在应用启动时,动态检测Node.js依赖包的安装情况,如果未安装则主动安装。
一、思路
我们都知道,在Node.js中,项目的package.json
里有dependencies
和devDependencies
这两个配置,官方文档中的解析是这样的:
翻译过来就是:依赖项在一个简单的对象中指定,该对象将包名映射到 版本范围。 版本范围是一个字符串,其中包含一个或多个 空格分隔的描述符。 依赖关系也可以用 tarball 或 git URL。
所以,这里就很容易想到一个点,如果能获取到项目中的dependencies
(devDependencies是一样的逻辑,这里只讲dependencies),那么就能知道哪些依赖安装,哪些依赖未安装。
OK,知道哪些未安装的依赖,这个时候就可以想办法去把这些依赖安装上,因为是用Node.js作为服务端开发语言,所以,这里自然地就想到了用child_process
,关于子进程,官方的文档如下:
有了这个Api我们就可以很容易地去安装未安装的依赖了。但是,仔细想想,这样就完成了吗?
其实没有,作为一个客户端,应该需要知道,什么时候安装完了,并且,需要发消息到前端,让用户知道,我的依赖安装完了。这是一个基本操作,但是要怎么实现?
首先,我想到的是Http请求,每多少秒去发一个请求,检查一下是否安装完了。但是这样太占用资源了。其实我们只需要知道一个是否完成这个节点,其实就是一个消息,这让我想起了QQ聊天室:
那个时候大家在一起聊天,可开心了,这里每发一个消息都是一个Http请求吗,显然不是。这里应该是用的
Socket
。但是我们是包在Electron里面的,所以暂时还用不到这个,Electron本身就提供了Api。
最后,到这里思路就清晰了。
二、 检查哪些依赖未安装
通过上面的思路分析,实现起来就很快了,首先,我们实现去搜索Package.json的功能,这个功能用来检查哪些应用没有安装,并返回给前端。具体实现如下:
const search = async function(projPath,DEPENDENCE) {
const moduleFile = path.join(projPath, 'package.json');
let content = {
};
try {
content = fs.readFileSync(moduleFile, 'utf-8');
content = JSON.parse(content);
} catch (error) {
logger.info(error);
}
const needInstall = [];
const {
dependencies } = content;
if (!dependencies) {
return {<