2013-08-23 42 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%「編譯內部,測試內部」'編譯測試才能成功。 –