5

SBT でマネージド ライブラリの依存関係を宣言するのは簡単です。

 libraryDependencies ++= Seq(
 "org.specs2" %% "specs2" % "1.12.2" % "test" ,
 "junit" % "junit" % "4.7" % "test"
)

SBT でプロジェクトの依存関係を宣言するのは簡単ではありませんが、私もそれを行うことができます。

object RichMath extends Build {
  lazy val myApp = Project("RichMath", file(".")) dependsOn(richUtil)   
  lazy val richUtil = RootProject(file("../RichUtil"))
}

しかし実際には、通常、上流のプロジェクトで変更がすぐに表示されるプロジェクト モードと、コードが成熟するにつれて依存プロジェクトで変更を表示するために変更を公開する必要があるライブラリ モードの間で変更したいと考えています。

コードベースの初期段階、またはモジュール間で頻繁に変更を加えたいときはいつでも、アップストリームの変更を確認するためだけに再公開するという面倒なことはしたくありません。しかし、安定した/成熟したコードでは、依存しているバージョンを正確に指定したいと考えています。

SBT は 2 つの依存関係をまったく異なるものとして扱っているようです。ビルド定義を書き直すよりも、プロジェクトとライブラリの依存関係を切り替える簡単な方法はありますか?

4

2 に答える 2

3

私の sbt スクリプトにはいくつかのシナリオがあります (テスト、公開、本番)。たとえば、スクリプトから(bashから、他の環境があるかもしれません)sbtを起動しますDO=TESTS sbt。これは、環境変数に関する私の動的依存関係です。

if (sys.env.contains("LOCAL_BUILD")) {
  Seq[Project.Setting[_]](
    unmanagedResourceDirectories in Compile <+= baseDirectory { _ / "src" / "main" / "scala" },
    libraryDependencies ++= {
      Seq(
        "org.digimead" %% "digi-lib-slf4j" % "0.2.1-SNAPSHOT" % "test",
        "org.digimead" %% "digi-lib-test" % "0.2.1-SNAPSHOT" % "test",
        "org.scalatest" %% "scalatest" % "1.9" % "test"
      )
    }
  )
} else {
  Seq[Project.Setting[_]](
   libraryDependencies ++= {
      Seq(
        "org.slf4j" % "slf4j-log4j12" % "1.7.1"
      )
    }
  )
}

ご覧のとおり、1 つの環境変数によって制御される単一の .sbt 定義を使用して、さまざまなプロジェクト設定を行っている可能性があります。環境変数は、すべてのプロジェクト/サブプロジェクトの束に影響します。

于 2013-02-01T02:21:59.533 に答える
3

2 つのタイプの依存関係がかなり異なる方法で扱われることは事実であり、そうでない場合は素晴らしいことです。主な障害は、設定が読み込まれる前に sbt がすべての外部プロジェクトについて知る必要があることです (さまざまな理由から)。

今のところ、最も簡単な解決策は、別の回答で説明されているように、おそらく環境変数またはシステム プロパティです。今後、次のことが sbt で可能になる可能性に非常に近づいていますが、まだいくつかの作業が必要です。

  1. いつものように依存関係を宣言する

    libraryDependencies += "org.example" % "rich-util" % "0.1"
    
  2. コマンドラインからソース依存関係を追加し、プロセスで通常の依存関係を自動的にオーバーライドします

    $ sbt
    > projects add ../RichUtil
    

一度に複数のライブラリをハックするために sbt 環境を設定するで説明されている規則ベースのアプローチは特殊なケースであり、これが機能することによっても有効になります。

于 2013-02-02T17:52:38.010 に答える