2013-01-31 10 views
5

それは、SBTで管理ライブラリの依存関係を宣言するのは簡単です例えば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つの依存関係を完全に異なるものとして扱っているようです。ビルド定義を書き換えるよりも、プロジェクト依存関係とライブラリ依存関係をより簡単に切り替える方法はありますか?

+0

多分、この質問/回答はあなたに役立ちます:http://stackoverflow.com/questions/14351940/setting-up-sbt-environment-to-hack-on-multiple-libraries-at-once/14352600# 14352600 –

答えて

3

私は自分のsbtスクリプト(テスト、パブリッシング、プロダクション)のシナリオをいくつか持っています。私はスクリプトから(例えば、bashから、あなたは他の環境を持っているかもしれません)DO=TESTS sbtと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定義と異なるプロジェクト設定を有していてもよく見ることができるように。環境変数は、すべてのプロジェクト/サブプロジェクト束に影響します。

+0

この例では環境変数によって設定が変更されているだけですが、元の質問にも適用できます。システムのプロパティもオプションです。つまり、私はシステムプロパティ/ env変数を避けることを好むので、この回答のシナリオでは通常カスタム設定を使用します。元の質問では、プロジェクト間の依存関係を定義するときには設定を使用できないため、env変数やプロパティはエレガントではありませんが、悪化する可能性があります。 –

3

2つのタイプの依存関係は、どちらかというとやや異なって扱われますが、そうでない場合は良いでしょう。主な障害は、設定がロードされる前に(さまざまな理由で)sbtがすべての外部プロジェクトを知る必要があることです。

今のところ最も簡単な解決策は、別の回答に記載されている環境変数またはシステムプロパティです。 、

  1. libraryDependencies += "org.example" % "rich-util" % "0.1" 
    

    通常
  2. コマンドラインからソースの依存関係を追加すると、依存関係を宣言します。今後、次はSBTに可能であることに非常に近いですが、まだいくつかのより多くの作業が必要

    $ sbt 
    > projects add ../RichUtil 
    

コンバージョン過程で自動的に通常依存をオーバーライドSetting up sbt environment to hack on multiple libraries at onceに記載されているエンティティベースのアプローチは特殊なケースであり、この作業によっても有効になります。

関連する問題