问题描述
我正在尝试使用AWS CodeArtifact
将工件发布到sbt
,但是遇到了一些麻烦;
给出一个sbt
项目,运行命令sbt publish
,该软件包已上载到存储库中,但仍处于Unfinished
状态。 AWS CodeArtifact documentation说:
未完成:上一次发布尝试未完成。当前,只有Maven软件包版本可以具有未完成状态。当客户端为一个软件包版本上传一个或多个资产,但没有为包含该版本的软件包发布maven-Metadata.xml文件时,就会发生这种情况。
我正在使用sbt
版的1.3.3
,没有使用插件,属性publishMavenStyle
是true
。
我知道sbt-maven-resolver
(here回购)解决了这个问题,但是它似乎是“未关注的插件”,而且,使用它,我丢失了有关发布过程的所有日志,不相信。
有人有同样的问题并且以某种方式解决了吗?
解决方法
在SBT中使用CodeArtifact
- 使用CodeArtifact设置SBT
- 使用SBT发布软件包(还避免了工件处于
Unfinished
状态。)
1。使用CodeArtifact设置SBT
-
使用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"
其格式为“控制台中来自maven配置的存储库URL”中的“解析器+ =“来自控制台中maven配置的ID”。
-
要完全禁止使用公共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",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,但是最终将以Unfinished
状态运行。我们需要使用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。