Description
It seems that modules should all follow the <major>.<minor>.<patch>
scheme, instead of the <epoch>.<major>.<minor>
scheme used by normal Scala libraries. sbt when using evicted
looks at the version scheme information of the library's pom
, defaulting to <epoch>.<major>.<minor>
when absent. Thus, we get evication warnings, for example, when scala-xml 1.2.0 and 1.3.0 are mixed, although it would be binary compatible?
Therefore, I suggest to inject a default versionScheme
to scala modules. This is supported since sbt 1.4. See also: sbt/sbt#5724
As far as I see, the three allowed values are "early-semver"
, "pvp"
, and "semver-spec"
, and the default would be "pvp"
. sbt has no information what these mean, but https://github.com/scalacenter/sbt-eviction-rules gives some clues:
early-semver
: assumes the matched modules follow a variant of Semantic Versioning that enforces compatibility within 0.1.z.semver-spec
: assumes the matched modules follow Semantic Versioning Spec that assumes no compatibility within 0.1.z.pvp
: assumes the matched modules follow package versioning policy (quite common in Scala),
That would mean we should use always
? It's quite confusing, I don't see how compatibility witihin 0.x.y.
is assumed. Perhaps we're doing it wrong for modules altogether and should use pvp instead?