1

我有一个多项目构建,build.sbt如下所示:

import lmcoursier.CoursierConfiguration
import lmcoursier.definitions.Authentication

ThisBuild / version := "0.1.0-SNAPSHOT"

ThisBuild / scalaVersion := "2.12.12"

val adoMavenUsername = "."
val adoMavenPassword = "ADO_PAT"
val adoRepoIdWithView = "ADO-id"

val adoMavenRepos = Vector(
  MavenRepository(adoRepoIdWithView, s"https://adoMavenHost/adoOrganization/adoProject/_packaging/${adoRepoIdWithView.replace("@", "%40")}/maven/v1")
)

val adoAuthentication =
  Authentication(user = adoMavenUsername, password = adoMavenPassword)
    .withOptional(false)
    .withHttpsOnly(true)
    .withPassOnRedirect(false)

val coursierConfiguration = {
  val initial =
      CoursierConfiguration()
        .withResolvers(adoMavenRepos)
        .withClassifiers(Vector("", "sources"))
        .withHasClassifiers(true)

  adoMavenRepos.foldLeft(initial) {
    case (conf, repo) ⇒
      conf.addRepositoryAuthentication(repo.name, adoAuthentication)
  }
}

lazy val mainSettings = Seq(
  organization := "org.some",
  csrConfiguration := coursierConfiguration,
  updateClassifiers / csrConfiguration := coursierConfiguration
)

lazy val root = (project in file("."))
  .settings(mainSettings: _*)
  .settings(
    name := "sbt-test",
  ).aggregate(core, util)

lazy val core = (project in file("core"))
  .settings(mainSettings: _*)
  .settings(
    name := "core",
  ).dependsOn(util)

lazy val util = (project in file("util"))
  .settings(mainSettings: _*)
  .settings(
    name := "util"
  )

出于某种原因,在任务期间coursier尝试从util外部下载包。core/update这不是我想要的,因为它应该作为项目的一部分在内部解决。该软件包未添加到libraryDependencies,所以我很困惑为什么它会尝试下载。上面的示例将失败,因为 Azure DevOps 凭据和 Maven 存储库不正确,但它显示尝试下载util.

它似乎与这个Github 问题有某种关系。

4

1 回答 1

0

默认CoursierConfiguration构造函数将interProjectDependencies属性设置为空Vector。要解决此问题,sbtcsrConfiguration使用.withResolvers.

这就是适用于我的问题的解决方案,主要基于此 Github 评论

val adoMavenUsername = "."
val adoMavenPassword = "ADO_PAT"
val adoRepoIdWithView = "ADO-id"
val adoMavenHost      = "pkgs.dev.azure.com"

val adoMavenRepos = Vector(
  MavenRepository(adoRepoIdWithView, s"https://$adoMavenHost/adoOrganization/adoProject/_packaging/$adoRepoIdWithView/maven/v1")
)

lazy val mainSettings = Seq(
  organization := "org.some",
  csrConfiguration := {
    val resolvers = csrResolvers.value ++ adoMavenRepos
    val conf = csrConfiguration.value.withResolvers(resolvers.toVector)
    val adoCredentialsOpt = credentials.value.collectFirst { case creds: DirectCredentials if creds.host == adoMavenHost => creds }
    val newConfOpt = adoCredentialsOpt.map { adoCredentials =>
      val auths =
        resolvers
          .collect {
            case repo: MavenRepository if repo.root.startsWith(s"https://$adoMavenHost/") => {
              repo.name ->
                Authentication(adoCredentials.userName, adoCredentials.passwd)
            }
          }
      auths.foldLeft(conf) { case (conf, (repoId, auth)) => conf.addRepositoryAuthentication(repoId, auth) }
    }
    newConfOpt.getOrElse(conf)
},
  updateClassifiers / csrConfiguration := coursierConfiguration
)

于 2022-02-22T11:53:26.920 回答