6

packageコマンド内からタスクを実行するときに、コンパイルタスクを一時的にスキップしようとしていますquick-install(私が書いているsbtプラグインで定義されています)。skipタスクに設定を設定することですべてのコンパイルをスキップできcompileますが、それによりすべてのcompileタスクがスキップされます。

  object MyPlugin extends Plugin {
    override lazy val settings = Seq(
      (skip in compile) := true
    )
    ...
  }

必要なのは、コマンドcompileを実行するときにのみスキップすることです。quick-install設定を一時的に変更する方法、またはクイックインストールコマンドのみにスコープを設定する方法はありますか?

設定の変換( https://github.com/harrah/xsbt/wiki/Advanced-Command-Exampleに基づく)を試しました。これにより、のすべてのインスタンスがskip := falseに置き換えられますskip := trueが、効果はありません(つまり、コンパイルされます)。変換後も発生します):

object SbtQuickInstallPlugin extends Plugin {
  private lazy val installCommand =  Command.args("quick-install", "quick install that skips compile step")(doCommand(Configurations.Compile))

  override lazy val settings = Seq(
    commands ++= Seq(installCommand),
    (Keys.skip in compile) := false    // by default, don't skip compiles
  )

  def doCommand(configs: Configuration*)(state: State, args: Seq[String]): State = {
    val extracted = Project.extract(state)
    import extracted._
    val oldStructure = structure

    val transformedSettings = session.mergeSettings.map(
      s => s.key.key match {
        case skip.key => { skip in s.key.scope := true } // skip compiles
        case _ => s
      }
    )

    // apply transformed settings (in theory)
    val newStructure = Load.reapply(transformedSettings, oldStructure)
    Project.setProject(session, newStructure, state)

    ...
}

私が欠けているものやこれを行うためのより良い方法はありますか?

編集:

スキップ設定はタスクであるため、簡単な修正は次のとおりです。

object SbtQuickInstallPlugin extends Plugin {
  private lazy val installCommand =  Command.args("quick-install", "quick install that skips compile step")(doCommand(Configurations.Compile))

  private var shouldSkipCompile = false  // by default, don't skip compiles

  override lazy val settings = Seq(
    commands ++= Seq(installCommand),
    (Keys.skip in compile) := shouldSkipCompile
  )

  def doCommand(configs: Configuration*)(state: State, args: Seq[String]): State = {
    shouldSkipCompile = true // start skipping compiles

    ... // do stuff that would normally trigger a compile such as running the packageBin task

    shouldSkipCompile = false // stop skipping compiles
  }
}

これが最も堅牢なソリューションであるとは確信していませんが、必要なものに対しては機能しているようです。

4

1 に答える 1

0
object SbtQuickInstallPlugin extends Plugin {
  private lazy val installCommand =  Command.args("quick-install", "quick install that skips compile step")(doCommand(Configurations.Compile))

  private var shouldSkipCompile = false  // by default, don't skip compiles

  override lazy val settings = Seq(
    commands ++= Seq(installCommand),
    (Keys.skip in compile) := shouldSkipCompile
  )

  def doCommand(configs: Configuration*)(state: State, args: Seq[String]): State = {
    shouldSkipCompile = true // start skipping compiles

    ... // do stuff that would normally trigger a compile such as running the packageBin task

    shouldSkipCompile = false // stop skipping compiles
  }
}

大丈夫です、もちろんそれでいいですよ!

于 2013-02-07T11:42:35.507 に答える