Giter VIP home page Giter VIP logo

sbt's Introduction

CI Latest version Discord

sbt

sbt is a build tool for Scala, Java, and more.

For general documentation, see https://www.scala-sbt.org/.

sbt 1.x

This is the 1.x series of sbt. The source code of sbt is split across several GitHub repositories, including this one.

  • sbt/io hosts sbt.io module.
  • sbt/librarymanagement hosts sbt.librarymanagement module that wraps Ivy.
  • sbt/zinc hosts Zinc, an incremental compiler for Scala.
  • sbt/sbt, this repository hosts modules that implements the build tool.

Other links

  • Setup: Describes getting started with the latest binary release.
  • FAQ: Explains how to get help and more.
  • sbt/sbt-zero-seven: hosts sbt 0.7.7 and earlier versions

Issues and Pull Requests

Please read CONTRIBUTING carefully before opening a GitHub Issue.

The short version: try searching or asking on StackOverflow.

license

See LICENSE.

sbt's People

Contributors

adpi2 avatar ajozwik avatar blaisorblade avatar cheeseng avatar dependabot[bot] avatar duhemm avatar dwijnand avatar eatkins avatar eed3si9n avatar er1c avatar gkossakowski avatar harrah avatar havocp avatar indrajitr avatar jaceklaskowski avatar jedesah avatar jroper avatar jrudolph avatar jsoref avatar jsuereth avatar jvican avatar mkurz avatar paulp avatar pdalpra avatar raboof avatar retronym avatar smarter avatar urbas avatar vigdorchik avatar xuwei-k avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

sbt's Issues

Improve "run 'last <task>' for the full log" to include task name

Including the task name is important because it is often not the task that the user invoked. For example, if the user invokes "compile" and there's an error during update, "last compile" results in no output while "last update" does the right thing.

Alternatively the last command could be more intelligent.

'show full-classpath' should work when there are compiler errors

I ran into an issue where my code failed to compile because a dependency was causing an earlier version of the Servlet API to be included in my classpath. I wanted to print the classpath in order to investigate this issue, but the task forced the compilation and failed as a result.

This would be a nice to have, but by no means essential (and there are workarounds like removing the offending code, although this can sometimes be difficult). So, if it's difficult to implement, feel free to close.

type alias to java annotation causes error with xsbti.api.Annotated

In my src/main/scala, I have a few java annotations, some of which are aliased like this:

JFoo.java: @interface JFoo { ...
package.scala: package object package { 
  type Foo = JFoo @field

When I try to compile it I get:

[error] Incomplete tasks (run 'last ' for the full log):
[error]   {file:/C:/Users/vincent/Documents/devel/project/}default/compile: java.lang.RuntimeException: Not a simple type:
[error]         Type: package.JFoo @scala.annotation.target.field (class class scala.tools.nsc.symtab.Types$AnnotatedType)
[error]         Transformed: class xsbti.api.Annotated

util completion fails to compile

[info] == Completion / compile ==
[info]   Source analysis: 9 new/modified, 0 indirectly invalidated, 0 removed.
[info] Compiling main sources...
[error] /home/siasia/projects/xsbt/util/complete/JLineCompletion.scala:70: value getBuffer is not a member of jline.CursorBuffer
[error]         b.getBuffer.substring(0, b.cursor)
[error]           ^
[error] /home/siasia/projects/xsbt/util/complete/JLineCompletion.scala:105: value printCandidates is not a member of object jline.CandidateListCompletionHandler
[error]         CandidateListCompletionHandler.printCandidates(reader, JavaConversions.asJavaList(cs), true)
[error]                                        ^
[error] two errors found

Error when using subprojects

Transfered from aolshevskiy/xsbt-web-plugin#1

If i have a project AWeb, and a project BWeb that have AWeb as a subproject. I get the following error.

java.lang.RuntimeException: AttributeKey ID collisions detected for 'prepare-webapp', 'jetty-conf-files', 'jetty-classpaths', 'jetty-port', 'jetty-scan-interval', 'jetty-context', 'watch-webapp-resources', 'temporary-war-path', 'jetty-scan-dirs', 'jetty-configuration', 'webapp-resources', 'webapp-unmanaged'
at scala.Predef$.error(Predef.scala:58)
at sbt.Index$.stringToKeyMap(Build.scala:143)
at sbt.Load$.structureIndex(Load.scala:120)
at sbt.Load$.apply(Load.scala:89)
at sbt.Load$.defaultLoad(Load.scala:41)
at sbt.BuiltinCommands$$anonfun$loadProjectImpl$2.apply(Main.scala:349)
at sbt.BuiltinCommands$$anonfun$loadProjectImpl$2.apply(Main.scala:346)
at sbt.Command$$anonfun$applyEffect$1$$anonfun$apply$2.apply(Command.scala:61)
at sbt.Command$$anonfun$applyEffect$1$$anonfun$apply$2.apply(Command.scala:61)
at sbt.Command$$anonfun$applyEffect$2$$anonfun$apply$3.apply(Command.scala:63)
at sbt.Command$$anonfun$applyEffect$2$$anonfun$apply$3.apply(Command.scala:63)
at sbt.Command$.process(Command.scala:91)
at sbt.MainLoop$$anonfun$next$1$$anonfun$apply$1.apply(Main.scala:71)
at sbt.MainLoop$$anonfun$next$1$$anonfun$apply$1.apply(Main.scala:71)
at sbt.State$$anon$1.process(State.scala:54)
at sbt.MainLoop$$anonfun$next$1.apply(Main.scala:71)
at sbt.MainLoop$$anonfun$next$1.apply(Main.scala:71)
at sbt.ErrorHandling$.wideConvert(ErrorHandling.scala:13)
at sbt.MainLoop$.next(Main.scala:71)
at sbt.MainLoop$.run(Main.scala:62)
at sbt.xMain.run(Main.scala:32)
at xsbt.boot.Launch$.run(Launch.scala:54)
at xsbt.boot.Launch$$anonfun$explicit$1.apply(Launch.scala:43)
at xsbt.boot.Launch$.launch(Launch.scala:68)
at xsbt.boot.Launch$.apply(Launch.scala:14)
at xsbt.boot.Boot$.runImpl(Boot.scala:24)
at xsbt.boot.Boot$.main(Boot.scala:15)
at xsbt.boot.Boot.main(Boot.scala)

SBT Version Check

I tried sbt 0.10 and all was fine until I by misstake run sbt 0.7.7 in the same project directory. It asked me to create new project and I quit it with ctrl-c. After that the project was polluted and didn't work with 0.10. It was difficult to understand that the reason was 0.7.7. To save others from this hassle it would be nice with some kind of check for this scenario and a nice error message.

The error I got was that when I had removed my .ivy2 directory it couldn't download sbt. Unresolved dependency:
[warn] ==== Typesafe Repository: tried
[warn] http://repo.typesafe.com/typesafe/releases/org.scala-tools.sbt/sbt_2.8.1/[sbtversion]/0.10.0/ivys/sbt_2.8.1-0.10.0.xml
[warn] -- artifact org.scala-tools.sbt#sbt_2.8.1;0.10.0!sbt_2.8.1.jar:
[warn] http://repo.typesafe.com/typesafe/releases/org.scala-tools.sbt/sbt_2.8.1/[sbtversion]/0.10.0/jars/sbt_2.8.1-0.10.0.jar

0.9.7 hangs on java compile error

a java compilation error seems to hang sbt

Sample project:
https://github.com/vincentcr/sbt-097-java-hang

Buggy.java is missing a closing brace. Fix that and everything is fine.

CTRL+\ output:

2011-05-23 11:32:48
Full thread dump Java HotSpot(TM) 64-Bit Server VM (17.1-b03 mixed mode):

"Thread-3" prio=10 tid=0x00000000481e1800 nid=0x1ec waiting for monitor entry [0x00000000423cf000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at sbt.BufferedLogger.doBufferableIf(BufferedLogger.scala:87)
        - waiting to lock <0x00002aaaaef9b8d8> (a sbt.Logger$$anon$1)
        at sbt.BufferedLogger.doBufferable(BufferedLogger.scala:85)
        at sbt.BufferedLogger.log(BufferedLogger.scala:75)
        at sbt.Logger$class.error(Logger.scala:74)
        at sbt.AbstractLogger.error(Logger.scala:8)
        at sbt.BasicIO$$anonfun$processErrFully$1.apply(ProcessImpl.scala:51)
        at sbt.BasicIO$$anonfun$processErrFully$1.apply(ProcessImpl.scala:51)
        at sbt.BasicIO$.readFully$1(ProcessImpl.scala:73)
        at sbt.BasicIO$.processLinesFully(ProcessImpl.scala:77)
        at sbt.BasicIO$$anonfun$processFully$1.apply(ProcessImpl.scala:64)
        at sbt.BasicIO$$anonfun$processFully$1.apply(ProcessImpl.scala:61)
        at sbt.SimpleProcessBuilder$$anonfun$4.apply$mcV$sp(ProcessImpl.scala:387)
        at sbt.Spawn$$anon$3.run(ProcessImpl.scala:20)

"pool-2-thread-2" prio=10 tid=0x0000000047d7f000 nid=0x1e7 waiting on condition [0x00000000418af000]
   java.lang.Thread.State: WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  <0x00002aaad06b78e0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        at java.util.concurrent.locks.LockSupport.park(LockSupport.java:158)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1987)
        at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:399)
        at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:947)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
        at java.lang.Thread.run(Thread.java:662)

