7

sbt に Leiningen の「チェックアウト」機能に相当するものはありますか?

これが私が達成したいことです:

アプリケーションFooとライブラリ「Bar 」の 2 つのプロジェクトがあります。これらの各プロジェクトを個別に公開したいと考えています。 FooはBarに依存しており、sbt プロジェクトは、サードパーティが "Foo" をビルドしようとするたびに、リポジトリから" Bar "の jar をダウンロードするように sbt に指示します(これは典型的な動作です)。

ここで、 FooBarの両方を同時にハックしたいとします。たとえば、 Foo の作業中にBarのソースの一部を直接編集およびデバッグして、編集がFooに影響するようにしたいと考えています(その後、都合のよいときにBarを再構築します)。

このハック セッション中に (ローカル リポジトリではなく) 私のマシン上のソース コードからBarへの依存を満たすように sbt に指示するにはどうすればよいですか?

(PS Clojure/Leiningen についても同様の質問をしました。Leiningen には、これを実現する「チェックアウト」機能があります。sbt に似たようなものがあるかどうか疑問に思っています...)

4

1 に答える 1

9

プロジェクト参照を介して、Foo から Bar へのソース依存関係を宣言できます。

import sbt._

object FooBuild extends Build {
  lazy val root = Project(
    id = "foo",
    base = file(".")
  ) dependsOn(theBarBuild)

  lazy val theBarBuild = ProjectRef(
    base = file("/path/to/bar"),
    id = "bar")
}

これにより、Foo をコンパイルするたびに Bar も再コンパイルされます (変更されている場合)。idプロジェクト参照の は Bar プロジェクトの実際の ID と一致する必要があることに注意してください。たとえば、単純なビルド定義 (ファイルのみ)default-edd2f8を使用する場合などです。.sbt

この手法は、プラグインで特に役立ちます (このトピックに関する私のブログ投稿を参照してください)。

編集:

次のように、チェックアウト動作を再コーディングできます。

import sbt._

object FooBuild extends Build {
  lazy val root = addCheckouts(Project(id = "foo", base = file(".")))

  def addCheckouts(proj: Project): Project = {
    val checkouts = proj.base.getCanonicalFile / "checkouts"
    if (! checkouts.exists) proj
    else proj.dependsOn(IO.listFiles(DirectoryFilter)(checkouts).map { dir =>
      ProjectRef(base = dir, id = dir.name): ClasspathDep[ProjectReference]
    }:_*)
  }
}

これにより、プロジェクト ディレクトリでディレクトリがチェックcheckoutsされ、存在する場合は、その中のディレクトリ (他のプロジェクトへのシンボリック リンクである必要があります) がプロジェクトへのプロジェクト参照として追加されます。シンボリック リンクには、リンクされたプロジェクトの実際の ID (default-edd2f8または などbar) のような名前が付けられることが期待されます。ディレクトリが存在しない場合、ビルドは以前と同じように機能します。

チェックアウト ディレクトリ (またはディレクトリ自体) でシンボリック リンクを追加または削除する場合は、Foo プロジェクトを再読み込みして変更を反映する必要があります。

お役に立てれば。

于 2013-01-16T06:35:20.220 に答える