使用 CodeArtifact 和 SBT
- 设置 SBT 和 CodeArtifact
- 使用 SBT 发布包(同时避免将构件处于“未完成”状态)
1. 设置 SBT 和 CodeArtifact
创建一个具有 Maven 上游的 CodeArtifact 存储库。在此示例中,我们将使用域名 launchops 中的存储库 maven-test。
打开控制台中的连接说明并选择 mvn。稍后我们需要从中获取信息。
复制在控制台中导出“CODEARTIFACT_AUTH_TOKEN”环境变量的命令,并在您的环境中运行它。这将使“CODEARTIFACT_AUTH_TOKEN”成为我们存储库的密码,用户名始终为 aws。
在 build.sbt 文件中导入 sbt.Credentials:
import sbt.{Credentials}
现在我们需要设置凭据。为此,我们首先要读取CODEARTIFACT_AUTH_TOKEN环境变量:
val repoPass = sys.env.get("CODEARTIFACT_AUTH_TOKEN").getOrElse("")
接下来,我们将使用之前导入的sbt.Credentials来设置一组新的凭据:
credentials += Credentials("launchops/maven-test", "launchops-123456789012.d.codeartifact.us-east-1.amazonaws.com", "aws", repoPass)
Credentials 对象传递的值为(“域名/仓库名称”,“不包含协议的仓库主机名”,“用户名”,“密码”),其中用户名始终为 aws,密码来自 repoPass 变量,我们只需要修改前两个值以指向我们的仓库。
现在,我们只需要指示 SBT 使用我们的仓库作为解析器。控制台连接说明将生成 Maven 设置,例如:
<repository>
<id>launchops--maven-test</id>
<url>https://launchops-123456789012.d.codeartifact.us-east-1.amazonaws.com/maven/maven-test/</url>
</repository>
我们将使用这些值在我们的build.sbt
文件中创建一个解析器:
resolvers += "launchops--maven-test" at "https://launchops-123456789012.d.codeartifact.us-east-1.amazonaws.com/maven/maven-test"
格式为"resolvers += "从maven配置中获取的ID在控制台中" at "从maven配置中获取的仓库URL在控制台中"。
要完全禁用公共Maven仓库的使用(强制使用CodeArtifact),您可以将以下行添加到build.sbt
文件中:
externalResolvers := Resolver.combineDefaultResolvers(resolvers.value.toVector, mavenCentral = false)
完成这些设置步骤后,您应该能够运行 sbt update
,并通过 CodeArtifact 下载包。
供参考的示例 build.sbt:
import sbt.{Credentials, Path}
name := "scala-test"
version := "0.3.0"
scalaVersion := "2.12.6"
organization := "com.abc.def"
val repoPass = sys.env.get("CODEARTIFACT_AUTH_TOKEN").getOrElse("")
credentials += Credentials("launchops/maven-test", "launchops-123456789012.d.codeartifact.us-east-1.amazonaws.com", "aws", repoPass)
resolvers += "launchops--maven-test" at "https://launchops-123456789012.d.codeartifact.us-east-1.amazonaws.com/maven/maven-test"
libraryDependencies ++= Seq(
"org.scalatest" %% "scalatest" % "3.0.0" % "test",
"io.nats" % "jnats" % "2.0.0",
"org.json4s" %% "json4s-native" % "3.6.0"
)
2. 发布包
除了获取依赖,SBT还可以用于发布包。要让SBT发布到CodeArtifact,我们首先需要在build.sbt文件中进行设置:
将以下内容添加到文件中:
publishMavenStyle := true
publishTo := Some("launchops--maven-test" at "https://launchops-123456789012.d.codeartifact.us-east-1.amazonaws.com/maven/maven-test")
现在,从技术上讲,运行sbt publish
将会把软件包推送到CodeArtifact,但是它将以未完成
的状态结束。我们需要使用sbt-maven-resolver插件,帮助将软件包转换成正确的格式:https://github.com/sbt/sbt-maven-resolver
在project/plugins.sbt文件中添加以下行:
addSbtPlugin("org.scala-sbt" % "sbt-maven-resolver" % "0.1.0")
现在你可以运行sbt publish
,并成功将包发布到CodeArtifact。如果出现错误,请确保您正在使用最新版本的SBT。
org.eclipse.aether.deployment.DeploymentException: Failed to deploy artifacts Server redirected too many times (20)
检查生成的pom文件时,我注意到id没有遵循{domain}--{repository}
模式,而是只有<id>{domain}{repository}</id>
。 这可能是问题所在吗? - refaktorproject/mvn.sbt
,并加入了以下内容addMavenResolverPlugin
,然后问题得到了解决。 - zpereeaddMavenResolverPlugin
- 遇到了以下问题:sbt.librarymanagement.ResolveException: Error downloading org.scala-sbt:sbt-maven-resolver;sbtVersion=1.0;scalaVersion=2.12:1.5.5
。 - Alex EftimieaddSbtPlugin("com.myorg" % "my-plugin-name" % "0.0.39")
导入,但在CodeArtifact中找不到它。@shariqmaws - JohnBigs