2012-02-25 11 views
10

Come saprete, le nuove versioni di SBT (come 0.11) sono progettate per mantenere una cache di librerie comuni in ~/.ivy2/cache invece di copiare l'intero set di dipendenze all'interno di una directory di progetto. Ma IntelliJ Idea (io uso il plugin SBT per generare un progetto Idea) sembra ignorare la cache comune e vedere solo le librerie messe sotto la directory del progetto (quindi, devo configurare SBT per agire in questo modo legacy). Come risolvere questo?Come impostare un progetto IntelliJ Idea Scala per riconoscere la cache Ivy2 locale?

Ci sono alcuni plugin di Ivy nel repository di plugin Idea, ma non so quale (se esiste) di essi può risolvere il problema (si noti che non voglio che gestisca le dipendenze e scarichi le librerie (come è fatto da SBT) ma solo per cercare le classi nella cache).

risposta

7

sbt-idea fa riferimento alle librerie nelle posizioni che sbt fa riferimento a esse, che per impostazione predefinita è inferiore a ~/.ivy2/cache.

Ecco come appare sul mio sistema, con un progetto fresco, SBT 0.11.2 e 0.11.0 SBT-idea:

~/code/scratch/20120225 sbt 
[info] Loading global plugins from /Users/jason/.sbt/plugins 
[info] Set current project to default-d73535 (in build file:/Users/jason/code/scratch/20120225/) 

> set libraryDependencies += "org.scalaz" %% "scalaz-core" % "6.0.3" 
[info] Reapplying settings... 
[info] Set current project to default-d73535 (in build file:/Users/jason/code/scratch/20120225/) 

> session save 
[info] Reapplying settings... 
[info] Set current project to default-d73535 (in build file:/Users/jason/code/scratch/20120225/) 