"pool-2-thread-1" prio=10 tid=0x000000004758e800 nid=0x1e6 in Object.wait() [0x00000000417ac000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x00002aaaaefe7cd0> (a sbt.Spawn$$anon$3)
        at java.lang.Thread.join(Thread.java:1186)
        - locked <0x00002aaaaefe7cd0> (a sbt.Spawn$$anon$3)
        at java.lang.Thread.join(Thread.java:1239)
        at sbt.SimpleProcess$$anonfun$exitValue$2.apply(ProcessImpl.scala:406)
        at sbt.SimpleProcess$$anonfun$exitValue$2.apply(ProcessImpl.scala:406)
        at scala.collection.LinearSeqOptimized$class.foreach(LinearSeqOptimized.scala:61)
        at scala.collection.immutable.List.foreach(List.scala:45)
        at sbt.SimpleProcess.exitValue(ProcessImpl.scala:406)
        at sbt.AbstractProcessBuilder$$anonfun$runBuffered$1.apply$mcI$sp(ProcessImpl.scala:165)
        at sbt.AbstractProcessBuilder$$anonfun$runBuffered$1.apply(ProcessImpl.scala:165)
        at sbt.AbstractProcessBuilder$$anonfun$runBuffered$1.apply(ProcessImpl.scala:165)
        at sbt.BufferedLogger.liftedTree1$1(BufferedLogger.scala:25)
        at sbt.BufferedLogger.buffer(BufferedLogger.scala:25)
        - locked <0x00002aaaaef9b8d8> (a sbt.Logger$$anon$1)
        at sbt.AbstractProcessBuilder.runBuffered(ProcessImpl.scala:165)
        at sbt.AbstractProcessBuilder.$bang(ProcessImpl.scala:162)
        at sbt.Compiler$$anonfun$forkJavac$1.apply(Compiler.scala:90)
        at sbt.Compiler$$anonfun$forkJavac$1.apply(Compiler.scala:88)
        at sbt.compiler.JavaCompiler$$anonfun$forkJavac$1.externalJavac$1(JavaCompiler.scala:49)
        at sbt.compiler.JavaCompiler$$anonfun$forkJavac$1$$anonfun$apply$4.apply(JavaCompiler.scala:50)
        at sbt.compiler.JavaCompiler$$anonfun$forkJavac$1$$anonfun$apply$4.apply(JavaCompiler.scala:50)
        at sbt.compiler.JavaCompiler$$anonfun$withArgumentFile$1.apply(JavaCompiler.scala:69)
        at sbt.compiler.JavaCompiler$$anonfun$withArgumentFile$1.apply(JavaCompiler.scala:66)
        at sbt.IO$.withTemporaryDirectory(IO.scala:218)
        at sbt.compiler.JavaCompiler$.withArgumentFile(JavaCompiler.scala:66)
        at sbt.compiler.JavaCompiler$$anonfun$forkJavac$1.apply(JavaCompiler.scala:50)
        at sbt.compiler.JavaCompiler$$anonfun$forkJavac$1.apply(JavaCompiler.scala:46)
        at sbt.compiler.JavaCompiler$$anonfun$directOrForkJavac$1.apply(JavaCompiler.scala:42)
        at sbt.compiler.JavaCompiler$$anonfun$directOrForkJavac$1.apply(JavaCompiler.scala:38)
        at sbt.compiler.JavaCompiler$$anon$1.apply(JavaCompiler.scala:24)
        at sbt.AggressiveCompile$$anonfun$5$$anonfun$compileJava$1$1.apply$mcV$sp(AggressiveCompile.scala:75)
        at sbt.classfile.Analyze$.apply(Analyze.scala:86)
        at sbt.AggressiveCompile$$anonfun$5.compileJava$1(AggressiveCompile.scala:74)
        at sbt.AggressiveCompile$$anonfun$5.apply(AggressiveCompile.scala:78)
        at sbt.AggressiveCompile$$anonfun$5.apply(AggressiveCompile.scala:56)
        at sbt.inc.IncrementalCompile$$anonfun$doCompile$1.apply(Compile.scala:21)
        at sbt.inc.IncrementalCompile$$anonfun$doCompile$1.apply(Compile.scala:19)
        at sbt.inc.Incremental$.cycle(Incremental.scala:34)
        at sbt.inc.Incremental$.compile(Incremental.scala:21)
        at sbt.inc.IncrementalCompile$.apply(Compile.scala:17)
        at sbt.AggressiveCompile.compile2(AggressiveCompile.scala:86)
        at sbt.AggressiveCompile.compile1(AggressiveCompile.scala:37)
        at sbt.AggressiveCompile.apply(AggressiveCompile.scala:27)
        at sbt.Compiler$.apply(Compiler.scala:101)
        at sbt.Defaults$$anonfun$compileTask$1.apply(Defaults.scala:395)
        at sbt.Defaults$$anonfun$compileTask$1.apply(Defaults.scala:395)
        at sbt.Scoped$$anonfun$hf2$1.apply(Structure.scala:505)
        at sbt.Scoped$$anonfun$hf2$1.apply(Structure.scala:505)
        at scala.Function1$$anonfun$compose$1.apply(Function1.scala:44)
        at sbt.Scoped$Reduced$$anonfun$combine$1$$anonfun$apply$6.apply(Structure.scala:303)
        at sbt.Scoped$Reduced$$anonfun$combine$1$$anonfun$apply$6.apply(Structure.scala:303)
        at sbt.$tilde$greater$$anonfun$$u2219$1.apply(TypeFunctions.scala:39)
        at sbt.std.Transform$$anon$5.work(System.scala:66)
        at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:220)
        at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:220)
        at sbt.ErrorHandling$.wideConvert(ErrorHandling.scala:13)
        at sbt.Execute.work(Execute.scala:226)
        at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:220)
        at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:220)
        at sbt.CompletionService$$anon$1$$anon$2.call(CompletionService.scala:26)
        at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
        at java.util.concurrent.FutureTask.run(FutureTask.java:138)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
        at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
        at java.util.concurrent.FutureTask.run(FutureTask.java:138)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
        at java.lang.Thread.run(Thread.java:662)

"Low Memory Detector" daemon prio=10 tid=0x00000000470d1800 nid=0x1d7 runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"CompilerThread1" daemon prio=10 tid=0x00000000470cf000 nid=0x1d6 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"CompilerThread0" daemon prio=10 tid=0x00000000470ca000 nid=0x1d5 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Signal Dispatcher" daemon prio=10 tid=0x00000000470c8000 nid=0x1d4 runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Finalizer" daemon prio=10 tid=0x00000000470a3800 nid=0x1d3 in Object.wait() [0x0000000041fcb000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x00002aaace210478> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118)
        - locked <0x00002aaace210478> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:134)
        at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159)

"Reference Handler" daemon prio=10 tid=0x00000000470a1800 nid=0x1d2 in Object.wait() [0x00000000416ad000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x00002aaace210560> (a java.lang.ref.Reference$Lock)
        at java.lang.Object.wait(Object.java:485)
        at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116)
        - locked <0x00002aaace210560> (a java.lang.ref.Reference$Lock)

