一、前言

作为 Android 开发人员,有没有羡慕过 node.js 的导入三方库的方式,node.js 社区为开发者准备了一个快速可靠的依赖管理库。这样的依赖管理库,让 node.js 导入依赖库,非常的方便,一行代码就搞定了,npm install <library>

为了搞定这个问题,一个国外的程序员 **@cesarferreira** 做了一个库来支持这样的功能 drone

Github 地址:

https://github.com/cesarferreira/drone

接下来我们来看看 drone 的使用和细节原理。

二、drone 的使用细节

2.1 什么是 drone

drone 在 Android 项目中,实现了 npm 对 node.js 的功能。

它维护了 50 个常用的第三方依赖库库,差不多可以覆盖 90% 我们常用的开源库,例如:rxjava、Gson、Picasso、recyclelerview-v7 等。

当我们需要使用某个库的时候,只需要一行命令,就可以将这个库引入到我们工程的 build.gradledependencies 中。这个过程中,会默认为我们引入最新的版本,无需关心应该引入的三方库的最新版本号。

算是 Android 下的一个非常好用的导包工具。

因为本身 drone 是使用 node.js 实现的,所以这里需要 npm 的环境才可以安装它,node.js 基本上就是无脑安装,这里默认你已经安装了 node.js 的环境了。

安装 drone 也非常的简单,一行代码搞定。

npm install -g drone

安装完成之后,我们就可以正常使用它了。

2.2 使用 drone

使用 drone 添加依赖库,只需要通过 drone add 命令即可。

drone add creator/library module

drone add 需要指定库的别名和需要导入的 App Module。

可以看到,它会主动将我们需要库查询出来,插入到 build.gradle 的 dependencies 中。

drone 的支持的功能还有很多,增删改查都是最正常的操作,其他操作可以查看它的帮助文档。

drone 的使用还是非常方便简单的,基本上看看帮助文档就可以搞定了,就不再展开说了。

三、drone 的原理

drone 的使用非常的简单,不知道你有没有好奇它是如何维护这些库的。我们只是指定了一个库的名称,它就能立刻确定它最新的稳定版版本号。

接下来我们来继续探索一下 drone 的原理,满足好奇心。

首先看看 drone 的整个项目结构,它是完全使用 node.js 开发完成的,它所有支持的命令都被定义在 tasks 目录下。

而 drone 的入口是 router.js ,所有的命令都需要通过 router.js 进行分发。

我们找一个最常用的命令 add 来看看它的具体细节。

可以看到,它首先使用 QuickSearch.search() 查找我们输入的库的细节,然后使用 hive.getWithVersions() 查找到我们需要的三方库最新稳定版的版本号。最终使用 handleGradleDependencyInjection() 方法,将它输入到我们指定 Module 的 build.gradle 的具体位置。

handleGradleDependencyInjection() 方法不用看,应该就是一个 io 操作,去写 build.gradle 文件。

先来看看 QuickSearch.search() 方法。

这里通过 string-similarity 这个字符串相似度比较库,去查找出我们需要引入的库的细节,这些信息,被配置在 constants.js 文件中。

可以看到,这里被另外一个 github 开源库 drone-hive 所维护。

https://github.com/cesarferreira/drone-hive

drone-hive 中,维护了比较常用的 50 个开源库的信息。

我们随便找一个看看,这里看看 airbnb/lottie-android。

可以看到,它维护了开源库的各项信息,而其中的 repository 指定了开源库的类型,它最终可以用于区分我们使用什么方式去获取最新的版本号。

这个逻辑在 metadata.js 文件中。

例如这里查看的 airbnb/lottie-android 就是通过 jitpack.io 进行查询,当然 drone 是使用 jitpack.io 的查询 Api 去查询到最新的版本号,这里不再展开细节看了。

四、小结

到这里,我好奇的地方就得到了解决,在来回顾一下这些细节。

  1. drone 主要用于 Android 开源库的管理。
  2. drone 可以自动操作 Gradle dependencies。
  3. drone 维护的 50+ 的开源库,所有的信息维护在另外一个库中,drone-hive。
  4. drone-hive 维护了这些开源库的信息,在不同库的 xxx/xxx.json 文件中。
  5. 根据在 hive 中配置的 repository 类型,使用不同的方式,获取稳定版版本号。
  6. 最终使用 io 操作,修改我们指定 Module 的 build.gradle 文件。

今天在承香墨影公众号的后台,回复『成长』。我会送你一些我整理的学习资料。

点赞或者分享吧~

