【问题标题】:How do you remove the _<scala-version> postfix from artifacts built+published with simple-build-tool?如何从使用 simple-build-tool 构建+发布的工件中删除 _<scala-version> 后缀?
【发布时间】:2011-11-27 20:42:10
【问题描述】:

我正在使用 simple-build-tool 构建一些纯 Java 项目。当我使用 sbt publish-local 从项目发布工件时,生成的工件会在其名称后附加 Scala 版本。对于 Scala 项目,这是有道理的,但由于这些只是 Java 项目,因此它不是。我将如何禁用 Scala 版本的这个后缀?或者我可以吗?

作为参考,我使用 sbt 0.11.1、Scala 2.9.1 和 .sbt 文件进行构建配置(尽管迁移到完整的项目配置没有问题)。

【问题讨论】:

    标签: scala sbt


    【解决方案1】:

    在查看了 Artifact.artifactName 是如何实现和最终使用的之后,似乎关闭它的方法是为 crossPath 设置指定 false。这记录在 xsbt wiki 上的快速配置示例之一中。

    http://www.scala-sbt.org/release/docs/Examples/Quick-Configuration-Examples

    // disable using the Scala version in output paths and artifacts
    crossPaths := false
    

    【讨论】:

      【解决方案2】:

      我知道这个问题很老,但我一直在问自己同样的问题,现在实际上有一个非常简单的方法可以做到这一点。您所要做的就是使用% 而不是%% 声明依赖关系:

      %:一种用于从您的字符串构造 Ivy Module ID 的方法 供应。

      %%:在 groupID 之后使用时,它会自动添加您的 项目的Scala版本(如_2.10)到工件末尾 名字。

      http://alvinalexander.com/scala/sbt-how-to-manage-project-dependencies-in-scala

      【讨论】:

      • 此解决方案比公认的解决方案更好,因为您只需更改 Scala 版本号存在问题的依赖项。通过将 'crosspaths' 设置为 false,您必须更改所有依赖项并手动添加 Scala 版本。
      【解决方案3】:

      这在 xsbt wiki 上的Modifying default artifacts 下进行了记录。从该页面:

      例如,生成一个没有分类器或交叉路径的最小名称:

      artifactName := { (sv: ScalaVersion, module: ModuleID, artifact: Artifact) =>
        artifact.name + "-" + module.revision + "." + artifact.extension
      }
      

      【讨论】:

      • 谢谢保罗。不幸的是,这对已发布的工件名称没有任何可观察到的影响。已发布的工件名称末尾仍然有 Scala 版本。我在结果字符串中添加了垃圾,但也没有出现。这是我的 build.scala:pastie.org/2931253
      • 另外,您引用的那个页面说 artifactName 设置不会影响已发布的名称。 “可以修改该函数以为工件生成不同的本地名称,而不会影响已发布的名称,这是由工件定义与存储库模式相结合确定的。”。我确实尝试修改工件设置并提供新的工件,但这并不能让我直接摆脱 scala 版本的后缀。看起来 sbt 会将 scalaVersion 传递给 Artifact 的 artifactName 方法。覆盖该方法是我唯一的选择吗?
      • 啊该死的 - 抱歉,这不是我以前尝试过的东西,而且乍一看,该页面看起来正是您所需要的。看起来你还是找到了它 - 对曲线球感到抱歉。
      • 没问题。如果不出意外,它为我指明了正确的方向。
      【解决方案4】:

      虽然接受的答案是完全正确的,但您应该永远在公开发布的 Scala 工件上将 crossVersions 设置为 false。嵌入的 scala 版本是一个重要的兼容性特性,因为不同版本的 Scala 库可能不兼容二进制。

      仅将 crossVersions 设置为 false 用于项目中的项目,例如问题中的项目,严格仅限 Java。

      【讨论】:

      • 是否可以发布两个工件?一个有 scala 版本,一个没有?
      • 我想你可以,但我不确定我明白你为什么会这样做?如果你真的为多个编译器版本交叉编译了你的 scala,你会怎么做?
      猜你喜欢
      • 2011-02-22
      • 2011-09-13
      • 2011-05-08
      • 1970-01-01
      • 2011-02-11
      • 1970-01-01
      • 1970-01-01
      • 2011-02-22
      • 2011-04-27
      相关资源
      最近更新 更多