"main" prio=10 tid=0x0000000047021000 nid=0x1d0 waiting on condition [0x0000000040ab0000]
   java.lang.Thread.State: WAITING (parking)
        at sun.misc.Unsafe.park(Native Method)
        - parking to wait for  <0x00002aaad06b7cb0> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        at java.util.concurrent.locks.LockSupport.park(LockSupport.java:158)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1987)
        at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:399)
        at java.util.concurrent.ExecutorCompletionService.take(ExecutorCompletionService.java:164)
        at sbt.CompletionService$$anon$1.take(CompletionService.scala:29)
        at sbt.Execute.next$1(Execute.scala:74)
        at sbt.Execute.processAll(Execute.scala:77)
        at sbt.Execute.runKeep(Execute.scala:57)
        at sbt.Execute.run(Execute.scala:51)
        at sbt.EvaluateTask$.runTask(EvaluteTask.scala:78)
        at sbt.Aggregation$$anonfun$7.apply(Aggregation.scala:83)
        at sbt.Aggregation$$anonfun$7.apply(Aggregation.scala:83)
        at sbt.EvaluateTask$.withStreams(EvaluteTask.scala:60)
        at sbt.Aggregation$.runTasks(Aggregation.scala:83)
        at sbt.Aggregation$$anonfun$applyTasks$1.apply(Aggregation.scala:74)
        at sbt.Aggregation$$anonfun$applyTasks$1.apply(Aggregation.scala:73)
        at sbt.Command$$anonfun$applyEffect$2$$anonfun$apply$3.apply(Command.scala:63)
        at sbt.Command$$anonfun$applyEffect$2$$anonfun$apply$3.apply(Command.scala:63)
        at sbt.Command$.process(Command.scala:91)
        at sbt.MainLoop$$anonfun$next$1$$anonfun$apply$1.apply(Main.scala:71)
        at sbt.MainLoop$$anonfun$next$1$$anonfun$apply$1.apply(Main.scala:71)
        at sbt.State$$anon$1.process(State.scala:54)
        at sbt.MainLoop$$anonfun$next$1.apply(Main.scala:71)
        at sbt.MainLoop$$anonfun$next$1.apply(Main.scala:71)
        at sbt.ErrorHandling$.wideConvert(ErrorHandling.scala:13)
        at sbt.MainLoop$.next(Main.scala:71)
        at sbt.MainLoop$.run(Main.scala:62)
        at sbt.xMain.run(Main.scala:32)
        at xsbt.boot.Launch$.run(Launch.scala:54)
        at xsbt.boot.Launch$$anonfun$explicit$1.apply(Launch.scala:43)
        at xsbt.boot.Launch$.launch(Launch.scala:68)
        at xsbt.boot.Launch$.apply(Launch.scala:14)
        at xsbt.boot.Boot$.runImpl(Boot.scala:24)
        at xsbt.boot.Boot$.main(Boot.scala:15)
        at xsbt.boot.Boot.main(Boot.scala)

"VM Thread" prio=10 tid=0x000000004709d000 nid=0x1d1 runnable

"VM Periodic Task Thread" prio=10 tid=0x00000000470d4800 nid=0x1d9 waiting on condition

JNI global references: 1073

Heap
 def new generation   total 28608K, used 15496K [0x00002aaaae210000, 0x00002aaab0110000, 0x00002aaace210000)
  eden space 25472K,  60% used [0x00002aaaae210000, 0x00002aaaaf1323c0, 0x00002aaaafaf0000)
  from space 3136K,   0% used [0x00002aaaafaf0000, 0x00002aaaafaf0000, 0x00002aaaafe00000)
  to   space 3136K,   0% used [0x00002aaaafe00000, 0x00002aaaafe00000, 0x00002aaab0110000)
 tenured generation   total 63444K, used 38064K [0x00002aaace210000, 0x00002aaad2005000, 0x00002aab0e210000)
   the space 63444K,  59% used [0x00002aaace210000, 0x00002aaad073c198, 0x00002aaad073c200, 0x00002aaad2005000)
 compacting perm gen  total 51648K, used 51460K [0x00002aab0e210000, 0x00002aab11480000, 0x00002aab1e210000)
   the space 51648K,  99% used [0x00002aab0e210000, 0x00002aab11451060, 0x00002aab11451200, 0x00002aab11480000)
No shared spaces configured.

jars in provided scope don't get passed to javac

In my build.sbt file included the line:

libraryDependencies += "javax.servlet" % "servlet-api" % "2.5" % "provided"

When I compiled the servlet api jar was not on the classpath. I removed the % "provided" and the project compiled correctly. I don't know if this is a general problem IE if scala has the problem or if it is only a problem with javac. Or perhaps the way to define scopes has changed in 0.9.1. I assumed it was the same since there are so many similarities between 0.91 and 0.7.x.

updateSbtClassifiers should fix scala version used for sbt's cross version

When I execute EvaluateTask.evaluateTask(buildStruct, Keys.updateSbtClassifiers, state, projectRef, false, EvaluateTask.SystemProcessors) in a project via the sbt-idea plugin, I get:

Some(Inc(Incomplete(node=Some(ScopedKey(Scope(Select(ProjectRef(file:/media/internal0/home/ijuma/idea-workspace/foo/,common)),Global,Global,Global),update-sbt-classifiers)), tpe=init$default$2, msg=None, causes=List(), directCause=Some(sbt.ResolveException: unresolved dependency: org.scala-tools.sbt#sbt_2.9.0-1;0.10.0: not found))))

Mark suggested that:

"That is probably a bug in update-sbt-classifiers. It probably needs to fix the scala version used for sbt's cross version."

Note that crossPaths is false for the project in question.

See full discussion thread here:

https://groups.google.com/d/msg/simple-build-tool/ccIYjMBYaLA/GHW8MuS6wMkJ

SBT not found

Hello,

I want to use SBT to compile a Maven project.

The Problem ist alwas that SBT don't find lift. If I add a project.scala the loading of the project fails. The SBT Console does not find "import sbt._" . I recreate projects many times but it does not work.

Sascha

compile gives NoType error

issuing sbt compile gives this error:

default/compile: java.lang.RuntimeException: NoType

sample:
https://github.com/vincentcr/sbt-098-iter-notype

stack trace:

java.lang.RuntimeException: NoType
at xsbt.API.error(API.scala:26)
at xsbt.API.xsbt$API$$makeType(API.scala:330)
at xsbt.API$$anonfun$xsbt$API$$processType$1.apply(API.scala:312)
at xsbt.API$$anonfun$xsbt$API$$processType$1.apply(API.scala:312)
at scala.collection.mutable.MapLike$class.getOrElseUpdate(MapLike.scala:188)
at scala.collection.mutable.HashMap.getOrElseUpdate(HashMap.scala:43)
at xsbt.API.xsbt$API$$processType(API.scala:312)
at xsbt.API$$anonfun$xsbt$API$$types$1.apply(API.scala:112)
at xsbt.API$$anonfun$xsbt$API$$types$1.apply(API.scala:112)
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:194)
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:194)
at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:34)
at scala.collection.mutable.ArrayOps.foreach(ArrayOps.scala:38)
at scala.collection.TraversableLike$class.map(TraversableLike.scala:194)
at scala.collection.mutable.ArrayOps.map(ArrayOps.scala:38)
at xsbt.API.xsbt$API$$types(API.scala:112)
at xsbt.API$$anonfun$mkStructure$1.apply(API.scala:259)
at xsbt.API$$anonfun$mkStructure$1.apply(API.scala:259)
at xsbt.Message$$anon$1.apply(Message.scala:8)
at xsbti.SafeLazy$$anonfun$apply$1.apply(SafeLazy.scala:8)
at xsbti.SafeLazy$Impl._t(SafeLazy.scala:20)
at xsbti.SafeLazy$Impl.get(SafeLazy.scala:24)
at xsbt.API$$anonfun$xsbt$API$$forceStructures$1.apply(API.scala:95)
at xsbt.API$$anonfun$xsbt$API$$forceStructures$1.apply(API.scala:95)
at scala.collection.LinearSeqOptimized$class.foreach(LinearSeqOptimized.scala:59)
at scala.collection.immutable.List.foreach(List.scala:45)
at xsbt.API.xsbt$API$$forceStructures(API.scala:95)
at xsbt.API$ApiPhase.processScalaUnit(API.scala:49)
at xsbt.API$ApiPhase.processUnit(API.scala:40)
at xsbt.API$ApiPhase$$anonfun$run$1.apply(API.scala:36)
at xsbt.API$ApiPhase$$anonfun$run$1.apply(API.scala:36)
at scala.collection.Iterator$class.foreach(Iterator.scala:652)
at scala.collection.mutable.ListBuffer$$anon$1.foreach(ListBuffer.scala:311)
at xsbt.API$ApiPhase.run(API.scala:36)
at scala.tools.nsc.Global$Run.compileSources(Global.scala:949)
at scala.tools.nsc.Global$Run.compile(Global.scala:1034)
at xsbt.CompilerInterface.run(CompilerInterface.scala:87)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at sbt.compiler.AnalyzingCompiler.call(AnalyzingCompiler.scala:57)
at sbt.compiler.AnalyzingCompiler.compile(AnalyzingCompiler.scala:29)
at sbt.compiler.AnalyzingCompiler.compile(AnalyzingCompiler.scala:25)
at sbt.AggressiveCompile$$anonfun$5.compileScala$1(AggressiveCompile.scala:66)
at sbt.AggressiveCompile$$anonfun$5.apply(AggressiveCompile.scala:78)
at sbt.AggressiveCompile$$anonfun$5.apply(AggressiveCompile.scala:56)
at sbt.inc.IncrementalCompile$$anonfun$doCompile$1.apply(Compile.scala:21)
at sbt.inc.IncrementalCompile$$anonfun$doCompile$1.apply(Compile.scala:19)
at sbt.inc.Incremental$.cycle(Incremental.scala:34)
at sbt.inc.Incremental$.compile(Incremental.scala:21)
at sbt.inc.IncrementalCompile$.apply(Compile.scala:17)
at sbt.AggressiveCompile.compile2(AggressiveCompile.scala:86)
at sbt.AggressiveCompile.compile1(AggressiveCompile.scala:37)
at sbt.AggressiveCompile.apply(AggressiveCompile.scala:27)
at sbt.Compiler$.apply(Compiler.scala:101)
at sbt.Defaults$$anonfun$compileTask$1.apply(Defaults.scala:397)
at sbt.Defaults$$anonfun$compileTask$1.apply(Defaults.scala:397)
at sbt.Scoped$$anonfun$hf2$1.apply(Structure.scala:507)
at sbt.Scoped$$anonfun$hf2$1.apply(Structure.scala:507)
at scala.Function1$$anonfun$compose$1.apply(Function1.scala:44)
at sbt.Scoped$Reduced$$anonfun$combine$1$$anonfun$apply$9.apply(Structure.scala:305)
at sbt.Scoped$Reduced$$anonfun$combine$1$$anonfun$apply$9.apply(Structure.scala:305)
at sbt.$tilde$greater$$anonfun$$u2219$1.apply(TypeFunctions.scala:39)
at sbt.std.Transform$$anon$5.work(System.scala:66)
at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:220)
at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:220)
at sbt.ErrorHandling$.wideConvert(ErrorHandling.scala:13)
at sbt.Execute.work(Execute.scala:226)
at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:220)
at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:220)
at sbt.CompletionService$$anon$1$$anon$2.call(CompletionService.scala:26)
at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

