sbt筆記-Detailed Topics-Publishing

正好想把spray.io的源碼發佈到本地倉庫Nexus,因而順便看了一下官方文檔

發佈

本頁介紹瞭如何發佈你的應用。發佈包括上傳一個描述符,諸如Ivy文件或Maven POM,以及製品(artifacts),諸如一個Jar或War,到一個倉庫,以便其餘的項目能夠把你的項目指定爲依賴。 html

publish功能用於發佈你的項目到一個遠程倉庫。爲了使用發佈,你須要指定要發佈的倉庫和要用的認證信息。一旦設置了這些,你就能夠運行publish了。 node

publishLocal功能用於發佈你的項目到本地Ivy倉庫。而後你就能夠在同一臺機器上的其餘項目裏使用這個項目。 apache

定義倉庫

指定倉庫,須要指定一個倉庫到publishTo,並有選擇地設置一個發佈風格。例如,上傳到Nexus: 緩存

publishTo := Some("Sonatype Snapshots Nexus" at "https://oss.sonatype.org/content/repositories/snapshots")

發佈到本地倉庫: maven

publishTo := Some(Resolver.file("file", new File( "path/to/my/maven-repo/releases" )) )

發佈到用戶的本地maven倉庫: ui

publishTo := Some(Resolver.file("file", new File(Path.userHome.absolutePath+"/.m2/repository")))

若是你使用Maven倉庫,你也要依據你的製品(artifacts)選擇正確的倉庫:SNAPSHOT版本放到/snapshot倉庫,其餘版本放到/releases倉庫。這個選擇能夠經過version SettingKey來實現: url

publishTo := {   val nexus = "https://oss.sonatype.org/" if (version.value.trim.endsWith("SNAPSHOT"))  Some("snapshots" at nexus + "content/repositories/snapshots")  else  Some("releases" at nexus + "service/local/staging/deploy/maven2") }

認證信息

有兩種方式爲一個倉庫指定認證信息。第一種是經過內斂方式來指定: spa

credentials += Credentials("Sonatype Nexus Repository Manager", "nexus.scala-tools.org", "admin", "admin123")

譯註:發佈到Nexus倉庫的話,第二個參數要設置爲Nexus的域名或IP,由於我要發佈到本地,因此值應爲"127.0.0.1";
第一個參數是realm,不知道幹嗎用的,反正文檔裏給提供的這個值好用;
後兩個參數則爲Nexus的用戶名和密碼,默認爲admin和admin123;
另外我在Build.scala中使用上面方式沒起做用,須要以下寫法纔有用: scala

Credentials.add("Sonatype Nexus Repository Manager", "127.0.0.1", "admin", "admin123")


第二種,也是更好的方式是從文件加載他們,例如: code

credentials += Credentials(Path.userHome / ".ivy2" / ".credentials")

譯註:一樣的,這裏也要寫成

Credentials.add(Path.userHome / ".ivy2" / ".credentials", null)
第一個參數是認證文件路徑,類型爲File;第二個參數是log對象,目前還不知道要怎麼用。


認證文件是一個資源文件,包含的鍵有realm,host,user和password。例如:

realm=Sonatype Nexus Repository Manager
host=nexus.scala-tools.org
user=admin
password=admin123

Cross發佈

爲了支持多個不相容的Scala版本,啓用cross構建並執行+publish(do + publish)(見Cross-building)。閱讀Resolvers來了解其餘支持的倉庫類型。

已發佈的製品

默認狀況下,主二進制jar,源碼jar以及API文檔jar會被髮布。你能夠聲明其餘類型的製品來發布,而且禁用或修改默認的製品。詳細內容見Artifacts

修改生成的POM

當publishMavenStyle爲true,經過makePom功能會生成一個POM,並代替Ivy文件發佈到倉庫。這個POM文件能夠經過 改變一些設置來改變。設置pomExtra來提供XML(scala.xml.NodeSeq)來直接插入到生產的pom。例如:

pomExtra :=     <licenses>         <license>             <name>Apache 2</name>             <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>             <distribution>repo</distribution>         </license>     </licenses>

makePom將你聲明的Maven風格倉庫添加到POM。你能夠經過修改pomRepositoryFilter來過濾它們,默認會排除本地倉庫。替換成只包含本地倉庫:

pomIncludeRepository := { (repo: MavenRepository) => repo.root.startsWith("file:") }

另外有一個pomPostProcess設置,它用於在寫入前操做最終的XML。它的類型是Node => Node。

pomPostProcess := { (node: Node) => ... }

發佈到本地

publishLocal命令會發布到本地Ivy倉庫。默認在${user.home}/.ivy2/local文件夾。以後,同一臺機器上的其餘項目能夠把這個項目列爲以來。例如,若是你正在發佈的SBT項目配置了以下參數:

name := 'My Project'
organization := 'org.me'
version := '0.1-SNAPSHOT'

以後另外一個項目能夠依賴它:

libraryDependencies += "org.me" %% "my-project" % "0.1-SNAPSHOT"

你選擇的版本號必須以SNAPSHOT結尾,或者你必須每次在發佈的時候更改版本號。Ivy維護一個緩存,而且它在緩存中保存偶數本地項目(it stores even local projects in that cache)。若是Ivy已經緩存了一個版本,它將再也不爲更新而檢查本地倉庫,除非版本號匹配一個changing pattern,而且SNAPSHOT就是這樣一個模式。

相關文章
相關標籤/搜索