2013-08-23 4 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?

EDIT: для того, чтобы быть понятным, проблема заключается не в том, что scala-language или scala-reflection включены в качестве зависимости, проблема связана с основным (или корневым) проектом в зависимости от макро-проекта, когда он никогда не нуждается или использует его (так как его макрос)

+0

Вам не нужно зависеть от scala-компилятора. Для макросов достаточно всего лишь scala-reflection. –

+0

Также вы можете попробовать следующее: scalaVersion ("org.scala-lang"% "scala-reflect"% _% "provided"). Это должно удалить упоминание зависимости от POM. Для получения дополнительной информации см. Https://github.com/xeno-by/sbt-example-paradise210/issues/1. –

+0

Предоставленный метод не работает, проблема не связана с scala-компилятором или scala-отражением, проблема связана с основным проектом в зависимости от макро-подпроекта в зависимостях в 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) с dependsOn(macroSub % "compile-internal"). Это не добавит проект макроса в зависимость от POM.

+0

Очень полезно, спасибо! – Eric

+0

Примечание: если вы используете макросы в тестах, вы должны иметь '' macroSub% 'compile-internal, test-internal' 'для компиляции тестов для успеха. –

Смежные вопросы