插件打包流程优化(自定义Gradle Task)

最近在做一些项目的优化,其中有一项就是对打包插件包的流程优化,本篇文章记录一下优化过程,并对遇到的问题给出解决方案。通过这篇文章读者能够了解到如何自定义Task,并且通过Task如何解决实际的项目问题。

本篇文章不对Gradle Task做很详细的介绍,如果对Task不是很了解可以通过 Android Gradle 自定义Task 详解 这篇博文做详细的了解。

插件包打包流程

项目中用到了DL插件,每次需求开发完成之后提供一个插件包给宿主进行更新。打插件包需要做下面几件事情:

  1. 更新项目中的依赖库代码。项目中有一个第三方源码module,需要确保这个module上的代码是最新的。
  2. 更新RN项目代码。跟上一个原因一样,需要保证RN项目代码是最新的。
  3. 打包RN的bundle包。
  4. 更新当前代码的唯一标识。这个唯一标识就是当前commit对应的git号。
  5. 最后执行打包插件的gradle命令。

这几个流程虽然不复杂但是很容易在打包过程中出错或者遗落。所以引入了一个Task来处理这个流程。

实现流程

根据上面的打包流程很明显需要创建五个task,分别设置成Task updateLibraryCode,Task updateRNCode,Task buildRNBundle,Task updateGitNum和Task buildPlugin。因为这五个task是有先后顺序的,所以需要对五个task添加依赖。

Task中有三种方式可以添加依赖,分别是dependsOn,mustRunAfter和shouldRunAfter。dependsOn就是执行当前Task之前需要先完成另一个Task。mustRunAfter和dependsOn类似。当两个Task通过mustRunAfter相互依赖时,编译器会报错。如果两个Task是通过shouldRunAfter来依赖的,会打破这种循环引用,不会导致异常。

具体代码实现

task updateLibraryCode {
    doLast {println('updateLibraryCode')}
}

task updateRNCode {
    doLast {println('updateRNCode')}
}
task buildRNBundle {
    doLast {println('buildRNBundle')}
}
task buildGitNum {
    doLast {println('buildGitNum')}
}
task buildPlugin {
    doLast {println('buildPlugin')}
}
buildPlugin.dependsOn(buildGitNum)
buildRNBundle.dependsOn(updateRNCode)
buildGitNum.dependsOn(updateLibraryCode, buildRNBundle)

最后只需要执行一下gradle buildPlugin 命令就可以打出一个插件包了。

遇到的问题以及解决方案

  1. 一定要确保每个Task都实现了一个Action,不然依赖是无效的。最开始的时候对Task没有写dolast或者dofirst action,导致结果并没有按照自己设置的依赖关系来执行。
  2. 如果在Task中通过shell命令来完成多步操作,一定要把操作写在一个shell脚本中,不要单独分开。

对于第二点,举个例子,如果需要完成updateLibraryCode这个task,那么就需要做到的是,先切换到依赖库对应的module目录中,之后通过git stash保存本地修改的代码,放置在切换分支和更新分支的时候发生冲突。最后切换到线上代码分支,更新代码。

cd 依赖库分支目录
git stash 
git pull origin  最新线上分支

最开始我是把这几步分开来执行,没有放到一个shell脚本中。如下代码:

"cd 依赖库分支目录").execute() 

但是发现单步执行的话,其实就相当于每次都开了一个新的会话,结果都是独立的,导致无法完成想要的效果。解决方案就是把这几个步骤放在updateLibraryCode.sh脚本中。只需要执行

("updateLibraryCode.sh").execute()

就可以完成所有的操作。

最后如果对文章中有不清楚的地方,或者在实际操作中遇到什么问题或者发现文章里面有任何错误,都可以留言给我,我会第一时间回复大家~

与君共勉

你可能感兴趣的:(心得体会)