使用Gradle Kotlin DSL和Travis CI在Bintray上发布Kotlin库

使用Gradle Kotlin DSL在Bintray上分发图书馆

在几周前发布的最新博客文章中,我了解了 Gradle Kotlin DSL 以及它如何帮助描述构建脚本。在另一篇较早的文章中,我介绍了一个小型库,该库可用于使用自定义Kotlin DSL简化TLS / SSL套接字的创建: 安全性 .

在本文中,我们将研究如何将这样的库提供给实际上想要在其他项目中使用它的其他人。最终,应该可以将SeKurity库作为一个简单的列表列出 依赖 在Maven或Gradle之类的构建脚本中。由于该库本身已经由Gradle支持,因此我将展示一种在生成结束时发布生成的工件的方法。

在哪里发布?

为了使其他任何人都可以使用该库,需要将其发布给可公开访问的站点,例如像著名的Maven仓库 Maven中央 。除非您对库的质量有绝对的把握,否则建议在自定义存储库中共享它,而不是直接在中央存储库中共享,因为一旦存在该库,您就会失去对它的控制。一种替代方法称为 宾特雷 它也将在本文中使用。创建帐户或仅使用GitHub,Google或Twitter帐户登录后,即可在此处创建自己的存储库。

自动化构建

在使我们的构建能够发布构建的工件之前,应该使用CI工具(例如 特拉维斯CI ,可以与GitHub很好地交互。要使其正常运行,必须在GitHub存储库设置中通过将其添加为 服务 (看到 Settings -> Integrations & 服务 s). Travis expects the 资料库 to incorporate a .travis.yml configuration that tells it what to do. For a simple Java/Kotlin project using Gradle, the following will be sufficient:

language: java

before_install:
- chmod -R +x src
- chmod +x gradlew

script: ./gradlew clean build
deploy:
  provider: script
  script: ./gradlew bintrayUpload -PbintrayUser=$BINTRAY_USER
  -PbintrayApiKey=$BINTRAY_KEY
    on:
      branch: master

It's normally not necessary to specify the script command explicitly as long as you're using the default instructions. In the shown case, Gradle runs the build task first before it deploys via the gradle bintrayUpload taks, which we will learn about later. 的 deployment only happens for the master branch. 的 gradle deploy takes two arguments $BINTRAY_USER and $BINTRAY_KEY, which contain private data and are therefore securely stored in Travis directly. When the build is run, Travis takes care of replacing them.
您最终可以在Travis中启用存储库,它将在每次推送时立即开始构建。有关Travis的更多信息,请访问 文件资料 强烈建议。

Gradle构建

As shown earlier, the bintrayUpload Gradle task gets invoked in the build. Where does it come from? Let's have a look at the relevant parts of the gradle.build.kts file.

插件


plugins {
    kotlin("jvm") version "1.2.30"
    id("com.github.johnrengelman.shadow") version "2.0.2"
    `maven-publish`
    id("com.jfrog.bintray") version "1.8.0"
}
  • shadow 使用插件是因为我们需要将库与其所有依赖项捆绑在一起,以避免类路径冲突。
  • maven-publish plugin helps with creating the relevant artifact and a relevant pom.xml file that will also be published.
  • bintray plugin does all the heavy work at the end of the build. It refers to the maven-publish result and pushes the artifacts to 宾特雷 .

插件配置

生成文件还会为所有先前显示的插件添加自定义配置,如下所示:

I 阴影


val artifactID = "sekurity"

val shadowJar:  阴影 Jar  通过  tasks
shadowJar.apply {
    baseName = artifactID
    classifier = null
}

shadow plugin uses the project's name as the artifact's baseName and the "all" qualifier 通过 default, which is overridden here.

II Maven发布


fun MavenPom.addDependencies() = withXml {
    asNode().appendNode("dependencies").let { depNode ->
        configurations.compile.allDependencies.forEach {
            depNode.appendNode(" 依赖 ").apply {
                appendNode("groupId", it.group)
                appendNode("artifactId", it.name)
                appendNode("version", it.version)
            }
        }
    }
}

val publicationName = "tlslib"
publishing {
    publications.invoke {
        publicationName(MavenPublication::class) {
            artifactId = artifactID
            artifact(shadowJar)
            pom.addDependencies()
        }
    }
}

This one is a bit tricky. We reuse the result of shadow and add it to the publication which will be published under the artifactId that corresponds to the JAR's baseName. By default, the generated POM does not list the library dependencies, which is done 通过 mapping each compile 依赖 to a valid 依赖 XML node.

三级 宾特雷


fun findProperty(s: String) = project.findProperty(s) as String?

bintray {
    user = findProperty("bintrayUser")
    key = findProperty("bintrayApiKey")
    publish = true
    setPublications(publicationName)
    pkg(delegateClosureOf {
        repo = " 安全性 "
        name = " 安全性 "
        userOrg = " s1m0nw1 "
        websiteUrl = "//airportparkinghotels.net"
        vcsUrl = "//github.com/s1monw1/TlsLibrary"
        setLabels("kotlin")
        setLicenses("MIT")
    })
}

bintray plugin is most important since it takes care of actually uploading the generated artifacts to 宾特雷 itself. 的 user and key are obtained from the Gradle project properties, which are passed 通过 Travis later on as already shown earlier. By referring to the publication created in maven-publish, all artifacts will be uploaded as specified. 的 pkg block describes the library's attributes and 哪里 ,即发布到哪个存储库。

结果

所有这些块的合并产生了一个非常漂亮的Gradle构建脚本,可以在 这个要点 还有SeKurity 资料库 本身。生成的工件在此处可用: //bintray.com/s1m0nw1/SeKurity/SeKurity

参考已出版的图书馆

现在,该库已上传到Bintray,可以将其作为依赖项列出在任意构建文件中。如果我们还有另一个由Gradle支持的项目,则首先需要将相关的存储库添加到存储库列表中:


repositories {
    mavenCentral()
    jcenter()

    maven {
        setUrl("//dl.bintray.com/s1m0nw1/SeKurity/")
    }
}

After that, the library can be added as a simple compile 依赖 like this:


dependencies {
//...other dependencies
    compile("de.swirtz:sekurity:0.0.2")
}

回顾

如图所示,Gradle插件可用于设置适当的构建,从而轻松地将自定义库发布到Bintray。为了使整个过程自动化,只要进行了新的更改,就可以使用Travis之类的CI工具来执行构建。

我希望这个小教程对您的构建也有所帮助!如果你愿意,看看我的 推特 帐户,如果您对更多Kotlin产品ðŸ™感兴趣,请关注。非常感谢。

关于2个想法 “使用Gradle Kotlin DSL和Travis CI在Bintray上发布Kotlin库

  • 尼克·阿佩利

    如果有一篇有关使用Gradle Kotlin DSL(不使用CI)发布Kotlin多平台库的文章,那将是很棒的。本文中的样本不’不能在Gradle 4.9中使用。

  • 尤里·西姆克(Yuri Schimke)

    有没有更好的方法来继承依赖关系。例如通过kotlin-dsl设置,开发人员和许可部分可以通过以下方式工作

    pom {
    packaging = "jar"
    developers {
    developer {
    email.set("yuri@schimke.ee")
    id.set("yschimke")
    name.set(" 尤里·西姆克(Yuri Schimke) ")
    }
    }
    licenses {
    license {
    name.set("Apache License")
    url.set("http://opensource.org/licenses/apache-2.0")
    distribution.set("repo")
    }
    }
    scm {
    connection.set("scm:git://github.com/yschimke/okurl.git")
    developerConnection.set("scm:git:git@github.com:yschimke/okurl.git")
    url.set("//github.com/yschimke/okurl.git")
    }
    }

发表评论

您的电子邮件地址不会被公开。 必需的地方已做标记 *