首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从libraryDependencies中启用编译器插件?

如何从libraryDependencies中启用编译器插件?
EN

Stack Overflow用户
提问于 2014-07-15 10:01:06
回答 3查看 1.9K关注 0票数 4

我在库依赖项中有一个编译器插件,并希望启用它。有点像

代码语言:javascript
复制
autoCompilerPlugins := true

libraryDependencies += compilerPlugin(update.value.allModules.find(_.name contains "continuations-plugin").get)

scalacOptions += "-P:continuations:enable"

给出

代码语言:javascript
复制
/Users/luc/scala/release-sanity-check/build.sbt:20: error: A setting cannot depend on a task
libraryDependencies += compilerPlugin(update.value.allModules.find(_.name contains "continuations-plugin").get)
                                  ^

我能用一个自定义的任务来做吗?

代码语言:javascript
复制
val addContinuationsPlugin = taskKey[Unit]("Add continuations plugin")

addContinuationsPlugin := {
  val plugin = update.value.allModules.find(_.name contains "continuations-plugin")
  // add plugin?
}

有问题的存储库:https://github.com/scala/scala-dist-smoketest

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-07-15 15:54:52

您可能想要这样的东西(参见sbt API)

代码语言:javascript
复制
scalacOptions ++= {
  val compileConfig = update.value.configurations.find(_.configuration == "compile").get
  val pluginModule = compileConfig.modules.find(_.module.name contains "continuations-plugin").get
  val pluginFile = pluginModule.artifacts.head._2
  Seq(s"-Xplugin:${pluginFile.getCanonicalPath}", "-P:continuations:enable")
}

compilePlugin方法旨在简化使用常春藤解析插件时的任务,您可以正确地这样做。

选项2试图确保它们是项目和项目之间的一个传递的compiler-plugin->compiler-plugin配置依赖链,在那里您发现了延续插件(最终会有一个compiler-plugin->default(compile)链接)。但是,如果没有看到依赖树,我就不能围绕选项2(这是更健壮的方法)提出建议。

票数 3
EN

Stack Overflow用户

发布于 2014-07-15 15:57:37

这是相当棘手的,我不知道我是否可以推荐使用这种技术以外的烟雾测试的Typesafe,但这里。(不要在家里尝试这个。)

正如您和Jacek所指出的,libraryDependencies和插件的版本必须在编译时静态地知道。但是,由于构建可以使用元构建,所以我们可以将其看作是元构建的运行时。我在对如何在project/plugins.sbt和project/Build.scala之间共享版本值?的回答中证明了这一点

因此,使用,我们可以将元构建的任务值提升到适当构建的设置值中。下一个问题是如何在元构建中找到延续插件的版本。同样,这是一个花招,但我们可以在元构建中做一个假常春藤配置,在其中添加scala,并从externalDependencyClasspath in BogusConfig中提取版本号。该更改也以#1的形式发送。

项目/项目/建设项目

代码语言:javascript
复制
addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.3.2")

项目/项目/决定方案。

代码语言:javascript
复制
package metabuild

import sbt._

object Dependencies {
  def scalaDistVersion = sys.props("project.version")
}

object Configs {
  lazy val BogusConfig = config("bogus")
}

项目/plugins.sbt

代码语言:javascript
复制
import metabuild.Dependencies._
import metabuild.Configs._

lazy val continuationPluginVersion = taskKey[String]("version of the continuation plugin")

lazy val build = (project in file(".")).
  configs(BogusConfig).
  settings(inConfig(BogusConfig)(Defaults.configSettings): _*).
  settings(buildInfoSettings: _*).
  settings(addSbtPlugin("com.typesafe.sbt" % "sbt-git" % "0.6.4"): _*).
  settings(
    resolvers += "jgit-repo" at "http://download.eclipse.org/jgit/maven",
    libraryDependencies += "org.scala-lang" % "scala-dist" % scalaDistVersion % BogusConfig,
    sourceGenerators in Compile <+= buildInfo,
    buildInfoKeys := Seq[BuildInfoKey](
      "scalaDistVersion" -> scalaDistVersion,
      continuationPluginVersion
    ),
    buildInfoPackage := "metabuild",
    continuationPluginVersion := {
        val bogusClasspath = (externalDependencyClasspath in BogusConfig).value
        val f = (bogusClasspath find { _.data.getName contains "continuations-plugin" }).get.data
        f.getName.replaceAllLiterally("scala-continuations-plugin_" + scalaDistVersion + "-", "").replaceAllLiterally(".jar", "")
    }
  )

build.sbt

代码语言:javascript
复制
import metabuild.BuildInfo._

// versionWithGit

version := scalaDistVersion

scalaVersion := version.value

libraryDependencies += "org.scala-lang" % "scala-dist" % version.value

autoCompilerPlugins := true

libraryDependencies +=
  compilerPlugin("org.scala-lang.plugins" % ("scala-continuations-plugin_" + version.value) % continuationPluginVersion)

scalacOptions += "-P:continuations:enable"
票数 2
EN

Stack Overflow用户

发布于 2014-07-15 10:12:54

“我在库依赖项中有一个编译器插件,希望添加启用它。”

根据sbt官方文档中的编译器插件支持,您应该启用对build.sbt中编译器插件的支持,如下所示:

代码语言:javascript
复制
autoCompilerPlugins := true

然后使用addCompilerPlugin将插件作为依赖项(到libraryDependencies)添加到plugin->default(compile)作用域中。

代码语言:javascript
复制
addCompilerPlugin("org.scala-tools.sxr" %% "sxr" % "0.3.0")

通过设置,您可以设置插件:

代码语言:javascript
复制
scalacOptions :=
    scalacOptions.value :+ ("-Psxr:base-directory:" + (scalaSource in Compile).value.getAbsolutePath)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24755254

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档