Sub project compile error

If i have a project A with a class A, and a project B with a class B that extends A. And i have the following build files, the build fails.

-- A's build file --
import sbt._
import Keys._
import java.io.File

object MyBuild extends Build {
lazy val projects = Seq(root)
lazy val root = Project("A", file("."), settings = Defaults.defaultSettings ++ mySettings)

def mySettings = {
    Seq(name := "A", version := "1.0",
        unmanagedSourceDirectories in Compile := Seq(new File("src"))
    )
}

}

-- B's build file --
import sbt._
import Keys._
import java.io.File

object MyBuild extends Build {
lazy val projects = Seq(root)
lazy val a = RootProject(new File("../A"))
lazy val root = Project("B", file("."), settings = Defaults.defaultSettings ++ mySettings) aggregate (a) dependsOn (a)

def mySettings = {
    Seq(name := "B", version := "1.0",
        unmanagedSourceDirectories in Compile ++= Seq(new File("src"))
    )
}

}

-- Compile output --
[info] Set current project to B (in build file:/Users/soren/tmp/sbt/B/)
Compiling:
src/com/schantz/B.java
[error] /Users/soren/tmp/sbt/B/src/com/schantz/B.java:2: cannot find symbol
[error] symbol: class A
[error] public class B extends A {
[error] ^
[error] 1 error
[error] Incomplete tasks (run 'last ' for the full log):
[error] {file:/Users/soren/tmp/sbt/A/}A/compile: javac returned nonzero exit code
[error] Total time: 1 s, completed May 24, 2011 8:04:19 AM
macbookpro:B soren$

Project A compiles fine when compile is called in that project.

AnalysisStore takes up extremely large amounts of memory

If I try to compile my project when it loads the analysis cache files, I get:
java.lang.OutOfMemoryError: GC overhead limit exceeded

Looking at the memory from Yourkit shows 800+MB being taken up by the AggressiveCompiler cache
Just one AnalysisStore takes up 100+MB.

I don't think I had this problem a week ago, did everything move to sbinary or something? My cache files seem really big as well. It almost seems like it's not saving the graph correctly (saving the same object multiple times).

There seems to be a lot of redundancy of the AnalysisStore objects, it seems like it might be worthwhile to singleton them all. (ie have a cache map of all the types in java/xsbti/api

Cyclic reference with 0.10.1-SNAPSHOT and Web plugin

I am getting the following cycle reference with 0.10.1-SNAPSHOT and the web plugin (I replaced the project names):

Cyclic reference involving {file:/root-project-path/}subproject-name/:prepare-webapp, {file:/root-project-path/}subproject-name/:jetty-classpaths, {file:/root-project-path/}subproject-name/runtime:full-classpath, {file:/root-project-path/}subproject-name/runtime:exported-products, {file:/root-project-path/}subproject-name/package, {file:/root-project-path/}subproject-name/package-configuration(for package), {file:/root-project-path/}subproject-name/mappings(for package)

The exact same build file works fine with 0.10.0. Does this make it clear what the issue is or do you need an isolated test case?

incremental compile dependency check is very slow

Running the compile on a multi-project build with no changes is very slow (around 30+ seconds).

I ran yourkit on it, the patch below takes my time down to 1 second.

diff --git a/tasks/Execute.scala b/tasks/Execute.scala
index cc791ea..0158ba8 100644
--- a/tasks/Execute.scala
+++ b/tasks/Execute.scala
@@ -262,7 +262,7 @@ final class Execute[A[_] <: AnyRef](checkCycles: Boolean, triggers: Triggers[A])
dependencies( node ) foreach { dep =>
def onOpt[T](o: Option[T])(f: T => Boolean) = o match { case None => false; case Some(x) => f(x) }
def checkForward = onOpt( forward.get(node) ) { _ contains dep }

  •                   def checkReverse = onOpt( reverse.get(dep) ){ _.toSet contains node }
    
  •                   def checkReverse = onOpt( reverse.get(dep) ){ lst => lst.exists(_ == node) }
                    assert( done(dep) ^ ( checkForward && checkReverse ) )
            }
    }
    

Failure in detection of recompilation targets

It appears that SBT does not detect that a package object needs to be recompiled when that package object extends a trait within that package. See the attached gist for files that demonstrate the problem.

This bug causes me to have to clean and recompile the project fully after each change that impacts such a trait. Here's a trace of a session demonstrating the error:

clean
[success] Total time: 0 s, completed Jun 7, 2011 1:40:54 PM
compile
[info] Updating...
[info] Done updating.
[info] Compiling 2 Scala sources to /Users/knuttycombe/tmp/sbt/target/scala-2.8.1.final/classes...
[success] Total time: 6 s, completed Jun 7, 2011 1:41:01 PM

// at this point, add a line of whitespace to BarTrait.scala

compile
[info] Compiling 1 Scala source to /Users/knuttycombe/tmp/sbt/target/scala-2.8.1.final/classes...
[error] error while loading bar, class file needed by package is missing.
[error] reference type BarTrait of package foo.bar refers to nonexisting symbol.
[error] one error found
[error] Incomplete tasks (run 'last ' for the full log):
[error] {file:/Users/knuttycombe/tmp/sbt/}default/compile: Compilation failed
[error] Total time: 1 s, completed Jun 7, 2011 1:41:21 PM

Sample files are here; no other build configuration is being used.

https://gist.github.com/1012980

Building the 0.9 launcher fails on windows

When I checkout the project and run the proguard command I get:

[info] Interface / generate-source ...
java.lang.RuntimeException: {line 0} Invalid line, expected enum, class, or member definition
at xsbt.api.DatatypeParser.error(DatatypeParser.scala:25)
at xsbt.api.DatatypeParser$$anonfun$matchPattern$2.apply(DatatypeParser.scala:42)
at xsbt.api.DatatypeParser$$anonfun$matchPattern$2.apply(DatatypeParser.scala:42)
at scala.Option.getOrElse(Option.scala:104)
at xsbt.api.DatatypeParser.matchPattern(DatatypeParser.scala:41)
at xsbt.api.DatatypeParser.parseLine(DatatypeParser.scala:38)
at xsbt.api.DatatypeParser$$anonfun$parseLines$1.apply(DatatypeParser.scala:34)
at xsbt.api.DatatypeParser$$anonfun$parseLines$1.apply(DatatypeParser.scala:34)
at scala.Function$$anonfun$tupled$1.apply(Function.scala:103)
at scala.Function$$anonfun$tupled$1.apply(Function.scala:102)
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:206)
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:206)
at scala.collection.LinearSeqOptimized$class.foreach(LinearSeqOptimized.scala:61)
at scala.collection.immutable.List.foreach(List.scala:45)
at scala.collection.TraversableLike$class.map(TraversableLike.scala:206)

Is there a place where I can download the launcher in the meantime?

Thanks.

Name the dependency that has different Scala version

I got the following error with SBT 0.9.9 (without the commit that upgraded the Scala version to 2.9.0-1):

