Макрозависимость, возникающая в POM/JAR

У меня есть проект scala, который использует макросы, которые в основном следуют описанному здесь точному методу (http://www.scala-sbt.org/0.12.4/docs/Detailed-Topics/Macro-Projects.html), включая весь раздел "Распространение" (по сути, у меня есть проект root и подпроект, называемый макросом, который использует макросы)

Проблема заключается в том, что когда я публикую свой проект (используя publish-local на данный момент), а другой проект scala использует тот, у которого макрос как зависимость, он пытается вытащить макроС# macro_2.10; 0.1-SNAPSHOT поскольку он появляется в POM. Это приводит к невозможности компиляции проекта, поскольку он не может разрешить зависимость, т.е.

> compile
[info] Updating {file:/Users/mdedetrich/silvermanwylie/waitress/}default-0e4b9d...
[info] Resolving macro#macro_2.10;0.1-SNAPSHOT ...
[warn]  module not found: macro#macro_2.10;0.1-SNAPSHOT
[warn] ==== local: tried
[warn]   /Users/mdedetrich/.ivy2/local/macro/macro_2.10/0.1-SNAPSHOT/ivys/ivy.xml
[warn] ==== public: tried
[warn]   http://repo1.maven.org/maven2/macro/macro_2.10/0.1-SNAPSHOT/macro_2.10-0.1-SNAPSHOT.pom
[info] Resolving org.slf4j#slf4j-api;1.6.4 ...
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[warn]  ::          UNRESOLVED DEPENDENCIES         ::
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[warn]  :: macro#macro_2.10;0.1-SNAPSHOT: not found
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[trace] Stack trace suppressed: run last *:update for the full output.
[error] (*:update) sbt.ResolveException: unresolved dependency: macro#macro_2.10;0.1-SNAPSHOT: not found
[error] Total time: 0 s, completed Aug 23, 2013 8:15:56 PM

Если я вручную удалю зависимость от ivy-1.0.0-SNAPSHOT.xml

<dependency org="macro" name="macro_2.10" rev="0.1-SNAPSHOT" conf="compile->default(compile)"/>

В кэше плюшей все работает отлично (компилируется проект и макрос, который он использует из зависимости, отлично работает)

Вот что выглядит моя Build.scala

import sbt._
import Keys._

object MacroBuild extends Build {
  lazy val main = Project("main", file(".")) dependsOn(macroSub) settings(
    // include the macro classes and resources in the main jar
    mappings in (Compile, packageBin) <++= mappings in (macroSub, Compile, packageBin),
    // include the macro sources in the main source jar
    mappings in (Compile, packageSrc) <++= mappings in (macroSub, Compile, packageSrc)
  )
  lazy val macroSub = Project("macro", file("macro")) settings(
    scalaVersion:= "2.10.2",
    libraryDependencies <+= scalaVersion("org.scala-lang" % "scala-compiler" % _),
    publish := {},
    publishLocal := {}
   )
}

Как предотвратить появление зависимости макроса от POM?

РЕДАКТИРОВАТЬ: просто чтобы быть ясным, проблема не в scala -языке или scala - если включить в качестве зависимости, проблема связана с основным (или корневым) проектом в зависимости от макро-подпроекта, когда он никогда не нужен или не использует его (поскольку его макрос)

Ответы

Ответ 1

Строка .scala в связанном документе представляет собой многопроектную сборку:

import sbt._
import Keys._

object MacroBuild extends Build {
   lazy val main = Project("main", file(".")) dependsOn(macroSub)
   lazy val macroSub = Project("macro", file("macro")) settings(
      libraryDependencies <+= scalaVersion("org.scala-lang" % "scala-compiler" % _)
   )
}

Это означает, что файлы макрокоманды будут в другой банке, и вы должны publish (или publish-local) как ваш основной проект, так и проект макроса, если другой проект захочет его использовать.

> project macro
> publish-local

Ответ 2

В определении основного проекта вы можете заменить dependsOn(macroSub) на dependsOn(macroSub % "compile-internal"). Это не добавит проект макроса в зависимость от POM.