像 npm 一样在 Andriod 项目中引入 Gradle 依赖的更多相关文章

  1. IDEA maven项目中引入ojdbc依赖报红色波浪线问题的解决办法

    1.pom.xml配置文件中删除ojdbc的依赖配置后更新maven项目,然后再到本地仓库中将ojdbc这个文件夹删除 2.在网上下载ojdbc14.jar,然后改名为ojdbc14-10.2.0.2 ...

  2. 【vue】如何在 Vue-cli 创建的项目中引入 iView

    根据vue项目的搭建教程,以下记录如何在Vue-cli创建的项目中引入iView. 1)iView的安装,在项目下使用 npm 安装iView cnpm install  iview  --save ...

  3. 【React踩坑记四】React项目中引入并使用js-xlsx上传插件(结合antdesign的上传组件)

    最近有一个前端上传并解析excel/csv表格数据的需求. 于是在github上找到一个14K star的前端解析插件 github传送门 官方也有,奈何实在太过于浅薄.于是做了以下整理,避免道友们少 ...

  4. vue项目中引入Sass

    Sass作为目前成熟,稳定,强大的css扩展语言,让越来越多的前端工程师喜欢上它.下面介绍了如何在vue项目 中引入Sass. 首先在项目文件夹执行命令 npm install vue-cli -g, ...

  5. vue-cli项目中引入第三方插件

    前言 最近有小伙伴问道如何在vue-cli项目中引入第三方插件或者库,例如如果想在项目中使用jQuery中的Ajax请求数据呢?或者我想使用Bootstrap框架呢?等等这些问题,本篇博客将带你学习如 ...

  6. 【React踩坑记五】React项目中引入并使用react-ace代码编辑插件(自定义列表提示)

    最近有一个引入sql编辑器插件的需求,要求代码高亮显示,代码智能提示,以及支持自定义代码提示列表等功能.中途在自定义代码提示列表中由于没有相关demo,所以踩了一些坑,遂将其整理如下,以便日后查看. ...

  7. 在Android项目中引入MuPdf

    由于公司手机App要加入一个附件查看功能,需要查看PDF文件,在网上找了许多第三方工具,最后选择了MuPDF. 更多第三方工具可以查看大神总结的:http://www.cnblogs.com/poke ...

  8. 如何在项目中引入 #include .h、.lib、 .dll、.cpp (转)

    源:http://blog.csdn.net/vippolka/article/details/8552735 在项目中引入.h..lib和dll.以及.cpp 1..h的引入 解决办法1:把  XX ...

  9. 如何在项目中引入MetaQ消息收发机制

    当需要异步发送和接收大量消息时,需要在Crystal项目中引入MetaQ消息收发机制. 关于MetaQ使用的官方例子可参考:https://github.com/killme2008/Metamorp ...

随机推荐

  1. JAVA实用案例之邮件发送

    最近有朋友问邮件怎么发送,就简单写了个demo,因为懒得找jar包,所以项目是创建的maven工程,具体的maven引用的jar如下: <dependency> <groupId&g ...

  2. vue2

    props 向子组件传递数据是经常会用到的,一般是在子组件定义 props 来接受数据,当父组件改变数据时子组件的数据也会进行更新.但这里是有一个坑的,先看代码: <pagination :pa ...

  3. 慎用kill -9,kill -15的作用

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt334 Perl语言专家Randal Schwartz在一篇短文里这样写: n ...

  4. zookeeper原理介绍

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt354 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它 ...

  5. Javascript学习日志(三):闭包

    说实话,前面一节的原型和原型链在当初学的时候并没有很头疼,对着高级编程第三版撸了几遍就理解透了,闭包这一节真的挺头疼的,很惭愧,看了差不多十来遍吧,还翻看了网上的其他博客和解释文档,五花八门的表达方式 ...

  6. css入门基础知识

    一.CSS常用选择器 /*CSS注释*/ /*CSS修改页面中的所有标签必须借助选择器选中. 选择器中可以写多对CSS属性:每个属性名与属性值之间用:分隔,多对属性之间,必须用;分隔 选择器{ 属性1 ...

  7. 201521123091 《Java程序设计》第6周学习总结

    Java 第六周总结 第六周的作业. 目录 1.本章学习总结 2.Java Q&A 3.码云上代码提交记录及PTA实验总结 1.本章学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以 ...

  8. Java 第八周总结

    1. 本周学习总结 2. 书面作业 1.List中指定元素的删除 1.1 实验总结 list中可以通过list.get(i)来获取具体第几个的元素的值,再通过compareTo来对比 通过in.has ...

  9. 201521123081《java程序设计》 第7周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 参考资料:XMind 2. 书面作业 Q1. ArrayList代码分析 1.1 解释ArrayList的 contains ...

  10. cms内容模型标签

    内容模块 内容模块PC标签调用说明 模块名:content 模块提供的可用操作 操作名 说明 lists 内容数据列表 relation 内容相关文章 hits 内容数据点击排行榜 category ...