无法交叉发布多个Scala版本的sbt插件

gzszwxb4  于 2023-04-21  发布在  Scala
关注(0)|答案(2)|浏览(151)

我有下面的sbt文件

lazy val root = (project in file(".")).
  settings(
    inThisBuild(List(
      sbtPlugin := true, 
      organization := "com.foo",
      crossScalaVersions := Seq("2.11.2", "2.12.0"),
      version      := "1.0.0"
    )),
    name := "myplugin",
    libraryDependencies ++= Seq(
      "org.scala-lang.modules" %% "scala-xml" % "1.0.6",
      "com.typesafe" % "config" % "1.3.3"
    )
  )

现在,我可以轻松地执行sbt publishLocal,并看到它在.ivy2/local/com.foo/myplugin/scala_2.12/sbt_1.0/1.0.0/jars/中生成了一个jar文件
但如果我

sbt +publishLocal

我得到一个错误

[error] Modules were resolved with conflicting cross-version suffixes in ProjectRef(uri("file:/Users/user/myplugin/"), "root"):
[error]    org.scala-lang.modules:scala-xml _2.11, _2.12
[error]    org.scala-lang.modules:scala-parser-combinators _2.11, _2.12
[error] java.lang.RuntimeException: Conflicting cross-version suffixes in: org.scala-lang.modules:scala-xml, org.scala-lang.modules:scala-parser-combinators
[error]         at scala.sys.package$.error(package.scala:27)
[error]         at sbt.librarymanagement.ConflictWarning$.processCrossVersioned(ConflictWarning.scala:39)
[error]         at sbt.librarymanagement.ConflictWarning$.apply(ConflictWarning.scala:19)
[error]         at sbt.Classpaths$.$anonfun$ivyBaseSettings$64(Defaults.scala:1995)
[error]         at scala.Function1.$anonfun$compose$1(Function1.scala:44)
[error]         at sbt.internal.util.$tilde$greater.$anonfun$$u2219$1(TypeFunctions.scala:39)
[error]         at sbt.std.Transform$$anon$4.work(System.scala:66)
[error]         at sbt.Execute.$anonfun$submit$2(Execute.scala:262)

我的期望是SBT会做两次编译和发布,每次它都会为正确的Scala版本选择正确的jar。
我的最终目标是让SBT发布多个jar文件,每个jar文件对应我的crossScalaVersions列表中的每个scala版本。

e7arh2l6

e7arh2l61#

sbt使用了一个固定版本的Scala:sbt 0.13使用Scala 2.10,sbt 1.x使用Scala 2.12。所以
1.有一点是你不能为Scala 2.11编译一个sbt插件,
1.另一件事是,你应该为不同版本的sbt交叉构建你的插件(因为Scala版本是隐含的)。
有关于Cross building plugins的文档,但我不确定它是最新的,所以最好在现有的插件中看到一些例子。我认为在你的插件项目中有这样的设置就足够了:

  • project/build.properties中:
sbt.version=0.13.17
  • build.sbt设置中:
sbtPlugin := true,
crossSbtVersions := Seq("0.13.17", "1.0.0"),

参见sbt-boilerplate以获取示例。

7fyelxc5

7fyelxc52#

在浏览了你的build.sbt之后,我发现了以下内容:

  • 删除所有依赖项 * 并不能解决问题
  • 删除sbtPlugin := true * 是否 * 解决了问题
  • 将sbt从1.x降级到0.13.16有助于编译您的示例

此外,我们应该记住 sbt 0.13.x是用Scala 2.10 编写的。
所以,如果你正在编写一个sbt插件:

  • 降级SBT
  • 将Scala从2.11.2更改为2.10.x

如果你不是在写一个插件:

  • 删除sbtPlugin := true

相关问题