2

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

/**
 * 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
  )
}

generate-version-conf任务按预期运行,生成我正在寻找的文件。使用此插件的version项目按预期更新设置。但是以下情况没有发生,我不清楚为什么:

  1. 配置文件不是由compile.
  2. 配置文件不是由 .jar 打包在 jar 中的package
  3. 使用任务时配置文件不在类路径中run

请注意,我还尝试了十几种变体,并且我进一步尝试了:

  resourceGenerators in Compile <+= generateVersionConf

据我了解,这应该会导致或多或少相同的行为。

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

> 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 in Compile)的更改被应用?

4

1 回答 1

1

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

所以解决方案是在AutoPlugin定义中包含以下行。

  override def requires = plugins.JvmPlugin
于 2015-12-06T19:47:02.053 回答