關(guān)于我對Gradle的翻譯,以Github上的項(xiàng)目及http://gradledoc.qiniudn.com 上的文檔為準(zhǔn)。如發(fā)現(xiàn)翻譯有誤的地方,將首先在以上兩個(gè)地方更新。因時(shí)間精力問題,博客中發(fā)表的譯文基本不會同步修改。
另外,目前Gradle1.12版本的文檔進(jìn)入校稿階段,校稿的方式可以為到該項(xiàng)目https://github.com/msdx/gradledoc 提交issue或是pull request。校稿的結(jié)果不只是在此版本更新,也會用于改良Gradle下1版本(2.0)文檔的翻譯。
簽名插件添加了對構(gòu)件的文件和artifacts進(jìn)行數(shù)字簽名的功能。這些數(shù)字簽名可以用于證明使用這個(gè)簽名的artifact是誰構(gòu)建的,和其他的信息,比如簽名是甚么時(shí)候生成的。
簽名插件目前只提供了生成PGP 簽名的支持(這是發(fā)布到Maven 中央庫所需的簽名格式)。
要使用 Signing 插件,請?jiān)跇?gòu)建腳本中包括以下語句:
示例 53.1. 使用Signing插件
build.gradle
apply plugin: 'signing'
為了創(chuàng)建 PGP 簽名,你將需要1個(gè)密鑰對(有關(guān)使用GnuPG 工具創(chuàng)建密鑰對的介紹可以在GnuPG Howto中找到)。您需要向簽名插件提供你的關(guān)鍵信息,即以下3項(xiàng)信息:
公鑰 ID (1個(gè)8位字符的106進(jìn)制字符串)。
指向包括了你的私鑰的密鑰環(huán)文件的絕對路徑。
用來保護(hù)你的私鑰的密碼。
這些條目必須分別作為屬性項(xiàng)目signing.keyId
、 signing.password
和signing.secretKeyRingFile
進(jìn)行提供。鑒于這些值的個(gè)人和私人性質(zhì),1個(gè)好的做法是將它們保存在用戶的gradle.properties
文件(第14.2 節(jié),“Gradle 屬性和系統(tǒng)屬性”中所述)。
signing.keyId=24875D73 signing.password=secret signing.secretKeyRingFile=/Users/me/.gnupg/secring.gpg
如果在用戶的gradle.properties
文件中指定的信息不合適你的環(huán)境,你可以提供這些信息,但你需要手動設(shè)置項(xiàng)目的屬性。
import org.gradle.plugins.signing.Sign gradle.taskGraph.whenReady { taskGraph -> if (taskGraph.allTasks.any { it instanceof Sign }) { // Use Java 6's console to read from the console (no good for a CI environment) Console console = System.console() console.printf "\n\nWe have to sign some things in this build.\n\nPlease enter your signing details.\n\n" def id = console.readLine("PGP Key Id: ") def file = console.readLine("PGP Secret Key Ring File (absolute path): ") def password = console.readPassword("PGP Private Key Password: ") allprojects { ext."signing.keyId" = id } allprojects { ext."signing.secretKeyRingFile" = file } allprojects { ext."signing.password" = password } console.printf "\nThanks.\n\n" } }
除配置內(nèi)容要如何簽名(即簽名配置),你還必須指定哪些文件要簽名。Signing 插件提供了1個(gè)DSL,它允許你指定應(yīng)簽名的任務(wù)及配置。
簽名1個(gè)配置的artifacts是很常見的情況。例如, Java 插件配置了構(gòu)建1個(gè)jar文件,并且把 jar 文件添加到archives
配置。使用Signing DSL,你可以指定這個(gè)配置的所有 artifacts 都應(yīng)當(dāng)被簽名。
53.3.2. 簽名1個(gè)配置
build.gradle
signing { sign configurations.archives }
這將在你的項(xiàng)目中創(chuàng)建1個(gè)名為“signArchives
”的任務(wù)(Sign
類型),這個(gè)任務(wù)會構(gòu)建任何archives
的artifacts(如果需要),然后為它們生成簽名。簽名文件將和被簽名的artifacts放在1起。
示例 53.3. 簽署1個(gè)配置的輸出
gradle signArchives
的輸出結(jié)果
> gradle signArchives :compileJava :processResources :classes :jar :signArchives BUILD SUCCESSFUL Total time: 1 secs
在某些情況下,你需要簽名的artifact 可能不是配置的1部份。在這類情況下,你可以直接簽名生成了要簽名的artifact 的任務(wù)。
53.4. 簽名1個(gè)任務(wù)
build.gradle
task stuffZip (type: Zip) { baseName = "stuff" from "src/stuff" } signing { sign stuffZip }
這將在您的項(xiàng)目創(chuàng)建1個(gè)名為“signStuffZip
”的(Sign
類型) 的任務(wù),這個(gè)任務(wù)會構(gòu)建輸入任務(wù)的archive(如果需要),并進(jìn)行簽字。簽名文件將和被簽名的 artifact 放在1起。
示例 53.5. 簽名1個(gè)任務(wù)的輸出
gradle signStuffZip
的輸出結(jié)果
> gradle signStuffZip :stuffZip :signStuffZip BUILD SUCCESSFUL Total time: 1 secs
1個(gè)“可簽名”的任務(wù),必須輸出某種類型的archive。這樣的任務(wù)有 Tar
, Zip
, Jar
, War
及 Ear
任務(wù)。
常見的使用模式是只在1定條件下簽名構(gòu)建的artifacts。例如,你可能不想對非發(fā)布版本簽名artifacts。要做到這1點(diǎn),你可以指定只在1定條件下才要求簽名。
53.6. 有條件的簽名
build.gradle
version = '1.0-SNAPSHOT' ext.isReleaseVersion = !version.endsWith("SNAPSHOT") signing { required { isReleaseVersion && gradle.taskGraph.hasTask("uploadArchives") } sign configurations.archives }
在此示例中,我們只想要在我們構(gòu)建1個(gè)我們行將去發(fā)布的發(fā)布版本的時(shí)候,才進(jìn)行簽名。由于我們正在檢查任務(wù)圖,以肯定是不是打算發(fā)布,我們必須將signing.required
屬性設(shè)置為1個(gè)閉包以推延evaluation。更多的信息,請參閱SigningExtension.setRequired()
。
當(dāng)通過 Signing DSL指定甚么要被簽名的時(shí)候,生成的signature會自動地加入到 signatures
和 archives
的依賴配置中。這意味著,如果你想要將你的簽名和artifacts上傳到你的散布倉庫中,正常來說你只需要履行uploadArchives
任務(wù)。
當(dāng)為你的artifacts部署簽名到 Maven 倉庫時(shí),你還想簽名發(fā)布的 POM 文件。簽名插件添加了1個(gè)signing.signPom()
(請參見: SigningExtension.signPom()
)方法,這個(gè)方法可以在你的上傳任務(wù)配置的beforeDeployment()
塊中使用。
示例 53.7. 為部署簽名 POM
build.gradle
uploadArchives { repositories { mavenDeployer { beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) } } } }
當(dāng)不需要簽名,和由于缺少配置(即沒有簽名證書)而不能簽名 POM 的時(shí)候,signPom()
方法將甚么都不會做,并且不會進(jìn)行任何的提示。