看看程序员必会的!Android组件化实战之利用Maven优雅地调试SDK

注解:是脚本执行所需依赖,是项目本身需要的依赖,所以我们将自己所需要的仓库加到配置中关联依赖时,子包不发布,主包无法打包成功,那么除了手动一步一步上传外,有没有办法一键上传?通过宿主工程优雅的调试sdk在宿主工程里调试,很不方便,虽然可以断

打包sdk到Maven仓库

Maven 是 下的一个纯 Java 开发的开源项目,基于项目对象模型(缩写:POM)概念,Maven可以从中央信息管理一个项目的构建、报告和文档等步骤。Maven 也可被用于构建和管理各种项目,例如 C#,Ruby,Scala 和其他语言编写的项目。

POM介绍

POM( Model)即项目对象模型,通过xml格式保存的pom.xml文件,作用类似ant的build.xml文件,功能更强大。该文件用于管理:源代码、配置文件、开发者的信息和角色、问题追踪系统、组织信息、项目授权、项目的url、项目的依赖关系等等;

Glide:POM举个栗子

  
  4.0.0  
  com.github.bumptech.glide  
  glide  
  4.12.0  
  aar  
  Glide  
  A fast and efficient image loading library for Android focused on smooth scrolling.  
  https://github.com/bumptech/glide  
  ...

POM节点Maven的目标Maven仓库

Maven 仓库能帮助我们管理构件(主要是JAR),它就是放置所有JAR文件(WAR,ZIP,POM,AAR等等)的地方。

举个栗子:阿里&& maven 仓库

引入仓库 : 根 build.配置 —doc

vs 2.

 buildscript {
   repositories {
       		jcenter()
          google()
      }
    }
allprojects {
    addRepos(repositories)
    repositories{
    	 jcenter()
       google()
       mavenLocal()
     	 mavenCentral()
       maven { url "http://maven.aliyun.com/nexus/content/groups/public" }
       maven { url "file:///${rootProject.getRootDir()}/asdk" }
       maven { url "file:///${rootProject.getRootDir()}/bsdk" }
    }
}

{ }: the build for this .

{ }: this and each of its sub-.

注解:是脚本执行所需依赖,是项目本身需要的依赖,所以我们将自己所需要的仓库加到配置中

通过以上我们知道,打包sdk 需要一个托管的仓库,那么下面我们就介绍一下,如何搭建一个私有仓库;基于安全考虑不用公共仓库,学习一下如何搭建私有仓库。

通过nexus搭建私有仓库

Nexus 简介:是Maven仓库管理器,如果你使用Maven,你可以从Maven中央仓库 下载所需要的构件()

简介2:World’s #1 (自己夸自己世界第一,其他吹牛逼的不用看了) of truth for all of your , , and build parts and to at more than 100,000

搭建Maven私有仓库步骤

1.下载

2.启动

~ » /Users/caining/Documents/applications/nexus-3.28.1-01-mac/nexus-3.28.1-01/bin/nexus start
Starting nexus

3.访问

:8081/

4.修改端口方法

cd /Users/caining/Documents/applications/nexus-3.28.1-01-mac/nexus-3.28.1-01/etc
vim nexus-default.properties
###########################配置如下
# Jetty section
application-port=8081
application-host=0.0.0.0

5.登录

nexus 2 的默认账号密码 admin:默认密码登录; nexus 3第一次启动后 会自动生成admin 的密码,存在admin.

查看密码
~ » vim /Users/caining/Documents/applications/nexus-3.28.1-01-mac/sonatype-work/nexus3/admin.password

-39e2-4e14-90bb-

6.首次登录后设置密码7.停止

~ » /Users/caining/Documents/applications/nexus-3.28.1-01-mac/nexus-3.28.1-01/bin/nexus stop
Shutting down nexus
Stopped.

脚本打包sdk并上传Maven

一、在工程下新建 maven-push. 脚本

apply plugin: 'maven'
uploadArchives {
      repository(url: maven.address) { authentication(userName: maven.username, password: maven.password) }
      pom.groupId = maven.MAVENGROUPID
      pom.artifactId = ARTIFACT
      pom.version = maven.appLibVersion
      pom.packaging = 'aar'
      pom.project {
                licenses {
                    license {
                        name 'The Apache Software License, Version 2.0'
                        url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
                    }
                }
            }
}

二、配置根配置

1.新建 config.gradle
2.apply from: 'config.gradle'
3.
ext {
		  maven = [
            address         : "http://localhost:8081/repository/maven-releases/",//maven 仓库地址
            username        : "admin",
            password        : "123456",
            appLibVersion   : "1.0.6",//打包版本号
            buildMAVEN      : true ,//是否打开upload功能,为宿主工程准备、、最小侵入宿主工程
            MAVENGROUPID      : "com.cnn.sdk"//打包groupId 这里统一设置,如需要不同,请module中单独设置
    ]
}

三 、 ext 是什么?

