本地工件代理背后的 sbt
Posted
技术标签:
【中文标题】本地工件代理背后的 sbt【英文标题】:sbt behind local artifactory proxy 【发布时间】:2017-09-30 19:44:59 【问题描述】:使用本地工件/maven 代理设置 sbt 项目时,我看到以下消息:
为了指定在 sbt 项目中添加的所有解析器应该 被忽略以支持存储库中配置的那些 配置,将以下配置选项添加到 sbt 启动器脚本:
-Dsbt.override.build.repos=true
将以下内容添加到您的 build.sbt 文件中:
resolvers += "Artifactory" at "http://url/artifactory/virtualRepository/"
但我想要实现的是类似于 maven 的行为,即不是手动覆盖 SBT 文件中的解析器,而是通过配置。 这也可能吗?如果是怎么办? 期望的行为
在没有本地工件代理的情况下,项目应该可以正常编译 如果在存储库中可用/已配置,则应将本地存储库用作源/缓存以便更快地访问目前,我只得到未解决的 sbt 插件依赖项:
::::::::::::::::::::::::::::::::::::::::::::::
[warn] :: UNRESOLVED DEPENDENCIES ::
[warn] ::::::::::::::::::::::::::::::::::::::::::::::
[warn] :: org.scalariform#sbt-scalariform;1.6.0: not found
[warn] :: org.scoverage#sbt-scoverage;1.5.0: not found
[warn] :: org.scalastyle#scalastyle-sbt-plugin;0.8.0: not found
[warn] :: net.virtual-void#sbt-dependency-graph;0.8.2: not found
[warn] ::::::::::::::::::::::::::::::::::::::::::::::
警告
[warn] module not found: org.scalariform#sbt-scalariform;1.6.0
[warn] ==== typesafe-ivy-releases: tried
[warn] https://repo.typesafe.com/typesafe/ivy-releases/org.scalariform/sbt-scalariform/scala_2.10/sbt_0.13/1.6.0/ivys/ivy.xml
[warn] ==== sbt-plugin-releases: tried
[warn] https://repo.scala-sbt.org/scalasbt/sbt-plugin-releases/org.scalariform/sbt-scalariform/scala_2.10/sbt_0.13/1.6.0/ivys/ivy.xml
[warn] ==== local: tried
[warn] d:\users\heilerg\.ivy2\local\org.scalariform\sbt-scalariform\scala_2.10\sbt_0.13\1.6.0\ivys\ivy.xml
[warn] ==== my-ivy-proxy-releases: tried
[warn] http://url/artifactory/virtualRepositoryScala/org.scalariform/sbt-scalariform/scala_2.10/sbt_0.13/1.6.0/ivys/ivy.xml
[warn] ==== my-maven-proxy-releases: tried
[warn] http://url/artifactory/virtualRepositoryScala/org/scalariform/sbt-scalariform_2.10_0.13/1.6.0/sbt-scalariform-1.6.0.pom
[warn] ==== Artima Maven Repository: tried
[warn] http://repo.artima.com/releases/org/scalariform/sbt-scalariform_2.10_0.13/1.6.0/sbt-scalariform-1.6.0.pom
[info] Resolving org.scoverage#sbt-scoverage;1.5.0 ...
SBT 日志将显示
[ERROR] (o.a.r.RemoteRepoBase:766) - IO error while trying to download resource 'repo1:org/scalariform/sbt-scalariform_2.10_0.13/1.6.0/sbt-scalariform-1.6.0.pom': org.artifactory.api.repo.exception.maven.BadPomException: The target deployment path 'org/scalariform/sbt-scalariform_2.10_0.13/1.6.0/sbt-scalariform-1.6.0.pom' does not match the POM's expected path prefix 'org/scalariform/sbt-scalariform/1.6.0'. Please verify your POM content for correctness and make sure the source path is a valid Maven repository root path.
有人提到在 Artifactory 中使用以下选项来“抑制 POM 一致性检查”,但在当前版本的 artifactory 中我找不到这样的选项。
编辑
我只能看到这些选项
【问题讨论】:
似乎更多的是人为问题:github.com/coursier/coursier/issues/286 jfrog.com/jira/browse/RTFACT-6235 提到的解决方法是“抑制 POM 一致性检查” 在哪里可以找到这个选项?在当前的工件中,远程存储库的高级选项卡中似乎没有此选项。请看编辑。我只能看到上面截图中的选项。 用户指南说:“在管理模块中,转到存储库|远程并单击它以显示编辑存储库屏幕。” jfrog.com/confluence/display/RTF/Remote+Repositories 感谢您的提示。答案(与许多链接建议的不同)是在基本设置中查找文件。 不,没关系。还有一件事;我不确定这是否是您要求的,但您可以在 $userhome/.sbt/repositories 文件中指定代理。然后它应该被所有 sbt 项目在全球范围内采用 【参考方案1】:正如评论中所回答的,一个常见的解决方法是“禁止 POM 一致性检查”-Advanced Settings。
如果不希望这样做,另一种方法可能是使用有效的 POM 重新发布插件。我写了POM consistency for sbt plugins 表明可以做到。
// set some unique postfix
ThisBuild / version := "0.15.0-Pets1"
lazy val root = (project in file("."))
.enablePlugins(SbtPlugin)
.settings(
name := "sbt-assembly",
....
publishMavenStyle := true,
// add this
pomConsistency2021DraftSettings,
)
// Add the following
lazy val pomConsistency2021Draft = settingKey[Boolean]("experimental")
/**
* this is an unofficial experiment to re-publish plugins with better Maven compatibility
*/
def pomConsistency2021DraftSettings: Seq[Setting[_]] = Seq(
pomConsistency2021Draft := Set("true", "1")(sys.env.get("POM_CONSISTENCY").getOrElse("false")),
moduleName :=
if (pomConsistency2021Draft.value)
sbtPluginModuleName2021Draft(moduleName.value,
(pluginCrossBuild / sbtBinaryVersion).value)
else moduleName.value
,
projectID :=
if (pomConsistency2021Draft.value) sbtPluginExtra2021Draft(projectID.value)
else projectID.value
,
)
def sbtPluginModuleName2021Draft(n: String, sbtV: String): String =
s"""$n_sbt$if (sbtV == "1.0") "1" else if (sbtV == "2.0") "2" else sbtV"""
def sbtPluginExtra2021Draft(m: ModuleID): ModuleID =
m.withExtraAttributes(Map.empty)
.withCrossVersion(CrossVersion.binary)
【讨论】:
以上是关于本地工件代理背后的 sbt的主要内容,如果未能解决你的问题,请参考以下文章