7

sbt プラグインを介してライブラリの依存関係を追加しようとしています。バイナリ scala バージョンごとに各サブプロジェクトに依存関係を追加する必要があるため、各サブプロジェクトを反復処理します。

  private def inject(): State => State = { state =>
    val extracted: Extracted = Project.extract(state)

    val enrichedLibDepSettings = extracted.structure.allProjectRefs map { projRef =>

      val projectScalaVersion = (scalaBinaryVersion in projRef)

      libraryDependencies in projRef += 
        compilerPluginOrg % (compilerPluginArtifact + "_" + projectScalaVersion.value) % compilerPluginVersion % "provided"
    }

    val newState = extracted.append(enrichedLibDepSettings, state)

    val updateAfterLibAppend = extracted.structure.allProjectRefs map { projRef => 
      println("running update: " + EvaluateTask(extracted.structure, update, newState, projRef)) }
      state
  }

ただし、これは機能していません。印刷された出力には、ライブラリの依存関係が追加された形跡がなくlibraryDependencies in projRef +=、エラーも発生せず、後続の手順で欠落している依存関係をフェイルオーバーする必要があります。この手法の何が問題なのですか?

そもそもなぜこれが必要なのですか?なぜそのような sbt プラグインを介してライブラリの依存関係を追加するのですか?

sbtaddCompilerPluginにはありますが、引数を持つコンパイラ プラグインには使用できません (-Xplugin実験が示す限り、コンパイラ プラグインの引数を受け入れるには、jar へのパスを scalac に指定する必要があります)。したがって、ライブラリの依存関係として解決した後、コンパイラ プラグインを挿入する必要があり-Xpluginます (次に、そのファイル パスの場所をいじって の結果を調べますupdate)。したがって、sbt プラグインを介してライブラリの依存関係を追加する必要があります。さらに、サブプロジェクトごとにこれを行う必要があります。これは、マルチプロジェクト ビルドがさまざまな scala バージョンのサブプロジェクトを格納する可能性があるためです。バイナリ互換性を維持するために、それぞれにバイナリ互換性のあるコンパイラ プラグインを挿入する必要があります。

ちなみに、これは私が暗闇の中にいる何かを照らすかもしれません:projectSettings以下のように、ルートプロジェクトのオーバーライドにライブラリ依存関係を追加すると、依存関係は解決されるように見えますが、同じことが適用されるため、役に立ちません。これは、当面のタスクの性質に反します (一部のサブプロジェクトは、バイナリの非互換性により自然にクラッシュします)。また、ルートの設定を上書きすると思いますが、ここでの目標は、既存の設定を上書きしないように設定を追加することです。

object Plugin extends AutoPlugin {
  override lazy val projectSettings = Seq(
    ...
}

手がかりのペア?

  1. 同じテクニックを使用して、サブプロジェクトごとに scalacOptions を追加すると、簡単に機能します。

  2. のブロック内で同じイディオムを使用する場合とは異なり、上記に適用+=してlibraryDepenenciesも の出力には影響しません。inspect libraryDependenciesoverride lazy val projectSettingsAutoPlugin

4

1 に答える 1