Gradle
作為編譯工具,理所當(dāng)然也要談?wù)?code>publish這塊。Gradle
提供了兩種發(fā)布方式,分別是ivy
和maven
,這里著重說下maven
的方式好了,這也是最常用的方式。
PublishingExtension
Gradle
提供出來的publishing
閉包配置為:
publishing {
publications { ... }
repositories.maven { ... }
}
從前面的文章可知,對應(yīng)的分別是兩個方法:
void repositories(Action<? super RepositoryHandler> configure)
publications(Action<? super PublicationContainer> configure)
RepositoryHandler
repositories
函數(shù)用來設(shè)置具體的RepositoryHandler
實例(FlatDirectoryArtifactRepository
,IvyArtifactRepository
以及MavenArtifactRepository
)。
repositories {
maven {
credentials {
username = "user"
password = "password"
}
url "https://xxx.com"
}
}
這里對應(yīng)的就是MavenArtifactRepository
,分別調(diào)用方法setUrl(Object url)
設(shè)置倉庫地址以及方法credentials(Action<? super PasswordCredentials> action)
設(shè)置倉庫地址進(jìn)行登陸鑒權(quán)的用戶名和密碼。
PublicationContainer
同樣,publications
用來創(chuàng)建PublicationContainer
實例(IvyPublication以及MavenPublication)。
publications {
myPublication(MavenPublication) {
from components.java
artifact sourceJar
pom.withXml {
asNode().appendNode('description', 'A demonstration of Maven POM customization')
}
}
}
上述閉包配置作用在于創(chuàng)建兩個實現(xiàn)了MavenPublication
接口的task
。
-
publishMyPublicationToMavenLocal
發(fā)布到本地倉庫 -
publishMyPublicationToMavenRepository
發(fā)布到遠(yuǎn)程倉庫。
理所當(dāng)然,這兩個task
必須在build
后執(zhí)行,因為需要拿build
后生成的jar
或者aar
包。
在前面task
章節(jié)我們了解到這里需要進(jìn)行dependsOn
配置。
tasks.whenTaskAdded { task ->
if (task.name == "publishMyPublicationToMavenLocal" ||
task.name == "publishMyPublicationToMavenRepository") {
task.dependsOn build
}
}
接下來,詳細(xì)了解具體的MavenPublication
的配置選項。
MavenPublication
具體類為org.gradle.api.publish.maven.MavenPublication
,詳細(xì)的方法可以自行查略,這里說說其中最為關(guān)鍵的幾個方法。
-
void setGroupId(String groupId)
設(shè)置groupID
,對應(yīng)com.gradle:tools:1.0
中的com.gradle
。 -
void setArtifactId(String artifactId)
設(shè)置artifactId
,對應(yīng)com.gradle:tools:1.0
中的tools
。 -
MavenArtifact artifact(Object source)
添加MavenArtifact
到publish
任務(wù)中。 -
void pom(Action<? super MavenPom> configure)
配置Pom
,對應(yīng)就是用來進(jìn)行遞歸依賴的Pom.xml
中內(nèi)容。
artifact
artifact
方法是提供Object
對象,具體是什么呢?主要是三種。
-
artifact 'my-file-name.jar'
具體的文件。 -
artifact sourceJar
任務(wù)sourceJar
輸出物,例如這里是對源碼進(jìn)行了打包的Jar
包。 -
artifact source: sourceJar, classifier: 'src', extension: 'zip'
通過source
、classifier
以及extension
構(gòu)造的MavenArtifact
實例,參數(shù)分別對應(yīng)源文件,名稱類別(artifactId-classifier
)以及擴(kuò)展名稱(.jar/.zip
等)。
pom
pom
方法通過傳遞一個MavenPom
對象來添加對應(yīng)配置內(nèi)容到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中配置選項是一一對應(yīng)的,例如getGroupId()
、getArtifactId()
等。
這樣,當(dāng)你發(fā)布出去的包被依賴的時候,所包含的Pom.xml
中的com.gradle:design:1.0
包也會依賴進(jìn)來,但是這個包所依賴的com.gradle:support
卻除外不再依賴進(jìn)來。
那我們怎么去構(gòu)造一個這樣的MavenPom
對象出來呢?有很多種方法,這里提及一種最常見的方式,MavenPom withXml(Action<XmlProvider> action)
。
XmlProvider
可以通過xml
文件格式進(jìn)行實現(xiàn)。
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)
}
}
}
到此為止,已經(jīng)可以完成對本地文件的發(fā)布(包含但不限于jar/aar/so
等),對應(yīng)的唯一依賴標(biāo)示為com.gradle:tools:1.0
。
后續(xù)
Gradle
提供的publish
不僅僅可用于常規(guī)的jar、aar、so
發(fā)布,還可以發(fā)布一些我們在進(jìn)行編譯的時候需要用到的腳本(python、luna等)、配置信息等,這些就需要針對編譯流程進(jìn)行各自的思考。