非托管 jar 文件中的 SBT 插件

Posted

技术标签:

【中文标题】非托管 jar 文件中的 SBT 插件【英文标题】:SBT Plugin in an unmanaged jar file 【发布时间】:2016-03-21 22:31:58 【问题描述】:

要求:SBT 插件代码在非托管 jar 中,例如在 lib/unmanaged-sbt-plugin-0.0.1.jar 中。 我原以为 SBT 会自动获取 jar 文件,并且插件可以开箱即用,即:可以从 SBT 命令行访问任务,但事实并非如此。

jar 文件中包含 sbt/sbt.autoplugins 文件,如果从远程仓库拉到本地仓库并通过 addSbtPlugin(...) 导入,插件可以工作。请注意,我不能这样做 - 要求它从 lib/unmanaged-sbt-plugin-0.0.1.jar 加载,而不是从本地/远程仓库加载。

将以下行放在build.sbt 中不会使插件工作(也没有错误):

unmanagedJars in Compile += file("lib/unmanaged-sbt-plugin-0.0.1.jar")

addSbtPlugin(...)的实现很简单(根据http://www.scala-sbt.org/0.12.2/docs/Getting-Started/Using-Plugins.html):

def addSbtPlugin(dependency: ModuleID): Setting[Seq[ModuleID]] =
  libraryDependencies <+= (sbtBinaryVersion in update, scalaBinaryVersion in update) 
   (sbtV, scalaV) => sbtPluginExtra(dependency, sbtV, scalaV) 

我想知道以上信息是否可以用来解决我的问题?

提前谢谢你!

【问题讨论】:

也许看看ModuleID。 "my.org" % "my-plugin" % "my-version" from "file:///path/to/jar 之类的东西可能会起作用(不确定 - 也许你需要一个 .pom) unmanagedJars in Compile - 您是否尝试过在项目目录的 plugins.sbt 文件中?基本上project 中的所有内容都是基础项目的元项目。 我能够使用此代码使其工作:addSbtPlugin("org.my-org" % "unmanaged-sbt-plugin" % "0.0.1" from "file:///./lib/unmanaged-sbt-plugin-0.0.1.jar")!如果您添加答案,我会投票,谢谢! 【参考方案1】:

因此您可以为库依赖项指定一个显式 URL (ModuleID):

addSbtPlugin("org.my-org" % "unmanaged-sbt-plugin" % "0.0.1"
  from "file:///./lib/unmanaged-sbt-plugin-0.0.1.jar")

【讨论】:

【参考方案2】:

一直在努力让它发挥作用。 无法使其与使用 from "file://.."(使用 sbt 1.0.4)的建议解决方案一起使用。

通过将插件放入project/lib 文件夹并使用libraryDependencies ++= Seq(..) 将所有插件依赖项添加到plugins.sbt 来使其工作,就像在build.sbt 中一样。您可以通过查看插件 pom 文件找到插件依赖项,通常在 .ivy2/local/&lt;org&gt;/&lt;pluginname&gt;/poms 文件夹中。

【讨论】:

谢谢!在我的情况下,将插件 Jar 放在 project/lib 下就足够了。

以上是关于非托管 jar 文件中的 SBT 插件的主要内容,如果未能解决你的问题,请参考以下文章

在 SBT 中将 unmanagedJars 添加到 proguardLibraryJars

这个 DLL 是托管的还是非托管的?

创建一个基本的、非托管的 Outlook/Office 插件

.net中的托管资源和非托管资源

从非托管 dll 文件(注入到正在运行的进程中)调用托管 dll

从 sbt-native-packager 中的 Universal:packageBin 中排除非托管依赖项?