Gradle随记---洞悉

Gradle作为编译工具,理所当然也要谈谈publish这块。Gradle提供了两种发布方式,分别是ivymaven,这里着重说下maven的方式好了,这也是最常用的方式。

PublishingExtension

Gradle提供出来的publishing闭包配置为:

publishing {
    publications { ... }
    repositories.maven { ... }
}     

从前面的文章可知,对应的分别是两个方法:

  1. void repositories(Action<? super RepositoryHandler> configure)
  2. publications(Action<? super PublicationContainer> configure)

RepositoryHandler

repositories函数用来设置具体的RepositoryHandler实例(FlatDirectoryArtifactRepositoryIvyArtifactRepository以及MavenArtifactRepository)。

repositories {
    maven {
        credentials {
            username = "user"
            password = "password"
        }
        url "https://xxx.com"
    }
}

这里对应的就是MavenArtifactRepository,分别调用方法setUrl(Object url)设置仓库地址以及方法credentials(Action<? super PasswordCredentials> action)设置仓库地址进行登陆鉴权的用户名和密码。

PublicationContainer

同样,publications用来创建PublicationContainer实例(IvyPublication以及MavenPublication)。

publications {
    myPublication(MavenPublication) {
        from components.java
        artifact sourceJar
        pom.withXml {
            asNode().appendNode('description', 'A demonstration of Maven POM customization')
        }
    }
}

上述闭包配置作用在于创建两个实现了MavenPublication接口的task

  1. publishMyPublicationToMavenLocal发布到本地仓库
  2. publishMyPublicationToMavenRepository发布到远程仓库。

理所当然,这两个task必须在build后执行,因为需要拿build后生成的jar或者aar包。
在前面task章节我们了解到这里需要进行dependsOn配置。

tasks.whenTaskAdded { task ->
    if (task.name == "publishMyPublicationToMavenLocal" ||
          task.name == "publishMyPublicationToMavenRepository") {
        task.dependsOn build
    }
}

接下来,详细了解具体的MavenPublication的配置选项。

MavenPublication

具体类为org.gradle.api.publish.maven.MavenPublication,详细的方法可以自行查略,这里说说其中最为关键的几个方法。

  1. void setGroupId(String groupId)设置groupID,对应com.gradle:tools:1.0中的com.gradle
  2. void setArtifactId(String artifactId)设置artifactId,对应com.gradle:tools:1.0中的tools
  3. MavenArtifact artifact(Object source)添加MavenArtifactpublish任务中。
  4. void pom(Action<? super MavenPom> configure)配置Pom,对应就是用来进行递归依赖的Pom.xml中内容。

artifact

artifact方法是提供Object对象,具体是什么呢?主要是三种。

  1. artifact 'my-file-name.jar'具体的文件。
  2. artifact sourceJar任务sourceJar输出物,例如这里是对源码进行了打包的Jar包。
  3. artifact source: sourceJar, classifier: 'src', extension: 'zip'通过sourceclassifier以及extension构造的MavenArtifact实例,参数分别对应源文件,名称类别(artifactId-classifier)以及扩展名称(.jar/.zip等)。

pom

pom方法通过传递一个MavenPom对象来添加对应配置内容到Pom.xml文件中。

<dependencies>
  <dependency>
    <groupId>com.gradle</groupId>
    <artifactId>design</artifactId>
    <version>1.0</version>
    <exclusions>
      <exclusion>
        <groupId>com.gradle</groupId>
        <artifactId>support</artifactId>
      </exclusion>
    </exclusions>
  </dependency>
</dependencies>

org.gradle.api.artifacts.maven.MavenPom提供的get方法和xml中配置选项是一一对应的,例如getGroupId()getArtifactId()等。
这样,当你发布出去的包被依赖的时候,所包含的Pom.xml中的com.gradle:design:1.0包也会依赖进来,但是这个包所依赖的com.gradle:support却除外不再依赖进来。
那我们怎么去构造一个这样的MavenPom对象出来呢?有很多种方法,这里提及一种最常见的方式,MavenPom withXml(Action<XmlProvider> action)

XmlProvider

可以通过xml文件格式进行实现。

pom.withXml({ XmlProvider xmlProvider ->
    def dependenciesNode = xmlProvider.asNode().appendNode('dependencies')
    def dependencyNode = dependenciesNode.appendNode('dependency')
    dependencyNode.appendNode('groupId', "com.gradle")
    dependencyNode.appendNode('artifactId', "com.tools")
    dependencyNode.appendNode('version', "1.0")

    //excludeRules是存储org.gradle.api.artifacts.ExcludeRule对象的集合
    if (excludeRules != null && excludeRules.size() > 0) {
        def exclusionsNode = dependencyNode.appendNode('exclusions')
        excludeRules.each { ExcludeRule rule ->
            def exclusionNode = exclusionsNode.appendNode('exclusion')
            exclusionNode.appendNode('groupId', rule.group)
            exclusionNode.appendNode('artifactId', rule.module)
        }
    }
}    

到此为止,已经可以完成对本地文件的发布(包含但不限于jar/aar/so等),对应的唯一依赖标示为com.gradle:tools:1.0

后续

Gradle提供的publish不仅仅可用于常规的jar、aar、so发布,还可以发布一些我们在进行编译的时候需要用到的脚本(python、luna等)、配置信息等,这些就需要针对编译流程进行各自的思考。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容