> gen-idea no-sbt-classifiers 
[info] Trying to create an Idea module default-d73535 
[info] Resolving org.scala-lang#scala-library;2.9.1 ... 
[info] Resolving org.scalaz#scalaz-core_2.9.1;6.0.3 ... 
[info] Excluding folder target 
[info] Created /Users/jason/code/scratch/20120225/.idea/IdeaProject.iml 
[info] Created /Users/jason/code/scratch/20120225/.idea 
[info] Excluding folder /Users/jason/code/scratch/20120225/target 
[info] Created /Users/jason/code/scratch/20120225/.idea_modules/default-d73535.iml 
[info] Created /Users/jason/code/scratch/20120225/.idea_modules/project.iml 

    ~/code/scratch/20120225 grep jar /Users/jason/code/scratch/20120225/.idea/libraries/*.xml 
/Users/jason/code/scratch/20120225/.idea/libraries/org_scala_lang_scala_library_2_9_1.xml:  <root url="jar://$USER_HOME$/.sbt/boot/scala-2.9.1/lib/scala-library.jar!/"></root> 
/Users/jason/code/scratch/20120225/.idea/libraries/org_scala_lang_scala_library_2_9_1.xml:  <root url="jar://$USER_HOME$/.ivy2/cache/org.scala-lang/scala-library/docs/scala-library-2.9.1-javadoc.jar!/"></root> 
/Users/jason/code/scratch/20120225/.idea/libraries/org_scala_lang_scala_library_2_9_1.xml:  <root url="jar://$USER_HOME$/.ivy2/cache/org.scala-lang/scala-library/srcs/scala-library-2.9.1-sources.jar!/"></root> 
/Users/jason/code/scratch/20120225/.idea/libraries/org_scalaz_scalaz_core_2_9_1_6_0_3.xml:  <root url="jar://$USER_HOME$/.ivy2/cache/org.scalaz/scalaz-core_2.9.1/jars/scalaz-core_2.9.1-6.0.3.jar!/"></root> 
/Users/jason/code/scratch/20120225/.idea/libraries/org_scalaz_scalaz_core_2_9_1_6_0_3.xml:  <root url="jar://$USER_HOME$/.ivy2/cache/org.scalaz/scalaz-core_2.9.1/docs/scalaz-core_2.9.1-6.0.3-javadoc.jar!/"></root> 
/Users/jason/code/scratch/20120225/.idea/libraries/org_scalaz_scalaz_core_2_9_1_6_0_3.xml:  <root url="jar://$USER_HOME$/.ivy2/cache/org.scalaz/scalaz-core_2.9.1/srcs/scalaz-core_2.9.1-6.0.3-sources.jar!/"></root> 
/Users/jason/code/scratch/20120225/.idea/libraries/scala_2_9_1.xml:  <root url="jar://$USER_HOME$/.sbt/boot/scala-2.9.1/lib/scala-library.jar!/"></root> 
/Users/jason/code/scratch/20120225/.idea/libraries/scala_2_9_1.xml:  <root url="jar://$USER_HOME$/.sbt/boot/scala-2.9.1/lib/scala-compiler.jar!/"></root> 

Tuttavia, SBT ha un'impostazione di configurazione, retrieve-managed per usare fare un copia locale-build di tutte le librerie, piuttosto che riferirsi direttamente ad esse dalla cache. Se è abilitato, sbt-idea imposterà anche il percorso classe IntelliJ per fare riferimento a questi.

Ecco l'aiuto:

> help retrieve-managed 

If true, enables retrieving dependencies to the current build. Otherwise, dependencies are used directly from the cache. 

Proviamo fuori:

> set retrieveManaged in ThisBuild := true 
[info] Reapplying settings... 
[info] Set current project to default-d73535 (in build file:/Users/jason/code/scratch/20120225/) 
> update 
[info] Updating {file:/Users/jason/code/scratch/20120225/}default-d73535... 
[info] Resolving org.scala-lang#scala-library;2.9.1 ... 
[info] Resolving org.scalaz#scalaz-core_2.9.1;6.0.3 ... 
[info] Done updating. 
[success] Total time: 1 s, completed Feb 25, 2012 9:07:41 AM 
> show compile:dependency-classpath 
[info] Updating {file:/Users/jason/code/scratch/20120225/}default-d73535... 
[info] Resolving org.scala-lang#scala-library;2.9.1 ... 
[info] Resolving org.scalaz#scalaz-core_2.9.1;6.0.3 ... 
[info] Done updating. 
[info] ArrayBuffer(Attributed(/Users/jason/.sbt/boot/scala-2.9.1/lib/scala-library.jar), Attributed(/Users/jason/code/scratch/20120225/lib_managed/jars/org.scalaz/scalaz-core_2.9.1/scalaz-core_2.9.1-6.0.3.jar)) 
[success] Total time: 0 s, completed Feb 25, 2012 9:07:54 AM 


> gen-idea no-sbt-classifiers 
[info] Trying to create an Idea module default-d73535 
[info] Resolving org.scala-lang#scala-library;2.9.1 ... 
[info] Resolving org.scalaz#scalaz-core_2.9.1;6.0.3 ... 
[info] Excluding folder target 
[info] Created /Users/jason/code/scratch/20120225/.idea/IdeaProject.iml 
[info] Created /Users/jason/code/scratch/20120225/.idea 
[info] Excluding folder /Users/jason/code/scratch/20120225/target 
[info] Created /Users/jason/code/scratch/20120225/.idea_modules/default-d73535.iml 
[info] Created /Users/jason/code/scratch/20120225/.idea_modules/project.iml 

~/code/scratch/20120225 grep jar /Users/jason/code/scratch/20120225/.idea/libraries/*.xml 
/Users/jason/code/scratch/20120225/.idea/libraries/org_scala_lang_scala_library_2_9_1.xml:  <root url="jar://$USER_HOME$/.sbt/boot/scala-2.9.1/lib/scala-library.jar!/"></root> 
/Users/jason/code/scratch/20120225/.idea/libraries/org_scala_lang_scala_library_2_9_1.xml:  <root url="jar://$PROJECT_DIR$/lib_managed/docs/org.scala-lang/scala-library/scala-library-2.9.1-javadoc.jar!/"></root> 
/Users/jason/code/scratch/20120225/.idea/libraries/org_scala_lang_scala_library_2_9_1.xml:  <root url="jar://$PROJECT_DIR$/lib_managed/srcs/org.scala-lang/scala-library/scala-library-2.9.1-sources.jar!/"></root> 
/Users/jason/code/scratch/20120225/.idea/libraries/org_scalaz_scalaz_core_2_9_1_6_0_3.xml:  <root url="jar://$PROJECT_DIR$/lib_managed/jars/org.scalaz/scalaz-core_2.9.1/scalaz-core_2.9.1-6.0.3.jar!/"></root> 
/Users/jason/code/scratch/20120225/.idea/libraries/org_scalaz_scalaz_core_2_9_1_6_0_3.xml:  <root url="jar://$PROJECT_DIR$/lib_managed/docs/org.scalaz/scalaz-core_2.9.1/scalaz-core_2.9.1-6.0.3-javadoc.jar!/"></root> 
/Users/jason/code/scratch/20120225/.idea/libraries/org_scalaz_scalaz_core_2_9_1_6_0_3.xml:  <root url="jar://$PROJECT_DIR$/lib_managed/srcs/org.scalaz/scalaz-core_2.9.1/scalaz-core_2.9.1-6.0.3-sources.jar!/"></root> 
/Users/jason/code/scratch/20120225/.idea/libraries/scala_2_9_1.xml:  <root url="jar://$USER_HOME$/.sbt/boot/scala-2.9.1/lib/scala-library.jar!/"></root> 
/Users/jason/code/scratch/20120225/.idea/libraries/scala_2_9_1.xml:  <root url="jar://$USER_HOME$/.sbt/boot/scala-2.9.1/lib/scala-compiler.jar!/"></root> 
+0

importante +1, stesso dicasi per Eclipse o è solo questo IntelliJ? – virtualeyes

+0

Cosa fa 'no-sbt-classifiers'? –

+0

Sto usando davvero retrieve-managed perché tutto funzioni. L'ultima volta che ho provato a evitarlo, ha portato a problemi con l'idea di vedere le librerie. Era Idea 10, forse è stato risolto in 11 ... – Ivan

Problemi correlati