2013-08-23 43 views
2

我有一个使用宏的scala项目,它基本上遵循这里描述的确切方法(http://www.scala-sbt.org/0.12.4/docs/Detailed-Topics/Macro-Projects.html),包括整个分配部分(实质上我有一个根项目和一个名为宏的子项目持有正在使用的宏)宏的依赖出现在POM/JAR中

问题是,当我发布我的项目(现在使用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 

如果我手动从依赖常春藤-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反映被包括作为依赖项,问题是与主(或根)项目取决于宏子项目时,它从来没有实际需要或使用它(因为它是一个宏)

+0

您不必依靠scala编译器。对于宏来说,scala反射就足够了。 –

+0

你也可以试试这个:scalaVersion(“org.scala-lang”%“scala-reflect”%_%“provided”)。这应该删除从POM提到的依赖关系。有关更多详细信息,请参阅https://github.com/xeno-by/sbt-example-paradise210/issues/1。 –

+0

提供的方法不起作用,问题不在于scala编译器或scala-reflect,问题在于主项目取决于POM中的依赖关系中的宏子项目 刚刚更新的问题以反映此问题 – mdedetrich

回答

0

的Build.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 
+0

好的,这工作得很好,但它仍然令人困惑。为什么你需要发布宏依赖项,如果它从未实际使用的项目? 为什么分布下的文档指定覆盖宏子项目的发布和发布本地命令。这意味着即使从技术角度讲,宏是一个子项目,但它只是由于宏编译和工作方式,以及该宏子项目不应该发布(这就是为什么它被覆盖...) – mdedetrich

7

在您的主项目的定义,你可以用dependsOn(macroSub % "compile-internal")取代dependsOn(macroSub)。这不会将宏项目添加为POM的依赖项。

+0

非常有帮助,谢谢! – Eric

+0

注意:如果你在测试中使用宏,你必须有''macroSub%“编译内部,测试内部”'编译测试才能成功。 –