sbtscala.jsfastparse

How to use SBT's libraryDependencyScheme key


I'm in library dependency hell right now with the following error:

[error] (server / update) found version conflict(s) in library dependencies; some are suspected to be binary incompatible:
[error] 
[error]     * com.lihaoyi:geny_2.13:1.0.0 (early-semver) is selected over 0.6.10
[error]         +- com.lihaoyi:scalatags_2.13:0.12.0                  (depends on 1.0.0)
[error]         +- com.lihaoyi:fastparse_2.13:2.3.3                   (depends on 0.6.10)
[error] 
[error] 
[error] this can be overridden using libraryDependencySchemes or evictionErrorLevel

I'm still stymied by how to use libraryDependencySchemes, as the error message suggests.

A search for libraryDependencySchemes in the SBT documentation comes up empty.

Preventing Version Conflict with VersionScheme is aimed primarily at library authors, not users. It has a short section at the end for users, but focuses on how to impose a dependency scheme when the library author has not. There's only one example, how to impose early-semver if the library author has not:

ThisBuild / libraryDependencySchemes += "io.circe" %% "circe-core" % "early-semver"

From elsewhere (e.g. this sbt issue) I gather that replacing "early-semver" in the above with "always" or VersionScheme.Always is

the correct way to specify "don't check the version compatibility of this library"

Unfortunately, that hasn't worked for me -- I get the same error.

The build for this project has several subprojects. Here's the relevant part of the build. Can anyone explain what's wrong and why?

lazy val xplatform = crossProject(JSPlatform, JVMPlatform)
  .crossType(CrossType.Full)
  .in(file("_xplatform"))
  .settings(commonSettings)
  .settings(
    libraryDependencySchemes += "com.lihaoyi" %% "geny" % VersionScheme.Always, // "early-semver",
    libraryDependencies ++= Seq(
      "com.lihaoyi"       %%% "fastparse"       % "2.3.3",
      "com.lihaoyi"       %%% "scalatags"       % "0.12.0",
      // some additional libraries omitted for brevity
    ),
    jsEnv := new org.scalajs.jsenv.jsdomnodejs.JSDOMNodeJSEnv()
  )
  .jsSettings(
    libraryDependencies ++= Seq(
      "ca.bwbecker"  %%% "jsFacadeOptionBuilder" % "0.9.6"
    ),
    jsDependencies += "org.webjars" % "jquery" % "3.4.1" / "jquery.js" % "test"
  )
  .jsConfigure(_.enablePlugins(ScalaJSWeb, JSDependenciesPlugin))

Update: After further testing, I realize that this is only occurring on the ScalaJS side of the project.

I've tried both of the following; no difference on the JVM side but neither work for ScalaJS.

libraryDependencySchemes += "com.lihaoyi" %% "geny" % VersionScheme.Always, // "early-semver",
libraryDependencySchemes += "com.lihaoyi" %%% "geny" % VersionScheme.Always, // "early-semver",

Solution

  • Turns out this is an SBT bug (as of 2023-01-26). Using

    libraryDependencySchemes += "com.lihaoyi" %% "geny" % VersionScheme.Always
    

    suppresses the error in a JVM-only build file. It doesn't work for anything involving Scala.JS.

    See my bug report for a small working example (on the JVM) and failing (on Scala.JS).