"java.lang.RuntimeException: Different Scala version specified in dependency (2.8.1) than in project (2.9.0-1)"

It would be helpful to know the name of the problematic dependency. :)

Also, in order to get more detail, there's the message:

"Incomplete tasks (run 'last ' for the full log)"

When I do "last test:compile", I get no output. Am I doing something wrong or is that also a bug? If so, I can file a separate one.

Pomfiles produced by SBT should include repositories from the ModuleConfigurations used

Here's what I use:

trait McPom { self: DefaultProject =>
import scala.xml._

def mcPom(mcs: Set[ModuleConfiguration])(node: Node): Node = {

def cleanUrl(url: String) = url match {
  case null                => ""
  case ""                  => ""
  case u if u endsWith "/" => u
  case u                   => u + "/"
}

val oldRepos =
  (node \\ "project" \ "repositories" \ "repository").map { n =>
    cleanUrl((n \ "url").text) -> (n \ "name").text
  }.toList

val newRepos =
  mcs.filter(_.resolver.isInstanceOf[MavenRepository]).map { m =>
    val r = m.resolver.asInstanceOf[MavenRepository]
    cleanUrl(r.root) -> r.name
  }

val repos = Map((oldRepos ++ newRepos): _*).map { pair =>
  <repository>
    <id>{pair._2.toSeq.filter(_.isLetterOrDigit).mkString}</id>
    <name>{pair._2}</name>
    <url>{pair._1}</url>
  </repository>
}

def rewrite(pf: PartialFunction[Node, Node])(ns: Seq[Node]): Seq[Node] = for(subnode <- ns) yield subnode match {
  case e: Elem =>
    if (pf isDefinedAt e) pf(e)
    else Elem(e.prefix, e.label, e.attributes, e.scope, rewrite(pf)(e.child):_*)
  case other => other
}

val rule: PartialFunction[Node,Node] = if ((node \\ "project" \ "repositories" ).isEmpty) {
  case Elem(prefix, "project", attribs, scope, children @ _*) =>
       Elem(prefix, "project", attribs, scope, children ++ <repositories>{repos}</repositories>:_*)
} else {
  case Elem(prefix, "repositories", attribs, scope, children @ _*) =>
       Elem(prefix, "repositories", attribs, scope, repos.toList: _*)
}

rewrite(rule)(node.theSeq)(0)

}
}

Usage: mcPom(AkkaParentProject.this.moduleConfigurations)(super.pomPostProcess(node))

Forking tests does not seem to work

Hi,

using the following settings in sbt 0.10:

fork in run := true

javaOptions in run += "-Xblabla"

when I type "test", the tests run, but they should not. Instead, the forked VM should complain like "Unrecognized option: -Xblabla" and "Could not create the Java virtual machine.". It works as expected for "run".

I am using specs2 to run the tests, so I am not sure whether this is a specs2 or an sbt issue. (Or maybe it's not an issue at all and I'm doing something wrong?)

StackOverflow error when analyzing class with self-referential static member

When trying to compile a project with a generated google protobuf class, I get a StackOverflow exception during the analysis phase.

I believe it's due to the class having a static member of itself, the core infinite recursion happens in sbt.ClassToAPI.merge

I was able to "fix the glitch" with the patch below, though I don't think it handles things like multihop circular dependencies.

The actual class I had a problem with was:
http://code.google.com/apis/protocolbuffers/docs/reference/java/com/google/protobuf/GeneratedMessage.ExtendableMessage.html

def merge[T](of: Class[_], self: Seq[T], public: Seq[T], f: T => Seq[api.Definition], splitStatic: Seq[T] => %28Seq[T],Seq[T]%29, isInherited: T => Boolean): Defs =
{
val (selfStatic, selfInstance) = splitStatic(self)
val (inheritedStatic, inheritedInstance) = splitStatic(public filter isInherited)

  •           Defs(selfInstance flatMap f, inheritedInstance flatMap f, selfStatic flatMap f, inheritedStatic flatMap f)
    
  • val selfStaticItems = selfStatic.filterNot(_ == of) flatMap f
  •           Defs(selfInstance flatMap f, inheritedInstance flatMap f, selfStaticItems, inheritedStatic flatMap f)
    }
    

IllegalArgumentException in update-classifiers while adding pom artifact

Seems like 0.10.1-SNAPSHOT doesn't like me! After disabling the web module, I get the following during update-classifiers:

