如何在我自己的项目中使用分叉的 SBT 插件

Posted

技术标签:

【中文标题】如何在我自己的项目中使用分叉的 SBT 插件【英文标题】:How to use in my own project a forked SBT plugin 【发布时间】:2015-03-29 00:12:59 【问题描述】:

这些是我遵循的步骤:

我已经分叉了一个 3rd 方插件。 我已经修改了,运行sbt publishLocal成功。

为了测试它,在一个项目的plugins.sbt文件中,我把addSbtPlugin("company" % "some-plugin" % "0.6.5")改成了这样:

lazy val root = project.in( file(".") ).dependsOn(somePlugin)

lazy val somePlugin = project.in(file(System.getProperty("user.home")+"/customPath/"))

但是SBT不能用这种方式编译插件,因为它没有找到该插件使用的插件,即使我已经可以了。

我也试过引用~/.sbt/local/....,即publishLocal放置编译插件的目录,但没有成功。我不知道我要准确引用什么(文件夹、生成的.jarivy.xml 文件……)。

问题:

使用本地构建的插件的最佳方式是什么? 为什么它可以单独编译,但嵌入到我的项目中时却不能?。

注意事项:

这个问题和这个问题密切相关:In sbt, how do you add a plugin that's in the local filesystem? 我使用的是 SBT 0.13.7。

【问题讨论】:

【参考方案1】:

解决方案很简单。我已按照以下步骤操作:

我 fork 一个现有项目 我更改organization 是为了独一无二,不与原作者冲突。我使用类似organization := com.github.myuser 我修改代码 我在bintray 中创建了一个帐户,并关注this guide 以便使用sbt publish 发布我的自定义插件 在一个示例项目中,我通过在plugins.sbt 中添加这一行来导入我的自定义插件:addSbtPlugin("com.github.myuser" % "myplugin" % "1.0")

如果我犯了错误不想增加版本,我会这样做:

sbt ;bintray::unpublish;发布

它非常快,我不得不等待几秒钟。我知道没有其他人在使用我的插件。

也许publishLocal 更好,并且不需要使用第 3 方存储库,但我不知道它是如何工作的。这对我有用。

【讨论】:

【参考方案2】:

更好的解决方案,非常适合仅用于测试未来拉取请求的情况:

分叉现有项目 将版本更改为以 -SNAPSHOT 结尾 进行更改 调用sbt publishLocal 创建一个示例项目以对其进行测试,该项目引用 -SNAPSHOT 版本 如果再次重新编译项目,reload 会挂起整个 JVM。我必须退出SBT 并再次进入。 工作时,给作者发pull request

建议:使用scripted test framework 以离开工作测试。

【讨论】:

以上是关于如何在我自己的项目中使用分叉的 SBT 插件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 sbt 项目中使用 sbt 插件作为库依赖项?

如何让 JsHint sbt 插件更有用?

你如何将 sbt 项目组合成一个单独的构建?

如何使用 sbt-eclipse 创建项目的 Eclipse 项目文件?

如何使用 scala sbt 构建多个 jar 文件

如何在 sbt-plugin 中使用 sbt-assembly?