随着移动开发技术的发展,越来越多的开源框架和开源库诞生了,尤其是以iOS下的Pod
和Android下的Gradle
为代表的构建系统的发展,使得开发者能非常方便和优雅的组织和管理自己项目中的第三方库依赖,也能很方便的发布自己的开源项目。我们既然处在一个好的时代,就一定要学会利用资源,要既能通过优秀的开源项目,武装自己的项目,也要能思考,为这个开源时代,贡献自己的一份力量。我以Android开源项目的发布为例,详细介绍一下~
需要准备什么
- 一台电脑
- Android Studio
- Gradle
- 改变世界的点子
其实任何自己在工作中封装或抽象的代码,经过一定的整理和优化,都是可以作为开源库,发布出去,造福劳动人民。这里假设我们已经写好了自己高大上的库。并上传到了自己的Github仓库。
申请Bintray账号
通过JFrog Bintray,可以将自己的库,发布到JCenter里,供全球的开发者使用。想想是不是有点小激动。申请完账号,登录后,应该是长这样的:
点击Maven按钮进入
并点击Add New Package创建好自己的库。
配置自己的Android Studio工程
local.properties
我们需要设置Bintray的Username和API Key来进行Bintray的加密认证。这些信息将写在local.properties文件里。如下:
BINTRAY_USER=xxx
BINTRAY_KEY=xxx
其中,BINTRAY_USER就是自己Bintray上注册的账户名,BINTRAY_KEY可以在个人信息编辑里找到。
gradle.properties
这里定义一些全局变量,供后续的gradle脚本使用
PROJ_GROUP=com.m4399
PROJ_VERSION=1.0.0.1
PROJ_NAME=GridViewLayout
PROJ_WEBSITEURL=https://github.com/aqiansunboy/GridViewLayout
PROJ_ISSUETRACKERURL=https://github.com/aqiansunboy/GridViewLayout/issues
PROJ_VCSURL=https://github.com/aqiansunboy/GridViewLayout.git
PROJ_DESCRIPTION=A light Grid Layout instead for Android GridView
PROJ_ARTIFACTID=gridviewlayout
DEVELOPER_ID=aqiansunboy
DEVELOPER_NAME=Chaoqian Wu
DEVELOPER_EMAIL=wuchaoqian@4399inc.com
对应项更改为自己的值即可。
publish.gradle
自己的库模块下(比如gridviewlayout),创建publish.gradle文件,这里文件名命名随意,你也可以命名为自己女神的名字也行,但注意文件的脚本代码就不能随意了噢。
group = PROJ_GROUP
version = PROJ_VERSION
project.archivesBaseName = PROJ_ARTIFACTID
apply plugin: 'com.jfrog.bintray'
apply plugin: "com.jfrog.artifactory"
apply plugin: 'maven-publish'
task sourcesJar(type: Jar) {
from android.sourceSets.main.java.srcDirs
classifier = 'sources'
}
task javadoc(type: Javadoc) {
source = android.sourceSets.main.java.srcDirs
classpath += configurations.compile
classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
}
task javadocJar(type: Jar, dependsOn: javadoc) {
classifier = 'javadoc'
from javadoc.destinationDir
}
javadoc {
options{
encoding "UTF-8"
charSet 'UTF-8'
author true
version true
links "http://docs.oracle.com/javase/7/docs/api"
title "$PROJ_NAME $PROJ_VERSION"
}
}
def pomConfig = {
licenses {
license {
name "The Apache Software License, Version 2.0"
url "http://www.apache.org/licenses/LICENSE-2.0.txt"
distribution "repo"
}
}
developers {
developer {
id DEVELOPER_ID
name DEVELOPER_NAME
email DEVELOPER_EMAIL
}
}
}
publishing {
publications {
mavenJava(MavenPublication) {
artifactId PROJ_ARTIFACTID
artifact javadocJar
artifact sourcesJar
pom.withXml {
def root = asNode()
root.appendNode('description', PROJ_DESCRIPTION)
root.children().last() + pomConfig
def dependenciesNode = root.appendNode('dependencies')
configurations.compile.allDependencies.each {
if (it.group && it.name && it.version) {
def dependencyNode = dependenciesNode.appendNode('dependency')
dependencyNode.appendNode('groupId', it.group)
dependencyNode.appendNode('artifactId', it.name)
dependencyNode.appendNode('version', it.version)
}
}
}
}
}
}
afterEvaluate {
publishing.publications.mavenJava.artifact(bundleRelease)
}
bintray {
user = hasProperty("bintrayUser")?getProperty("bintrayUser"):getProperty("BINTRAY_USER")
key = hasProperty("bintrayKey")?getProperty("bintrayKey"):getProperty("BINTRAY_KEY")
publications = ['mavenJava']
publish = true
pkg {
repo = 'maven'
name = PROJ_NAME
desc = PROJ_DESCRIPTION
websiteUrl = PROJ_WEBSITEURL
issueTrackerUrl = PROJ_ISSUETRACKERURL
vcsUrl = PROJ_VCSURL
licenses = ['Apache-2.0']
publicDownloadNumbers = true
}
}
artifactory {
contextUrl = 'http://oss.jfrog.org/artifactory'
resolve {
repository {
repoKey = 'libs-release'
}
}
publish {
repository {
repoKey = 'oss-snapshot-local' //The Artifactory repository key to publish to
username = bintray.user
password = bintray.key
maven = true
}
defaults {
//这里的名字和上面红色的名字一致即可,会将其包含的输出上传到jfrog上去
publications('mavenJava')
publishArtifacts = true
}
}
}
build.gradle
自己的库模块下(比如gridviewlayout),修改build.gradle,添加buildscript下的dependencies,以及apply publish.gradle
apply plugin: 'com.android.library'
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.2'
classpath "org.jfrog.buildinfo:build-info-extractor-gradle:3.1.1"
}
}
android {
compileSdkVersion 22
buildToolsVersion "22.0.1"
defaultConfig {
minSdkVersion 9
targetSdkVersion 22
versionCode 1
versionName "1.0.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
}
apply from: 'publish.gradle'
射精
经过一系列辛苦的劳动后,终于迎来了收获的季节。项目目录下Terminal执行:
gradlew bintrayUpload
就可以把我们的库发射出去了。最后,不要忘记了在Bintray上把自己的库提交JCenter审核。审核通过后,通过类似方式
compile 'com.m4399:gridviewlayout:1.0.0.1'
就可以让更多的开发者,使用上自己的库。甚至可以像运营一款产品一样,去运营自己的库,随着库功能的升级,Github Star数的增加,自己的影响力也会慢慢的提高。这也是在这个动不动就拼爹和拼颜值的时代,程序猿们成为网红的一个最佳途径。