从sbt中的AutoPlugin生成资源

从sbt中的AutoPlugin生成资源,sbt,sbt-plugin,Sbt,Sbt Plugin,我已经创建了以下插件,就像之前的许多插件一样 /** * This plugin automatically generates a version number based on the configured * minor version and today's date and time. */ object DateVersionPlugin extends AutoPlugin { //override def trigger = allRequirements def

我已经创建了以下插件,就像之前的许多插件一样

/**
 * This plugin automatically generates a version number based on the configured
 * minor version and today's date and time.
 */
object DateVersionPlugin extends AutoPlugin {
  //override def trigger = allRequirements

  def dateFormat (fmt : String) =
    new java.text.SimpleDateFormat(fmt).format(
      new java.util.Date()
    )

  def versionNumber (majorVersion      : String,
                     versionTrimFront  : Int,
                     versionDateFormat : String) =
    "%s.%s".format(
      majorVersion, dateFormat(versionDateFormat).substring(versionTrimFront)
    )


  /**
   * Defines all settings/tasks that get automatically imported,
   * when the plugin is enabled
   */
  object autoImport {
    /**
     * The number of values to trim off the front of the date string.
     *
     * This is used to achieve a date string which doesn't include the
     * present millenium.  The century, a stretch, can be imagined as
     * conceivable - but few civilizations have lasted multiple millennia.
     */
    lazy val versionTrimFront    = settingKey[Int]("Number of characters to remove from front of date")

    /**
     * The format to use for generating the date-part of this version number.
     */
    lazy val versionDateFormat   = settingKey[String]("The date format to use for versions")

    /**
     * The major version to place at the front of the version number.
     */
    lazy val versionMajor        = settingKey[String]("The major version number, default 0")

    /**
     * The filename of the generated resource.
     */
    lazy val versionFilename     = settingKey[String]("The filename of the file to generate")

    /**
     * The name of the property to place in the version number.
     */
    lazy val versionPropertyName = settingKey[String]("The name of the property to store as version")

    /**
     * Generate a version.conf configuration file.
     *
     * This task generates a configuration file of the name specified in the
     * settings key.
     */
    lazy val generateVersionConf = taskKey[Seq[File]]("Generates a version.conf file.")
  }

  import autoImport._

  /**
   * Provide default settings
   */
  override def projectSettings: Seq[Setting[_]] = Seq(
    versionFilename     := "version.conf",
    versionPropertyName := "version",
    versionDateFormat   := "YY.D.HHmmss",
    versionTrimFront    := 0,
    versionMajor        := "0",

    (version in Global) := versionNumber(versionMajor.value,
      versionTrimFront.value, versionDateFormat.value),

    generateVersionConf <<=
      (resourceManaged in Compile, version, versionFilename, versionPropertyName, streams) map {
        (dir, v, filename, propertyName, s) =>
          val file = dir / filename

          val contents = propertyName + " = \"" + v.split("-").head + "\""

          s.log.info("Writing " + contents + " to " + file)

          IO.write(file, contents)

          Seq(file)
      },

    resourceGenerators in Compile += generateVersionConf.taskValue
  )
}
据我所知,这会导致或多或少相同的行为

通过检查此的运行时属性,我看到一些设置已成功应用:

> inspect version
[info] Setting: java.lang.String = 0.15.338.160117
[info] Description:
[info]  The version/revision of the current module.
[info] Provided by:
[info]  */*:version
[info] Defined at:
[info]  (com.quantcast.sbt.version.DateVersionPlugin) DateVersionPlugin.scala:101
[info] Reverse dependencies:
[info]  *:isSnapshot
[info]  *:generateVersionConf
[info]  *:projectId
[info] Delegates:
[info]  *:version
[info]  {.}/*:version
[info]  */*:version
[info] Related:
[info]  */*:version
但是,对于
compile:resourceGenerators
,情况并非如此,这表明它仍然保持默认值

> inspect compile:resourceGenerators
[info] Setting: scala.collection.Seq[sbt.Task[scala.collection.Seq[java.io.File]]] = List(Task(_))
[info] Description:
[info]  List of tasks that generate resources.
[info] Provided by:
[info]  {file:/home/scott/code/quantcast/play/sbt-date-version/sbt-test/}root/compile:resourceGenerators
[info] Defined at:
[info]  (sbt.Defaults) Defaults.scala:207
[info]  (sbt.Defaults) Defaults.scala:208
[info] Dependencies:
[info]  compile:discoveredSbtPlugins
[info]  compile:resourceManaged
[info] Reverse dependencies:
[info]  compile:managedResources
[info] Delegates:
[info]  compile:resourceGenerators
[info]  *:resourceGenerators
[info]  {.}/compile:resourceGenerators
[info]  {.}/*:resourceGenerators
[info]  */compile:resourceGenerators
[info]  */*:resourceGenerators
[info] Related:
[info]  test:resourceGenerators

我的问题是(现在我继续对此进行更多的研究),什么可以阻止我对(编译中的generateResources)所做的更改被应用?

如果这个插件需要JvmPlugin。这是因为JvmPlugin定义了设置依赖项。没有它,显然
compile:resourceGenerators
设置被默认值覆盖,将资源生成器集重新定义为
Nil
,并从那里开始构建

因此,解决方案是在
AutoPlugin
定义中包含以下行

  override def requires = plugins.JvmPlugin
  override def requires = plugins.JvmPlugin