However, these minor differences can slow down things a bit. For one thing, previous versions of SBT asked if you wanted to create a project if run on an empty directory, and that does not happen anymore. Now it creates some stuff automatically, but other stuff -- project name, version, scala version, directory layout -- it doesn't. So, let's take a quick look on how to accomplish (roughly) the same tasks.
In the example below, I named my SBT 0.10.0 script xsbt, so that I could use the older 0.7.7 with projects that are not yet migrated.
dcs@ayanami:~/github$ mkdir TestProject dcs@ayanami:~/github$ cd TestProject dcs@ayanami:~/github/TestProject$ 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/35ms) Getting Scala 2.8.1 (for sbt)... :: retrieving :: org.scala-tools.sbt#boot-scala confs: [default] 4 artifacts copied, 0 already retrieved (15296kB/232ms) 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/215ms) [info] Set current project to root (in build file:/home/dcs/.sbt/plugins/) [info] Set current project to default (in build file:/home/dcs/github/TestProject/) > set name := "TestProject" [info] Reapplying settings... [info] Set current project to default (in build file:/home/dcs/github/TestProject/) > set version := "1.0" [info] Reapplying settings... [info] Set current project to default (in build file:/home/dcs/github/TestProject/) > set scalaVersion := "2.9.0-1" [info] Reapplying settings... Getting Scala 2.9.0-1 ... :: retrieving :: org.scala-tools.sbt#boot-scala confs: [default] 4 artifacts copied, 0 already retrieved (20447kB/186ms) [info] Set current project to default (in build file:/home/dcs/github/TestProject/) > session save [info] Reapplying settings... [info] Set current project to default (in build file:/home/dcs/github/TestProject/) > exit dcs@ayanami:~/github/TestProject$ find . -type d . ./project ./project/target ./project/target/config-classes ./project/target/scala_2.8.1 ./project/boot ./project/boot/other ./project/boot/other/net.java.dev.jna ./project/boot/other/net.java.dev.jna/jna ./project/boot/other/net.java.dev.jna/jna/3.2.3 ./project/boot/scala-2.9.0-1 ./project/boot/scala-2.9.0-1/lib ./project/boot/scala-2.8.1 ./project/boot/scala-2.8.1/lib ./project/boot/scala-2.8.1/org.scala-tools.sbt ./project/boot/scala-2.8.1/org.scala-tools.sbt/sbt ./project/boot/scala-2.8.1/org.scala-tools.sbt/sbt/0.10.0 ./project/boot/scala-2.8.1/org.scala-tools.sbt/sbt/0.10.0/compiler-interface-bin_2.7.7.final ./project/boot/scala-2.8.1/org.scala-tools.sbt/sbt/0.10.0/compiler-interface-src ./project/boot/scala-2.8.1/org.scala-tools.sbt/sbt/0.10.0/compiler-interface-bin_2.9.0.final ./project/boot/scala-2.8.1/org.scala-tools.sbt/sbt/0.10.0/compiler-interface-bin_2.8.1.final ./project/boot/scala-2.8.1/org.scala-tools.sbt/sbt/0.10.0/xsbti ./target ./target/streams ./target/streams/$global ./target/streams/$global/$global ./target/streams/$global/$global/streams ./target/streams/$global/$global/streams/$global dcs@ayanami:~/github/TestProject$ ls build.sbt project target dcs@ayanami:~/github/TestProject$ cat build.sbt name := "TestProject" version := "1.0" scalaVersion := "2.9.0-1"
So far so good, but note that the directories for source are not created. The new version of SBT expects your IDE to do that (which is rather annoying for us vim users), or so it seems. However, the eclipse plugin can do that at the same time it creates the eclipse project. Here's an example:
dcs@ayanami:~/github/TestProject$ cat ~/.sbt/plugins/build.sbt resolvers += { val typesafeRepoUrl = new java.net.URL("http://repo.typesafe.com/typesafe/releases") val pattern = Patterns(false, "[organisation]/[module]/[sbtversion]/[revision]/[type]s/[module](-[classifier])-[revision].[ext]") Resolver.url("Typesafe Repository", typesafeRepoUrl)(pattern) } libraryDependencies <<= (libraryDependencies, sbtVersion) { (deps, version) => deps :+ ("com.typesafe.sbteclipse" %% "sbteclipse" % "1.1" extra("sbtversion" -> version)) } dcs@ayanami:~/github/TestProject$ xsbt [info] Compiling 1 Scala source to /home/dcs/.sbt/plugins/project/target/scala_2.8.1/classes... [info] Set current project to root (in build file:/home/dcs/.sbt/plugins/) [info] Compiling 8 Scala sources to /home/dcs/.sbt/staging/a69240767cc8e721757e/target/scala-2.8.1.final/classes... [info] Set current project to default (in build file:/home/dcs/github/TestProject/) > eclipse create-src [info] Updating... [info] Done updating. [info] Successfully created Eclipse project files. Please select the appropriate Eclipse plugin for Scala 2.9.0-1! > exit dcs@ayanami:~/github/TestProject$ find . -type d . ./project ./project/target ./project/target/config-classes ./project/target/scala_2.8.1 ./project/boot ./project/boot/other ./project/boot/other/net.java.dev.jna ./project/boot/other/net.java.dev.jna/jna ./project/boot/other/net.java.dev.jna/jna/3.2.3 ./project/boot/scala-2.9.0-1 ./project/boot/scala-2.9.0-1/lib ./project/boot/scala-2.8.1 ./project/boot/scala-2.8.1/lib ./project/boot/scala-2.8.1/org.scala-tools.sbt ./project/boot/scala-2.8.1/org.scala-tools.sbt/sbt ./project/boot/scala-2.8.1/org.scala-tools.sbt/sbt/0.10.0 ./project/boot/scala-2.8.1/org.scala-tools.sbt/sbt/0.10.0/compiler-interface-bin_2.7.7.final ./project/boot/scala-2.8.1/org.scala-tools.sbt/sbt/0.10.0/compiler-interface-src ./project/boot/scala-2.8.1/org.scala-tools.sbt/sbt/0.10.0/compiler-interface-bin_2.9.0.final ./project/boot/scala-2.8.1/org.scala-tools.sbt/sbt/0.10.0/compiler-interface-bin_2.8.1.final ./project/boot/scala-2.8.1/org.scala-tools.sbt/sbt/0.10.0/xsbti ./target ./target/streams ./target/streams/$global ./target/streams/$global/ivy-sbt ./target/streams/$global/ivy-sbt/$global ./target/streams/$global/ivy-configuration ./target/streams/$global/ivy-configuration/$global ./target/streams/$global/update ./target/streams/$global/update/$global ./target/streams/$global/project-descriptors ./target/streams/$global/project-descriptors/$global ./target/streams/$global/$global ./target/streams/$global/$global/streams ./target/streams/$global/$global/streams/$global ./target/scala-2.9.0.1 ./target/scala-2.9.0.1/cache ./target/scala-2.9.0.1/cache/update ./src ./src/main ./src/main/resources ./src/main/java ./src/main/scala ./src/test ./src/test/resources ./src/test/java ./src/test/scala
That's it! I strongly recommend reading the wiki linked at the beginning of this post, but this will get you going for small stuff.
Alternative way to create source dirs:
ReplyDeletemkdir -p src/{main,test}/{scala,java,resources}
Like !
DeleteNice find on the eclipse script! Also if you want vim to create files in directories that aren't yet there, just add this script to your .vimrc:
ReplyDeletehttp://www.ibm.com/developerworks/linux/library/l-vim-script-5/#N105B6
Then if you type: vim src/main/scala/MyClass.scala or :e src/main/scala/MyClass.scala it will prompt you if you'd like to create the directories
Alternatively create a script called xprojsrc in your sbt directory (in PATH) and add the following contents to it
ReplyDelete#! /bin/bash
f=$(pwd) # 'pwd' is setting "present working directory"
mkdir -p src/{main,test}/{scala,java,resources}
echo "object Hi { def main(args: Array[String]) { println(\"Hi!\") } }" > src/main/scala/Main.scala
chmod +x xprojsrc
Now execute the script from your project root
This should create the src tree
Drop console into the sbt shell and execute 'update', followed by 'run'