關于我對Gradle的翻譯,以Github上的項目及http://gradledoc.qiniudn.com 上的文檔為準。如發(fā)現(xiàn)翻譯有誤的地方,將首先在以上兩個地方更新。因時間精力問題,博客中發(fā)表的譯文基本不會同步修改。
另外,目前Gradle1.12版本的文檔進入校稿階段,校稿的方式可以為到該項目https://github.com/msdx/gradledoc 提交issue或是pull request。校稿的結果不只是在此版本更新,也會用于改良Gradle下1版本(2.0)文檔的翻譯。
簽名插件添加了對構件的文件和artifacts進行數(shù)字簽名的功能。這些數(shù)字簽名可以用于證明使用這個簽名的artifact是誰構建的,和其他的信息,比如簽名是甚么時候生成的。
簽名插件目前只提供了生成PGP 簽名的支持(這是發(fā)布到Maven 中央庫所需的簽名格式)。
要使用 Signing 插件,請在構建腳本中包括以下語句:
示例 53.1. 使用Signing插件
build.gradle
apply plugin: 'signing'
為了創(chuàng)建 PGP 簽名,你將需要1個密鑰對(有關使用GnuPG 工具創(chuàng)建密鑰對的介紹可以在GnuPG Howto中找到)。您需要向簽名插件提供你的關鍵信息,即以下3項信息:
公鑰 ID (1個8位字符的106進制字符串)。
指向包括了你的私鑰的密鑰環(huán)文件的絕對路徑。
用來保護你的私鑰的密碼。
這些條目必須分別作為屬性項目signing.keyId
、 signing.password
和signing.secretKeyRingFile
進行提供。鑒于這些值的個人和私人性質,1個好的做法是將它們保存在用戶的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)境,你可以提供這些信息,但你需要手動設置項目的屬性。
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" } }
除配置內容要如何簽名(即簽名配置),你還必須指定哪些文件要簽名。Signing 插件提供了1個DSL,它允許你指定應簽名的任務及配置。
簽名1個配置的artifacts是很常見的情況。例如, Java 插件配置了構建1個jar文件,并且把 jar 文件添加到archives
配置。使用Signing DSL,你可以指定這個配置的所有 artifacts 都應當被簽名。
53.3.2. 簽名1個配置
build.gradle
signing { sign configurations.archives }
這將在你的項目中創(chuàng)建1個名為“signArchives
”的任務(Sign
類型),這個任務會構建任何archives
的artifacts(如果需要),然后為它們生成簽名。簽名文件將和被簽名的artifacts放在1起。
示例 53.3. 簽署1個配置的輸出
gradle signArchives
的輸出結果
> gradle signArchives :compileJava :processResources :classes :jar :signArchives BUILD SUCCESSFUL Total time: 1 secs
在某些情況下,你需要簽名的artifact 可能不是配置的1部份。在這類情況下,你可以直接簽名生成了要簽名的artifact 的任務。
53.4. 簽名1個任務
build.gradle
task stuffZip (type: Zip) { baseName = "stuff" from "src/stuff" } signing { sign stuffZip }
這將在您的項目創(chuàng)建1個名為“signStuffZip
”的(Sign
類型) 的任務,這個任務會構建輸入任務的archive(如果需要),并進行簽字。簽名文件將和被簽名的 artifact 放在1起。
示例 53.5. 簽名1個任務的輸出
gradle signStuffZip
的輸出結果
> gradle signStuffZip :stuffZip :signStuffZip BUILD SUCCESSFUL Total time: 1 secs
1個“可簽名”的任務,必須輸出某種類型的archive。這樣的任務有 Tar
, Zip
, Jar
, War
及 Ear
任務。
常見的使用模式是只在1定條件下簽名構建的artifacts。例如,你可能不想對非發(fā)布版本簽名artifacts。要做到這1點,你可以指定只在1定條件下才要求簽名。
53.6. 有條件的簽名
build.gradle
version = '1.0-SNAPSHOT' ext.isReleaseVersion = !version.endsWith("SNAPSHOT") signing { required { isReleaseVersion && gradle.taskGraph.hasTask("uploadArchives") } sign configurations.archives }
在此示例中,我們只想要在我們構建1個我們行將去發(fā)布的發(fā)布版本的時候,才進行簽名。由于我們正在檢查任務圖,以肯定是不是打算發(fā)布,我們必須將signing.required
屬性設置為1個閉包以推延evaluation。更多的信息,請參閱SigningExtension.setRequired()
。
當通過 Signing DSL指定甚么要被簽名的時候,生成的signature會自動地加入到 signatures
和 archives
的依賴配置中。這意味著,如果你想要將你的簽名和artifacts上傳到你的散布倉庫中,正常來說你只需要履行uploadArchives
任務。
當為你的artifacts部署簽名到 Maven 倉庫時,你還想簽名發(fā)布的 POM 文件。簽名插件添加了1個signing.signPom()
(請參見: SigningExtension.signPom()
)方法,這個方法可以在你的上傳任務配置的beforeDeployment()
塊中使用。
示例 53.7. 為部署簽名 POM
build.gradle
uploadArchives { repositories { mavenDeployer { beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) } } } }
當不需要簽名,和由于缺少配置(即沒有簽名證書)而不能簽名 POM 的時候,signPom()
方法將甚么都不會做,并且不會進行任何的提示。