ext属性是类型的一个特殊的属性,本质是一个Map类型的变量;使用ext属性的好处可以在任何能获取到的地方访问这些属性. 与 ext 的不同?由于ext 结构是map,所以可以分组,比 . 好用一些,一些系统级的配置可以放. ,用户基本的配置可以放ext 比如版本号啥的。

四、 子 . 增加名字

新建 .= —name // 这个不能随意起,起名规则后面讲

五、sdk- 子 build. 增加配置

try {
    if (maven.buildMAVEN){//这里是true  在宿主工程里,会访问不到而报错
        apply from: '../maven-push.gradle'
    }
}catch (all){
}

以上,执行 task 就会打包并 到仓库

> Task :module01:uploadArchives
> Task :module02:writeReleaseAarMetadata
> Task :module02:bundleReleaseAar
> Task :module02:uploadArchives
Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/6.5/userguide/command_line_interface.html#sec:command_line_warnings
BUILD SUCCESSFUL in 781ms
43 actionable tasks: 41 executed, 2 up-to-date
10:46:48 AM: Task execution finished 'uploadArchives'.

添加依赖 (path: ‘:’),这时候再执行。

重点:抛出问题:如果模块间依赖,以上脚本在全量打包时会报错 如下

原因: 依赖是本地包,所以报错

如何解决?

思路1:先传 再修改依赖为线上包,再传 ,这个思路可行,但如果遇到 过多,执行起来过于麻烦,这里不再演示,感兴趣的同学可自己执行。相互依赖打包优化问题 :填坑对于有互相依赖的包如何处理?对于关联依赖 sdk 如何一键 build 并上传Maven仓库以上存在的问题 :以上脚本虽然初步完成了sdk 打包并上传Maven仓库,但有问题存在,加入sdk 子 关联依赖时,子包不发布,主包无法打包成功,那么除了手动一步一步上传外,有没有办法一键上传?优化思路:动态替换打包后 和 (由于是动态替换,这里的工程 的名称应该与.配置的 保持一致)关键脚本如下:

 pom.withXml {
                def childs = asNode().children()
                childs.each {
                    child ->
                        print("childName->"+child.name().toString()+"n")
                        if (child.name().toString().contains('dependencies')) {
                            child.children().each {
                                print("dependencies->"+it.text().toString()+"n")
                                if (it.text().toString().contains("unspecified")) {
                                    def iterator = it.children().iterator()
                                    def remove = false
                                    while (iterator.hasNext()) {
                                        def node = iterator.next()
                                        if (node.name().toString().contains('groupId')) {
                                            iterator.remove()
                                        }
                                        if (node.name().toString().contains('version')) {
                                            iterator.remove()
                                            remove = true
                                        }
                                    }
                                    if (remove) {
                                        it.appendNode('version', maven.appLibVersion)
                                        it.appendNode('groupId', maven.MAVENGROUPID)
                                    }
                                    print("n return ->"+it.text().toString()+"n")
                                }
                            }
                        }
                }
            }

宿主通过仓库引入sdk

引入方式也很简单

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation "groupId:artifactId:version"//此处对应上传的maven 仓库的信息
}

通过宿主工程优雅的调试sdk

通过仓库引入的第三方sdk 在宿主工程里调试,很不方便,虽然可以断电,但源码无法修改,使得在宿主程序中,遇到问题口袋妖怪个体值计算器 for android,查问题时,非常不方便,那么有没有好的办法,在本地开发时,不使用仓库包,而是直接引用源码呢?上线时,通过修改配置,引用远程仓库。

通过脚本控制引用源码or仓库

我们知道 引入模块,是在.中,如下:

常规引入

include ':sdka'

参数控制动态引入

宿主根. 增加控制参数 = true/false通过.配置动态控制是否使用仓库

if (useLocalLib.toBoolean()){
    print("sdk调试使用,线上环境忽略以下内容")
    include(':module01')
    include(':module02')
    print("path---->"+getRootDir().getParent())
    project(':module01').projectDir = new File(getRootDir().getParent(),"/MavenPackage/module01")
    project(':module02').projectDir = new File(getRootDir().getParent(),"/MavenPackage/module02")
}

同理,宿主工程引入lib时 ,用.-字段控制引用仓库or本地

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    if (useLocalLib.toBoolean())
    	implementation project(":module01")
    else
    	implementation 'com.cnn.sdk:module01:1.0.0'
}

以上,可以在宿主工程里,通过参数口袋妖怪个体值计算器 for android,达到引入sdk源码的目的,源码并不在宿主git 下;完成优雅的调试sdk 的目的。

注意一下咯:由于篇幅原因,小编已将这些相关的知识都集结整理出来了,有需要的老铁私信下我关键词 “Java”,回复获取免费下载原文件的方式哟~

总结

本文到此结束,希望对大家有所帮助。

本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至81118366@qq.com举报,一经查实,本站将立刻删除。发布者:简知小编,转载请注明出处:https://www.jianzixun.com/76221.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫

相关推荐

软文友链广告合作联系站长qq81118366