【问题标题】:sbt: publishing plugin to and resolving from local reposbt:将插件发布到本地仓库并从本地仓库解析
【发布时间】:2018-08-23 10:26:54
【问题描述】:

我正在尝试将 sbt 插件发布到本地文件存储库。在插件的 build.sbt 我有:

publishTo := Some(Resolver.file("localtrix", file("/Users/jast/repo/localtrix")))

我运行publish 任务,它可以很好地发布到 /Users/jast/repo/localtrix/org/me/sbt-plugin_2.12_1.0/1.2.3

在另一个项目中,我想解决这个插件。在project/plugins.sbt 我有:

resolvers += Resolver.file("localtrix", file("/Users/jast/repo/localtrix"))
addSbtPlugin("org.me" % "sbt-plugin" % "1.2.3")

我尝试在这个项目中运行 sbt,我得到:

[info] Updating ProjectRef(uri("file:/Users/jast/playspace/untitled38/project/"), "untitled38-build")...
[warn]  module not found: org.me#sbt-plugin;1.2.3
[warn] ==== typesafe-ivy-releases: tried
[warn]   https://repo.typesafe.com/typesafe/ivy-releases/org.me/sbt-plugin/scala_2.12/sbt_1.0/1.2.3/ivys/ivy.xml
[warn] ==== sbt-plugin-releases: tried
[warn]   https://repo.scala-sbt.org/scalasbt/sbt-plugin-releases/org.me/sbt-plugin/scala_2.12/sbt_1.0/1.2.3/ivys/ivy.xml/2017.2+4-3037ba82+20180314-1919/ivys/ivy.xml
[warn] ==== local: tried
[warn]   /Users/jast/.ivy2/local/org.me/sbt-plugin/scala_2.12/sbt_1.0/1.2.3/ivys/ivy.xml
[warn] ==== public: tried
[warn]   https://repo1.maven.org/maven2/org/me/sbt-plugin_2.12_1.0/1.2.3/sbt-plugin-1.2.3.pom
[warn] ==== local-preloaded-ivy: tried
[warn]   /Users/jast/.sbt/preloaded/org.me/sbt-plugin/scala_2.12/sbt_1.0/1.2.3/ivys/ivy.xml
[warn] ==== local-preloaded: tried
[warn]   file:////Users/jast/.sbt/preloaded/org/me/sbt-plugin_2.12_1.0/1.2.3/sbt-plugin-1.2.3.pom
[warn] ==== localtrix: tried
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[warn]  ::          UNRESOLVED DEPENDENCIES         ::
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[warn]  :: org.me#sbt-plugin;1.2.3: not found
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::

那么我怎样才能以一种也能正确解析的方式将它发布到本地仓库呢?

注意:publishLocal 和从.ivy2/local 解析有效,但我希望能够发布到一个我可以复制到另一台机器而不会弄乱该目录的存储库。

【问题讨论】:

    标签: sbt ivy


    【解决方案1】:

    默认情况下,sbt 插件以常春藤风格发布,因此当您引用本地存储库时,请使用Resolver.ivyStylePatterns。发布:

    publishTo := Some(Resolver.file("localtrix", file("/Users/jast/repo/localtrix"))(Resolver.ivyStylePatterns))
    

    然后解决:

    resolvers += Resolver.file("localtrix", file("/Users/jast/repo/localtrix"))(Resolver.ivyStylePatterns)
    addSbtPlugin("org.me" % "sbt-plugin" % "1.2.3")
    

    或者,您可以为插件设置publishMavenStyle := true,但我看到您已经想通了。

    【讨论】:

    • 谢谢,这行得通。它不适用于我最初尝试的配置似乎是一个错误:github.com/sbt/sbt/issues/4015
    • 是的,... at ...Resolver.url/.file 完全不同,而不仅仅是它的快捷方式,这很令人困惑。甚至 sbt 开发人员 don't agree 也对此:)
    【解决方案2】:

    您错过了名称中的 scala 版本。而且您在已发布的工件中的插件名称 _1.0 中也有奇怪的后缀,因此仅修复 scala 版本是不够的。

    这应该可行。

    addSbtPlugin("org.me" % "sbt-plugin_2.12_1.0" % "1.2.3")
    

    如果你发现这个后缀 _1.0 来自哪里,修复 scala 版本应该会有所帮助:

    addSbtPlugin("org.me" %% "sbt-plugin" % "1.2.3")
    

    评论后更新

    好的,谢谢,我不知道插件的工作方式不同。

    但尝试为解析器定义不同的解析器(对我有用):

    resolvers += "localtrix" at "file:///Users/jast/repo/localtrix"
    addSbtPlugin("org.me" % "sbt-plugin" % "1.2.3")
    

    【讨论】:

    • 这是一个 sbt 插件,不是一个普通的库。 sbt 基于 sbt 版本添加了额外的 scala 版本和 sbt 版本分类器。 _1.0 这里是 sbt 二进制版本。这些看起来会有所不同,具体取决于它是尝试从 ivy 还是 maven repo 解决。这里的问题是为什么 sbt 不能从它在本地发布的同一个地方解析。另请注意,在执行publishLocal 之后解析确实有效,因此不可能是addSbtPlugin 部分错误。
    • @JustinKaeser 不知道,谢谢。用解决方案更新答案
    • 好的,这是让它发挥作用的一部分。还有必要:在插件的 build.sbt 中,添加publishMavenStyle := true。现在可以将其解析为 Maven 工件!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-05
    • 2017-11-04
    • 2021-04-07
    • 2016-10-09
    相关资源
    最近更新 更多