如何使用sbt发布到Amazon S3

21

这里所解释的,我们可以使用maven将内容部署到Amazon S3。

那么,我们如何使用sbt来实现相同的功能,即使用sbt将内容发布到S3?

5个回答

25

这是我编写的一个SBT插件,用于将内容发布到Amazon S3:https://github.com/frugalmechanic/fm-sbt-s3-resolver

它与已经提到的sbt-s3-resolver类似,但使用Apache 2.0许可证(而不是AGPL)并且可以在Maven Central上获得。 它也更容易使用和配置。

发布到S3

publishTo := Some("S3" at "s3://s3-us-west-2.amazonaws.com/YOUR_BUCKET/repo")

从S3解析

resolvers += "S3" at "s3://s3-us-west-2.amazonaws.com/YOUR_BUCKET/repo"

启用插件

只需将以下内容添加到您的 project/plugins.sbt 文件中:

addSbtPlugin("com.frugalmechanic" % "fm-sbt-s3-resolver" % "0.19.0")

配置 AWS 凭证

有多种方法可以配置 AWS 凭证,这些方法在 GitHub 页面中有所记录。

其中一种方法是创建一个 ~/.sbt/.s3credentials 文件,其内容如下:

accessKey = XXXXXXXXXX
secretKey = XXXXXXXXXX

凭据文件将被插件自动获取,您将能够解决和发布。


我喜欢你的解决方案,tpunder;相比这里列出的所有解决方案,它需要最少的配置才能开始运行。 - Tim Harper
唯一有效的解决方案!(解决在S3上的Maven仓库问题)谢谢! - lost in binary
1
@botchniaque 是的。我在Scala 2.10、2.11和2.12项目中使用了这个插件,没有遇到问题。 - tpunder
@sbt 1.5.0 无法解析 resolvers += "FrugalMechanic Snapshots" at "s3://maven.frugalmechanic.com/snapshots",该库还活着吗? - expert
@专家 这只是一个例子,不是你应该尝试指向的东西。 - tpunder
显示剩余4条评论

6
问题很老,所以您可能已经找到了一些解决方法,但是对其他人来说,这个答案可能会有用。我们的团队也遇到了这样的问题,我们刚刚为此创建了一个sbt插件:sbt-s3-resolver。我们使用它有一段时间了,似乎它的工作很好。它可以:
  • 将ivy / maven 构件发布到S3(私有/公共)存储桶中
  • 私有存储桶中解析ivy构件(因为从公共存储桶中您可以使用标准的sbt解析器进行解析)
请查看自述文件中的使用说明,并在缺少内容时打开问题。

1
虽然这个插件看起来正是我所需要的,但不幸的是它的许可证对商业使用有些问题...我的公司表示,“即使作为工具,AGPL 3.0也永远不会被批准”。 - Michael Yakobi
这节省了我很多时间 - 谢谢@laughedelic - Connor Doyle
@connor-doyle,很高兴它对你有帮助! - laughedelic
1
@michael-yakobi,我不确定我是否理解你的意思,但据我所知,APGLv3并不限制软件的任何使用方式,它只在你分发、更改代码等情况下进行限制。 - laughedelic

4
我使用sbt-s3插件成功实现了这个功能。 https://github.com/sbt/sbt-s3 以下是一个示例:
import sbt._
import Keys._
import play.Project._

import com.typesafe.sbt.S3Plugin._
import S3._
import sbtassembly.Plugin.AssemblyKeys
import sbtassembly.Plugin.AssemblyKeys._
import sbtassembly.Plugin.assemblySettings
import sbtassembly.Plugin.MergeStrategy
import sbtbuildinfo.Plugin._

object ApplicationBuild extends Build {

  val appName = "og-ws"
  val appVersion = "1.0-SNAPSHOT"

  val appDependencies = Seq(
    // Add your project dependencies here,
    jdbc,
    anorm,
    "com.netflix.astyanax" % "astyanax-cassandra" % "1.56.28",
    "com.netflix.astyanax" % "astyanax-thrift" % "1.56.28",
    "com.netflix.astyanax" % "astyanax-entity-mapper" % "1.56.28")

  val main = (
    play.Project(appName, appVersion, appDependencies)
    settings (s3Settings: _*)
    settings (assemblySettings: _*)
    settings (
      // call its setters to configure it, see api docs above etc.
      publish := (),
      publishLocal := (),
      mappings in upload <<= dist map { distFile =>
        Seq(distFile -> "snapshot/%s/%s/%s-%s.zip".format(appName, appVersion, appName, appVersion))
      },
      host in upload := "plaor.maven.s3.amazonaws.com",
      credentials += Credentials(Path.userHome / ".s3credentials")))
}

你能添加s3Settings的内容吗? - expert
抱歉,这是8年前的事了。看起来我对该对象使用了implicit,但我认为它只是使用了s3凭据文件。 - dres

2
我还没有尝试过这个,但从API文档来看,这个可能有效:
  1. Get http://www.jarvana.com/jarvana/view/org/springframework/aws/spring-aws-ivy/1.0/spring-aws-ivy-1.0-javadoc.jar!/org/springframework/aws/ivy/S3Resolver.html (see http://repo1.maven.org/maven2/org/springframework/aws/spring-aws-ivy/1.0/ --- you should be able to download the jar in project/lib/, or put "org.springframework.aws" % "spring-aws-ivy" % "1.0" in project/build.sbt).
  2. Add this to your build.sbt:

    {
      val s3r = new org.springframework.aws.ivy.S3Resolver
      // call its setters to configure it, see api docs above etc.
      publishTo := Some(new sbt.RawRepository(s3r)
    }
    

我没有亲自尝试过这个方法,但是由于publishTo是一个SettingKey [Option [Resolver]],而RawRepository扩展了Resolver并且接受org.apache.ivy.plugins.resolver.DependencyResolverS3Resolver实现了DependencyResolver,所以我猜应该可以使用。

毕竟,sbt实际上只是Apache Ivy的包装器。


0

我也需要从我们的构建工具上传一个装配 jar 到 s3 存储桶。@dres 的答案帮助我朝着正确的方向前进。

我在 build.sbt 文件中使用以下代码使其正常工作。

正如您所看到的,我利用了 sbt-assembly 中可用的 SettingKey[String] 值。

// s3Upload
import S3._

s3Settings
mappings in upload := Seq(
  (assemblyOutputPath in assembly).value -> 
       s"${name.value}/${version.value}/${(assemblyJarName in assembly).value}"
)

host in upload := "my-bucket.s3.amazonaws.com"

S3.progress in S3.upload := true
  • assemblyOutputPath in assembly 可以给你完整的输出路径,指向你的汇编 jar 文件。
  • assemblyJarName in assembly 可以给你汇编产生的 jar 文件名。
  • 你需要调用 .value 来从 SBT 键中获取实际值。

这将使用命令 sbt s3Upload 将汇编 jar 上传到 my-bucket 下的 name/version/name-assembly-version.jar

请注意,我还在环境中设置了我的 AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY。可以在 这里 找到查找凭据的顺序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接