正好想把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
为了支持多个不相容的Scala版本,启用cross构建并执行+publish(do + publish)(见Cross-building)。阅读Resolvers来了解其余支持的仓库类型。
默认状况下,主二进制jar,源码jar以及API文档jar会被发布。你能够声明其余类型的制品来发布,而且禁用或修改默认的制品。详细内容见Artifacts。
当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就是这样一个模式。