Gradle
作為編譯工具,理所當(dāng)然也要談?wù)?code>publish這塊吟税。Gradle
提供了兩種發(fā)布方式蚌父,分別是ivy
和maven
撮慨,這里著重說(shuō)下maven
的方式好了,這也是最常用的方式损晤。
PublishingExtension
Gradle
提供出來(lái)的publishing
閉包配置為:
publishing {
publications { ... }
repositories.maven { ... }
}
從前面的文章可知软棺,對(duì)應(yīng)的分別是兩個(gè)方法:
void repositories(Action<? super RepositoryHandler> configure)
publications(Action<? super PublicationContainer> configure)
RepositoryHandler
repositories
函數(shù)用來(lái)設(shè)置具體的RepositoryHandler
實(shí)例(FlatDirectoryArtifactRepository
,IvyArtifactRepository
以及MavenArtifactRepository
)沉馆。
repositories {
maven {
credentials {
username = "user"
password = "password"
}
url "https://xxx.com"
}
}
這里對(duì)應(yīng)的就是MavenArtifactRepository
码党,分別調(diào)用方法setUrl(Object url)
設(shè)置倉(cāng)庫(kù)地址以及方法credentials(Action<? super PasswordCredentials> action)
設(shè)置倉(cāng)庫(kù)地址進(jìn)行登陸鑒權(quán)的用戶名和密碼。
PublicationContainer
同樣斥黑,publications
用來(lái)創(chuàng)建PublicationContainer
實(shí)例(IvyPublication以及MavenPublication)揖盘。
publications {
myPublication(MavenPublication) {
from components.java
artifact sourceJar
pom.withXml {
asNode().appendNode('description', 'A demonstration of Maven POM customization')
}
}
}
上述閉包配置作用在于創(chuàng)建兩個(gè)實(shí)現(xiàn)了MavenPublication
接口的task
。
-
publishMyPublicationToMavenLocal
發(fā)布到本地倉(cāng)庫(kù) -
publishMyPublicationToMavenRepository
發(fā)布到遠(yuǎn)程倉(cāng)庫(kù)锌奴。
理所當(dāng)然兽狭,這兩個(gè)task
必須在build
后執(zhí)行,因?yàn)樾枰?code>build后生成的jar
或者aar
包鹿蜀。
在前面task
章節(jié)我們了解到這里需要進(jìn)行dependsOn
配置箕慧。
tasks.whenTaskAdded { task ->
if (task.name == "publishMyPublicationToMavenLocal" ||
task.name == "publishMyPublicationToMavenRepository") {
task.dependsOn build
}
}
接下來(lái),詳細(xì)了解具體的MavenPublication
的配置選項(xiàng)茴恰。
MavenPublication
具體類為org.gradle.api.publish.maven.MavenPublication
颠焦,詳細(xì)的方法可以自行查略,這里說(shuō)說(shuō)其中最為關(guān)鍵的幾個(gè)方法往枣。
-
void setGroupId(String groupId)
設(shè)置groupID
伐庭,對(duì)應(yīng)com.gradle:tools:1.0
中的com.gradle
粉渠。 -
void setArtifactId(String artifactId)
設(shè)置artifactId
,對(duì)應(yīng)com.gradle:tools:1.0
中的tools
圾另。 -
MavenArtifact artifact(Object source)
添加MavenArtifact
到publish
任務(wù)中霸株。 -
void pom(Action<? super MavenPom> configure)
配置Pom
,對(duì)應(yīng)就是用來(lái)進(jìn)行遞歸依賴的Pom.xml
中內(nèi)容集乔。
artifact
artifact
方法是提供Object
對(duì)象去件,具體是什么呢?主要是三種扰路。
-
artifact 'my-file-name.jar'
具體的文件尤溜。 -
artifact sourceJar
任務(wù)sourceJar
輸出物,例如這里是對(duì)源碼進(jìn)行了打包的Jar
包幼衰。 -
artifact source: sourceJar, classifier: 'src', extension: 'zip'
通過(guò)source
靴跛、classifier
以及extension
構(gòu)造的MavenArtifact
實(shí)例,參數(shù)分別對(duì)應(yīng)源文件渡嚣,名稱類別(artifactId-classifier
)以及擴(kuò)展名稱(.jar/.zip
等)。
pom
pom
方法通過(guò)傳遞一個(gè)MavenPom
對(duì)象來(lái)添加對(duì)應(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中配置選項(xiàng)是一一對(duì)應(yīng)的识椰,例如getGroupId()
、getArtifactId()
等深碱。
這樣腹鹉,當(dāng)你發(fā)布出去的包被依賴的時(shí)候,所包含的Pom.xml
中的com.gradle:design:1.0
包也會(huì)依賴進(jìn)來(lái)敷硅,但是這個(gè)包所依賴的com.gradle:support
卻除外不再依賴進(jìn)來(lái)功咒。
那我們?cè)趺慈?gòu)造一個(gè)這樣的MavenPom
對(duì)象出來(lái)呢?有很多種方法绞蹦,這里提及一種最常見(jiàn)的方式力奋,MavenPom withXml(Action<XmlProvider> action)
。
XmlProvider
可以通過(guò)xml
文件格式進(jìn)行實(shí)現(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是存儲(chǔ)org.gradle.api.artifacts.ExcludeRule對(duì)象的集合
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)可以完成對(duì)本地文件的發(fā)布(包含但不限于jar/aar/so
等),對(duì)應(yīng)的唯一依賴標(biāo)示為com.gradle:tools:1.0
澡屡。
后續(xù)
Gradle
提供的publish
不僅僅可用于常規(guī)的jar猿挚、aar、so
發(fā)布驶鹉,還可以發(fā)布一些我們?cè)谶M(jìn)行編譯的時(shí)候需要用到的腳本(python绩蜻、luna等)、配置信息等室埋,這些就需要針對(duì)編譯流程進(jìn)行各自的思考办绝。