正好想把spray.io的源码发布到本地仓库Nexus,于是顺便看了一下官方文档
发布
本页介绍了如何发布你的应用。发布包括上传一个描述符,诸如Ivy文件或Maven POM,以及制品(artifacts),诸如一个Jar或War,到一个仓库,以便其他的项目可以把你的项目指定为依赖。
publish功能用于发布你的项目到一个远程仓库。为了使用发布,你需要指定要发布的仓库和要用的认证信息。一旦设置了这些,你就可以运行publish了。
publishLocal功能用于发布你的项目到本地Ivy仓库。然后你就可以在同一台机器上的其他项目里使用这个项目。
定义仓库
指定仓库,需要指定一个仓库到publishTo,并有选择地设置一个发布风格。例如,上传到Nexus:
publishTo := Some("Sonatype Snapshots Nexus" at "https://oss.sonatype.org/content/repositories/snapshots")
发布到本地仓库:
publishTo := Some(Resolver.file("file", new File( "path/to/my/maven-repo/releases" )) )
发布到用户的本地maven仓库:
publishTo := Some(Resolver.file("file", new File(Path.userHome.absolutePath+"/.m2/repository")))
如果你使用Maven仓库,你也要依据你的制品(artifacts)选择正确的仓库:SNAPSHOT版本放到/snapshot仓库,其他版本放到/releases仓库。这个选择可以通过version SettingKey来实现:
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") }
认证信息
有两种方式为一个仓库指定认证信息。第一种是通过内敛方式来指定:
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中使用上面方式没起作用,需要如下写法才有用:
Credentials.add("Sonatype Nexus Repository Manager", "127.0.0.1", "admin", "admin123")
)
第二种,也是更好的方式是从文件加载他们,例如:
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就是这样一个模式。