[error] {file:/media/internal0/home/ijuma/src/root/}sub/*:update-classifiers: java.lang.IllegalArgumentException: Cannot add artifact 'sub.pom' to configuration 'pom' of module groupId#sub$sources;1.0 because this configuration doesn't exist!

Transitive dependency resolution oddity: jerkson -> jackson-mapper-asl

(This could well be due to user error or some factor outside of sbt's control. I'm new enough to this realm I'm unsure, so I figured I'd mention it just in case.)

I created a buid.sbt that looks like:

organization := "Example"

name := "example"

scalaVersion := "2.9.0-1"

resolvers += Resolver.url("Jerkson (Jackson JSON for Scala)", url("http://repo.codahale.com"))

libraryDependencies ++= Seq(
  "com.codahale" % "jerkson_2.9.0-1" % "0.3.1"
)

and a jerkson.scala that looks like:

import com.codahale.jerkson.Json._

object jerkson extends App {
  println(generate(List(1, 2, 3)))
}

When I "sbt compile" that project, I see error messages that seem to indicate that Jerkson can't find the Jackson dependencies it needs. The (Jerkson POM)[http://repo.codahale.com/com/codahale/jerkson_2.9.0-1/0.3.1/jerkson_2.9.0-1-0.3.1.pom] points at (jackson-mapper-asl)[http://repo1.maven.org/maven2/org/codehaus/jackson/jackson-mapper-asl/1.7.7/jackson-mapper-asl-1.7.7.pom]. If I explicitly add a dependency on jackson-mapper-asl, my code will compile.

  "org.codehaus.jackson" % "jackson-mapper-asl" % "1.7.7"

Is this indicative of a problem in the (Jerkson POM)[http://repo.codahale.com/com/codahale/jerkson_2.9.0-1/0.3.1/jerkson_2.9.0-1-0.3.1.pom]? Am I don't something wrong? Is sbt somehow not handling the Jerkson POM correctly?

Thanks for reading this far. Sorry if I've wasted your time.

readme to help with searching please

I couldn't find this when I searched for simple build tool github on google, yet this has a lot of watchers and forks. I think it's because "simple build tool" doesn't appear anywhere on the page.

sbt 0.10 does not create directory structure in new project.

I am operating under the (perhaps erroneous) assumption that sbt should create the directory structure defined on the Setup Wiki page when first run in a new directory. I cannot find anything that says it ought to, but the documentation seems to imply that it should. However it does not seem to do this for me.

$ mkdir new
$ cd new
$ sbt
[info] Set current project to default (in build file:/Users/foo/new/)

exit
$ ls -F
project/ target/
$ ls -F project
target/
$ ls -F target
streams/

Obviously I can create the structure manually so it's a minor bug, if a bug at all. If it is not supposed to create the directory structure automatically, then perhaps a single sentence in the Wiki would be sufficient to communicate this. I am happy to edit the wiki myself if someone can confirm that this is the case.

I am using Java version 1.6.0_24.

scala-library.jar not copied to lib_managed (0.10.0)

I have an explicit dependency on scala-library.jar in my build.sbt and have set autoScalaLibrary to true. But the scala-library.jar is not copied to lib_managed. (It's a mixed JRuby/Scala project, scala-library.jar is needed for deployment.)

In sbt 0.7.5, I had this in my project definition: override def filterScalaJars = false

Is there an equivalent in 0.10? Or another way to accomplish the same?

"provided" for inter-project dependencies

This is useful for cases where the project is made available through other means when e.g. deployed. Mark said:

"Yeah, I needed something like this as well and I think the answer in theory is to declare the dependencies as "provided". Unfortunately, this isn't implemented for inter-project dependencies, but if you open a bug, I'll try to get it implemented for the next version."

See the following for the full thread:
https://groups.google.com/d/topic/simple-build-tool/Fd0JhO9CCJ0/discussion

Non-empty line after resolvers += make update break

Hi there,

I had a build.sbt file that looked like this:

name := "My Project"

version := "1.0"

scalaVersion := "2.9.0"

...

resolvers += "Sonatype Nexus Snapshots" at "https://oss.sonatype.org/content/repositories/snapshots"
resolvers += "FuseSource Snapshot Repository" at "http://repo.fusesource.com/nexus/content/repositories/snapshots"

With that one, every time I tried "sbt update" I received the following error:

/Users/lucastorri/Projects/sbt0100/build.sbt:23: error: eof expected but ';' found.
resolvers += "FuseSource Snapshot Repository" at "http://repo.fusesource.com/nexus/content/repositories/snapshots"
^
[error] Error parsing expression.
Project loading failed: (r)etry, (q)uit, or (i)gnore? q

It only worked when I added an empty line after the first repo:

....

resolvers += "Sonatype Nexus Snapshots" at "https://oss.sonatype.org/content/repositories/snapshots"

resolvers += "FuseSource Snapshot Repository" at "http://repo.fusesource.com/nexus/content/repositories/snapshots"

Is that an expected behavior?

Thanks

Compile task fails with latest xsbt

Here is the console output:
% xsbt
Getting net.java.dev.jna jna 3.2.3 ...
:: retrieving :: org.scala-tools.sbt#boot-app
confs: [default]
1 artifacts copied, 0 already retrieved (838kB/16ms)
Getting Scala 2.8.1 ...
:: retrieving :: org.scala-tools.sbt#boot-scala
confs: [default]
4 artifacts copied, 0 already retrieved (15296kB/38ms)
Getting org.scala-tools.sbt sbt_2.8.1 0.9.3-SNAPSHOT ...
:: retrieving :: org.scala-tools.sbt#boot-app
confs: [default]
33 artifacts copied, 0 already retrieved (5526kB/98ms)
[info] Set current project to default (in build file:/home/siasia/projects/test/)
> compile
[info] Updating...
[info] Done updating.
[error] Incomplete task(s):
errordefault/compile: java.lang.NoSuchMethodError: sbt.CompileOptions.(Lscala/collection/Seq;Lscala/collection/Seq;)V
[error] Run 'last ' for the full log(s).
[error] Total time: 1 s, completed 04.04.2011 19:38:31
>

Looks like it's related to you latest commit of Java, Scala compile order support.

Associate ModuleID to externalDependencyClasspath entries

It's useful to know the ModuleID for each Attributed[File] returned from externalDependencyClasspath. Mark said:

"Attributed is a typesafe heterogeneous map. It is currently only used to track the Analysis instance for an entry, but could probably be extended to associate the ModuleID and Artifact with the entry. Please open a ticket if this sounds good."

The context of this is explained in more detail in the following thread about sbt-idea:

https://groups.google.com/d/msg/simple-build-tool/ccIYjMBYaLA/ReWUfVCtPu0J

increment-version should be intransitive

If I run the "increment-version" action, like any good ol' Task, it acts on the projects dependencies and then on the project itself. Unfortunately, that is odd behaviour for "increment-version". Could you make it intransitive?

Actually, in general, would it be possible to make a task intransitive?

updateClassifiers should not try to download failed artifact multiple times

An example of the output for a run in my multi-module project:

[ijuma@localhost]~% cat sbt-output| grep "NOT FOUND" | grep xerces
[warn] [NOT FOUND ] xerces#xercesImpl;2.9.1!xercesImpl.jar (359ms)
[warn] [NOT FOUND ] xerces#xercesImpl;2.9.1!xercesImpl.jar (359ms)
[warn] [NOT FOUND ] xerces#xercesImpl;2.9.1!xercesImpl.jar (122ms)
[warn] [NOT FOUND ] xerces#xercesImpl;2.9.1!xercesImpl.jar (122ms)
[warn] [NOT FOUND ] xerces#xercesImpl;2.9.1!xercesImpl.jar (121ms)
[warn] [NOT FOUND ] xerces#xercesImpl;2.9.1!xercesImpl.jar (121ms)
[warn] [NOT FOUND ] xerces#xercesImpl;2.9.1!xercesImpl.jar (123ms)
[warn] [NOT FOUND ] xerces#xercesImpl;2.9.1!xercesImpl.jar (123ms)
[warn] [NOT FOUND ] xerces#xercesImpl;2.9.1!xercesImpl.jar (121ms)
[warn] [NOT FOUND ] xerces#xercesImpl;2.9.1!xercesImpl.jar (121ms)
[warn] [NOT FOUND ] xerces#xercesImpl;2.9.1!xercesImpl.jar (122ms)
[warn] [NOT FOUND ] xerces#xercesImpl;2.9.1!xercesImpl.jar (122ms)
[warn] [NOT FOUND ] xerces#xercesImpl;2.9.1!xercesImpl.jar (374ms)
[warn] [NOT FOUND ] xerces#xercesImpl;2.9.1!xercesImpl.jar (374ms)
[warn] [NOT FOUND ] xerces#xercesImpl;2.9.1!xercesImpl.jar (130ms)
[warn] [NOT FOUND ] xerces#xercesImpl;2.9.1!xercesImpl.jar (130ms)
[warn] [NOT FOUND ] xerces#xercesImpl;2.9.1!xercesImpl.jar (129ms)
[warn] [NOT FOUND ] xerces#xercesImpl;2.9.1!xercesImpl.jar (129ms)
[warn] [NOT FOUND ] xerces#xercesImpl;2.9.1!xercesImpl.jar (132ms)
[warn] [NOT FOUND ] xerces#xercesImpl;2.9.1!xercesImpl.jar (132ms)
[warn] [NOT FOUND ] xerces#xercesImpl;2.9.1!xercesImpl.jar (130ms)
[warn] [NOT FOUND ] xerces#xercesImpl;2.9.1!xercesImpl.jar (130ms)
[warn] [NOT FOUND ] xerces#xercesImpl;2.9.1!xercesImpl.jar (129ms)
[warn] [NOT FOUND ] xerces#xercesImpl;2.9.1!xercesImpl.jar (129ms)
[warn] [NOT FOUND ] xerces#xercesImpl;2.9.1!xercesImpl.jar (130ms)
[warn] [NOT FOUND ] xerces#xercesImpl;2.9.1!xercesImpl.jar (130ms)

Display a meaningful error message for build.sbt files that do not use empty lines

I just kicked off a new app and wanted to use SBT 0.10. I did not notice empty lines requirement initially and wasted about 20 minutes figuring out why my build.sbt cannot be parsed:

/Users/antares/Development/supersecretapp/build.sbt:2: error: eof expected but ';' found.
name := "supersecretapp"
^
[error] Error parsing expression.

I am sorry but this error message just isn't helpful. I don't know why this empty lines requirement is there but it is very counter-intuitive. At least improve this error message.

SBT fails to find SBT version published with publish-local

This started happening recently, probably since the move to a 0.10 build. The interesting part of the error log:

[warn] ==== local: tried
[warn] /home/ijuma/.ivy2/local/org.scala-tools.sbt/sbt_2.8.1_2.8.1/0.10.1-SNAPSHOT/ivys/ivy.xml
[warn] -- artifact org.scala-tools.sbt#sbt_2.8.1_2.8.1;0.10.1-SNAPSHOT!sbt_2.8.1_2.8.1.jar:
[warn] /home/ijuma/.ivy2/local/org.scala-tools.sbt/sbt_2.8.1_2.8.1/0.10.1-SNAPSHOT/jars/sbt_2.8.1_2.8.1.jar

The actual path of the file:

~/.ivy2/local/org.scala-tools.sbt/sbt_2.8.1/0.10.1-SNAPSHOT/jars/sbt_2.8.1.jar

As can be seen, in the former, file has two "2.8.1" paths.

The launched I used for the test was 0.10.1-SNAPSHOT too by the way.

Consistent location for source jars with retrieveManaged := true

With retrieveManaged := true, withSources causes the source jars to be downloaded to lib_managed/src while update-classifiers causes them to be downloaded to lib_managed/jar. It would be nice to make this consistent, if not too hard.

In relation to filing this issue, Mark said:

"Ok, go ahead. It seems like it could be easy enough to implement, but if not, I'll just close it as wontfix for not worth the effort."

Original thread:

https://groups.google.com/d/topic/simple-build-tool/NJR7ZAMj93o/discussion

tab completion in 0.9 ignores one of the characters I typed

in the following transcript, note that I type Problem9 and press the tab key, yet the completions
I am offered aren't restricted to those where "9" is the first character after "Problem"

you can grab a copy of the project from http://www.sendspace.com/file/ymz38c

  ~/sethtisue/eul> xsbt
[info] Set current project to default (in build file:/Users/tisue/sethtisue/eul/)
> compile
[success] Total time: 1 s, completed Apr 18, 2011 3:36:33 PM
> test-only net.tisue.euler.Problem9
Display all 131 possibilities? (y or n) 
--                           net.tisue.euler.Problem1     net.tisue.euler.Problem10
net.tisue.euler.Problem100   net.tisue.euler.Problem101   net.tisue.euler.Problem102
net.tisue.euler.Problem104   net.tisue.euler.Problem107   net.tisue.euler.Problem108
net.tisue.euler.Problem11    net.tisue.euler.Problem110   net.tisue.euler.Problem112
net.tisue.euler.Problem113   net.tisue.euler.Problem114   net.tisue.euler.Problem115
net.tisue.euler.Problem116   net.tisue.euler.Problem117   net.tisue.euler.Problem118
net.tisue.euler.Problem119   net.tisue.euler.Problem12    net.tisue.euler.Problem120
net.tisue.euler.Problem121   net.tisue.euler.Problem123   net.tisue.euler.Problem124
net.tisue.euler.Problem125   net.tisue.euler.Problem13    net.tisue.euler.Problem14
net.tisue.euler.Problem145   net.tisue.euler.Problem15    net.tisue.euler.Problem16
net.tisue.euler.Problem17    net.tisue.euler.Problem173   net.tisue.euler.Problem179
net.tisue.euler.Problem18    net.tisue.euler.Problem187   net.tisue.euler.Problem188
net.tisue.euler.Problem19    net.tisue.euler.Problem191   net.tisue.euler.Problem2
net.tisue.euler.Problem20    net.tisue.euler.Problem203   net.tisue.euler.Problem204
net.tisue.euler.Problem205   net.tisue.euler.Problem206   net.tisue.euler.Problem21
net.tisue.euler.Problem22    net.tisue.euler.Problem23    net.tisue.euler.Problem24
net.tisue.euler.Problem25    net.tisue.euler.Problem26    net.tisue.euler.Problem27
net.tisue.euler.Problem28    net.tisue.euler.Problem29    net.tisue.euler.Problem3
net.tisue.euler.Problem30    net.tisue.euler.Problem31    net.tisue.euler.Problem32
net.tisue.euler.Problem33    net.tisue.euler.Problem34    net.tisue.euler.Problem35
net.tisue.euler.Problem36    net.tisue.euler.Problem37    net.tisue.euler.Problem38
net.tisue.euler.Problem39    net.tisue.euler.Problem4     net.tisue.euler.Problem40
net.tisue.euler.Problem41    net.tisue.euler.Problem42    net.tisue.euler.Problem43
net.tisue.euler.Problem44    net.tisue.euler.Problem45    net.tisue.euler.Problem46
net.tisue.euler.Problem47    net.tisue.euler.Problem48    net.tisue.euler.Problem49
net.tisue.euler.Problem4f    net.tisue.euler.Problem5     net.tisue.euler.Problem50
net.tisue.euler.Problem50i   net.tisue.euler.Problem51    net.tisue.euler.Problem52
net.tisue.euler.Problem53    net.tisue.euler.Problem54    net.tisue.euler.Problem55
net.tisue.euler.Problem56    net.tisue.euler.Problem57    net.tisue.euler.Problem58
net.tisue.euler.Problem59    net.tisue.euler.Problem6     net.tisue.euler.Problem60
net.tisue.euler.Problem61    net.tisue.euler.Problem62    net.tisue.euler.Problem63
net.tisue.euler.Problem64    net.tisue.euler.Problem65    net.tisue.euler.Problem66
net.tisue.euler.Problem67    net.tisue.euler.Problem68    net.tisue.euler.Problem69
net.tisue.euler.Problem7     net.tisue.euler.Problem70    net.tisue.euler.Problem71
net.tisue.euler.Problem72    net.tisue.euler.Problem73    net.tisue.euler.Problem74
net.tisue.euler.Problem75    net.tisue.euler.Problem76    net.tisue.euler.Problem77
net.tisue.euler.Problem78    net.tisue.euler.Problem79    net.tisue.euler.Problem8
net.tisue.euler.Problem80    net.tisue.euler.Problem81    net.tisue.euler.Problem82
net.tisue.euler.Problem83    net.tisue.euler.Problem84    net.tisue.euler.Problem85
net.tisue.euler.Problem86    net.tisue.euler.Problem87    net.tisue.euler.Problem88
net.tisue.euler.Problem89    net.tisue.euler.Problem90    net.tisue.euler.Problem91
net.tisue.euler.Problem92    net.tisue.euler.Problem93    net.tisue.euler.Problem94
net.tisue.euler.Problem95    net.tisue.euler.Problem96    net.tisue.euler.Problem97
net.tisue.euler.Problem98    net.tisue.euler.Problem99

NoClassDefFoundError: JSchException on update

When I add a call to Resolver.ssh to my build file I get the following exception when running update on SBT 0.9.7:

{file:/media/internal0/home/ijuma/tmp/sbt-bug/}root/*:update: java.lang.NoClassDefFoundError: com/jcraft/jsch/JSchException

Here's an example build file:

import sbt._

object MainBuild extends Build {
  lazy val projects = Seq(root)

  lazy val root = Project("root", file("."),
    settings = Defaults.defaultSettings ++ Seq(Keys.resolvers += Resolver.ssh("foo", "bar")
  ))
}

'update' should not be invoked unless there are build changes

'update' should not be invoked unless there are build changes. A build file that shows the issue:

import sbt._
import Keys._

object FooBuild extends Build {

  lazy val root = Project("root", file("."), settings = Defaults.defaultSettings) aggregate(
    common)

  def projectSettings = Defaults.defaultSettings ++ Seq(
    libraryDependencies ++= deps.toSeq,
    scalaVersion := "2.9.0-1"
  )

  lazy val common = Project("common", file("likecube-common"),
    settings = projectSettings
  )

  lazy val deps = Set(
    "commons-io" % "commons-io" % "2.0.1",
    "joda-time" % "joda-time" % "1.6.2",
    "log4j" % "log4j" % "1.2.16",
    "com.google.guava" % "guava" % "r09",
    "net.sf.opencsv" % "opencsv" % "2.1"
  )
}

See what happens:

[ijuma@localhost]~/tmp/sbt-bug-4% sbt-dev
[info] Compiling 1 Scala source to /media/internal0/home/ijuma/tmp/sbt-bug-4/project/target/scala_2.8.1/classes...
[info] Set current project to root (in build file:/media/internal0/home/ijuma/tmp/sbt-bug-4/)

compile
[info] Updating...
[info] Done updating.
[success] Total time: 1 s, completed 19-Jun-2011 20:04:14
exit
[ijuma@localhost]~/tmp/sbt-bug-4% sbt-dev
[info] Set current project to root (in build file:/media/internal0/home/ijuma/tmp/sbt-bug-4/)
compile
[info] Updating...
[info] Done updating.
[success] Total time: 1 s, completed 19-Jun-2011 20:04:22

Interestingly, this goes away if I change the deps Set to Seq.

Spurious recompilation in multiproject builds with external subprojects.

I'm finding some strange behavior with the new external multiproject support. I have two projects, A and B which both dependOn external project C using RootProject("../c").

If I go to project A and compile it, C is also compiled, and all is well. However, if I then go to project B and compile it, this also causes C to be entirely recompiled. This of course is awful, because C takes a couple of minutes to compile and this happens whenever I switch between A and B.

Here is an example of build output related to the attached projects:

knuttycombe@floorshow sbt (master)]$ ls
a b c
[knuttycombe@floorshow sbt (master)]$ cd c/
[knuttycombe@floorshow c (master)]$ sbt compile
Getting net.java.dev.jna jna 3.2.3 ...
:: retrieving :: org.scala-tools.sbt#boot-app
confs: [default]
1 artifacts copied, 0 already retrieved (838kB/80ms)
Getting Scala 2.8.1 (for sbt)...
:: retrieving :: org.scala-tools.sbt#boot-scala
confs: [default]
4 artifacts copied, 0 already retrieved (15296kB/873ms)
Getting org.scala-tools.sbt sbt_2.8.1 0.10.0 ...
:: retrieving :: org.scala-tools.sbt#boot-app
confs: [default]
34 artifacts copied, 0 already retrieved (6012kB/794ms)
[info] Set current project to default (in build file:/Users/knuttycombe/tmp/sbt/c/)
[info] Updating...
[info] Done updating.
[info] Compiling 1 Scala source to /Users/knuttycombe/tmp/sbt/c/target/scala-2.8.1.final/classes...
[success] Total time: 3 s, completed Jun 4, 2011 9:46:53 PM
[knuttycombe@floorshow c (master)]$ cd ../b
[knuttycombe@floorshow b (master)]$ sbt compile
Getting net.java.dev.jna jna 3.2.3 ...
:: retrieving :: org.scala-tools.sbt#boot-app
confs: [default]
1 artifacts copied, 0 already retrieved (838kB/19ms)
Getting Scala 2.8.1 (for sbt)...
:: retrieving :: org.scala-tools.sbt#boot-scala
confs: [default]
4 artifacts copied, 0 already retrieved (15296kB/248ms)
Getting org.scala-tools.sbt sbt_2.8.1 0.10.0 ...
:: retrieving :: org.scala-tools.sbt#boot-app
confs: [default]
34 artifacts copied, 0 already retrieved (6012kB/63ms)
[info] Compiling 1 Scala source to /Users/knuttycombe/tmp/sbt/b/project/target/scala_2.8.1/classes...
[info] Set current project to b (in build file:/Users/knuttycombe/tmp/sbt/b/)
[info] Updating...
[info] Compiling 1 Scala source to /Users/knuttycombe/tmp/sbt/c/target/scala-2.8.1.final/classes...
[info] Done updating.
[info] Compiling 1 Scala source to /Users/knuttycombe/tmp/sbt/b/target/scala-2.8.1.final/classes...
[success] Total time: 3 s, completed Jun 4, 2011 9:47:16 PM
[knuttycombe@floorshow b (master)]$ cd ../a
[knuttycombe@floorshow a (master)]$ sbt compile
Getting net.java.dev.jna jna 3.2.3 ...
:: retrieving :: org.scala-tools.sbt#boot-app
confs: [default]
1 artifacts copied, 0 already retrieved (838kB/17ms)
Getting Scala 2.8.1 (for sbt)...
:: retrieving :: org.scala-tools.sbt#boot-scala
confs: [default]
4 artifacts copied, 0 already retrieved (15296kB/236ms)
Getting org.scala-tools.sbt sbt_2.8.1 0.10.0 ...
:: retrieving :: org.scala-tools.sbt#boot-app
confs: [default]
34 artifacts copied, 0 already retrieved (6012kB/65ms)
[info] Compiling 1 Scala source to /Users/knuttycombe/tmp/sbt/a/project/target/scala_2.8.1/classes...
[info] Set current project to a (in build file:/Users/knuttycombe/tmp/sbt/a/)
[info] Updating...
[info] Compiling 1 Scala source to /Users/knuttycombe/tmp/sbt/c/target/scala-2.8.1.final/classes...
[info] Done updating.
[info] Compiling 1 Scala source to /Users/knuttycombe/tmp/sbt/a/target/scala-2.8.1.final/classes...
[success] Total time: 3 s, completed Jun 4, 2011 9:47:41 PM
[knuttycombe@floorshow a (master)]$ cd ../b/
[knuttycombe@floorshow b (master)]$ sbt compile
[info] Set current project to b (in build file:/Users/knuttycombe/tmp/sbt/b/)
[info] Compiling 1 Scala source to /Users/knuttycombe/tmp/sbt/c/target/scala-2.8.1.final/classes...
[success] Total time: 6 s, completed Jun 4, 2011 9:47:58 PM
[knuttycombe@floorshow b (master)]$

Something interesting to note: although c is recompiled when I switch back to b, the classes in b that depend on c are not!

Global .sbt files for settings

For global plugins it would be nice to have global, user-defined settings. For example, the posterous-sbt plugin has settings posterousEmail and posterousPassword that the user must define somewhere before sbt can boot with the plugin on the classpath.

Currently, the recommendation is for users to have a file ~/.sbt/plugins/user.scala that defines the settings manually:

import sbt._
import posterous.Publish._

object User extends Plugin {
  override def settings = Seq(
    posterousEmail := "[email protected]",
    posterousPassword := "yourpassword"
  )
}

Alternatively, you could define these in a user.sbt within every project:

posterousEmail := "[email protected]",
posterousPassword := "yourpassword"

It would be great if we could place a file like this in ~/.sbt/ or some other location and have it be loaded for every project.

Local Maven Repository syntax does not work

I am using sbt 0.10.0.

I installed Netty snapshot into my local Maven repository.

I have these lines in build.sbt:
resolvers += "Local Maven Repository" at "file://" + Path.userHome + "/.m2/repository"
libraryDependencies += "org.jboss.netty" % "netty" % "4.0.0.Alpha1-SNAPSHOT"

But "sbt update" cannot find Netty's jar file.

The log says that sbt has tried this URL:
file://sbt.RichFile@1f80cb01/.m2/repository/org/jboss/netty/netty/4.0.0.Alpha1-SNAPSHOT/netty-4.0.0.Alpha1-SNAPSHOT.jar

I think "file://sbt.RichFile@1f80cb01/.m2/repository..." is not correct. I think the problem is at Path.userHome.

Introduce quietErrorSummary setting and use it in compile task

Mark said:

" It can probably be done like aggregation, with a quietErrorSummary setting that can be set per-task and the summarizing code checks the setting for each task in the list. 'compile' can have it quiet by default."

The use-case that motivated this is the compile task. An example of output:

[error] /media/ssd1/src/sbt-idea/sbt-idea-core/src/main/scala/com/github/mpeltonen/SbtIdeaPlugin.scala:10: ')' expected but 'val' found.
[error] val structure = extracted.structure
[error] ^
[error] one error found
[error] Incomplete tasks (run 'last ' for the full log):
[error] {file:/media/ssd1/src/sbt-idea/}core/compile: Compilation failed
[error] Total time: 0 s, completed 02-Jun-2011 19:05:51

The "Incomplete tasks.." message doesn't add much value and it would be good to exclude it for something as common as reporting of compiler errors.

This was discussed here:
https://groups.google.com/d/topic/simple-build-tool/zik0-_uk4r4/discussion

Cannot compile SBT 0.10.0: OutOfMemoryError: PermGen space

There are no jar files published for SBT 0.10.0 so I downloaded the source tarball from the github "Downloads" button. I tried to compile, but the compile ended with:

[info] == Tracking / package ==
[info] Packaging ./cache/tracking/target/scala_2.8.1/tracking_2.8.1-0.10.0.jar ...
[info] Packaging complete.
[info] == Tracking / package ==
[error] Error running compile: java.lang.OutOfMemoryError: PermGen space
[error] Error running compile: java.lang.OutOfMemoryError: PermGen space
[error] Error running compile: java.lang.OutOfMemoryError: PermGen space
[error] Error running compile: java.lang.OutOfMemoryError: PermGen space
[error] Error running compile: java.lang.OutOfMemoryError: PermGen space
[error] Error running compile: java.lang.OutOfMemoryError: PermGen space
[error] Error running publish-local: java.lang.OutOfMemoryError: PermGen space
[error] Error running publish-local: java.lang.OutOfMemoryError: PermGen space
[error] Error running compile: java.lang.OutOfMemoryError: PermGen space
[error] Error running publish-local: java.lang.OutOfMemoryError: PermGen space
[error] Error running deliver-local: java.lang.OutOfMemoryError: PermGen space
[error] Error running publish-local: java.lang.OutOfMemoryError: PermGen space
[error] Error running compile: java.lang.OutOfMemoryError: PermGen space
[error] Error running compile: java.lang.OutOfMemoryError: PermGen space
[info] 
[info] Total time: 267 s, completed Jun 15, 2011 10:12:24 PM
[info] 
[info] Total session time: 366 s, completed Jun 15, 2011 10:12:24 PM
[error] Error during build.

jks@jks-desktop /tmp/harrah-xsbt-f38f599]{f13}$ java -version
java version "1.6.0_23"
Java(TM) SE Runtime Environment (build 1.6.0_23-b05)
Java HotSpot(TM) 64-Bit Server VM (build 19.0-b09, mixed mode)
[jks@jks-desktop /tmp/harrah-xsbt-f38f599]{f13}$ scala -version
Scala code runner version 2.9.0.1 -- Copyright 2002-2011, LAMP/EPFL

The current version of sbt installed on my system is 0.7.7

Incremental compilation/dependency analysis broken when using jna

I have a class that uses jna. It gets recompiled every time, regardless of whether anything has changed. I tracked it down to a the dependency graph getting "confused". The problem is some of the jna classes get resolved to the sbt-launcher jna jar:
project/boot/other/net.java.dev.jna/jna/3.2.3/jna-3.2.3.jar

This happens in sbt.Analyze:
for(clazz <- loaded; file <- ErrorHandling.convert(IO.classLocationFile(clazz)).right)

IO.classLocationFile(clazz) returns the boot/other jar for com.sun.jna.Native and some others.

It seems like classLocationFile should only consider the explicit compile classpath...

This is a pretty big blocker for me to move to 0.9.x, since my class happens to be a root dependency for a large project.

source generation hooks?

Hi--

(This is for 0.10.0.)

I think we need a bit more help with the sourceGenerator hooks for those of us who'd like to integrate the use of (say) templating languages, or coffeescript, or what-have-you into our builds.

I'd really love to see a Plugin example, for instance, that would give us some tips about hooking in source files such that sbt automatically detects which ones of changed and invokes a task to compile them. Or however such things have been done.

Looking at plugins for the older sbt (0.7.x) has been really helpful in learning how not to misuse the system, at least for me.

Thanks!

Some context:

https://groups.google.com/d/topic/simple-build-tool/Fo1uhhSXgrs/discussion

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.