sbtmkdirs: A shell script to create a Scala SBT project directory structure

This is a simple shell script to build a Scala SBT project directory structure. Here’s the shell script in its current incarnation:

#!/bin/bash

#------------------------------------------------------------------------------
# Name:    sbtmkdirs
# Version: 1.4
# Purpose: Create an SBT project directory structure with a few simple options.
# Author:  Alvin Alexander, http://alvinalexander.com
# License: Creative Commons Attribution-ShareAlike 2.5 Generic
#          http://creativecommons.org/licenses/by-sa/2.5/
#------------------------------------------------------------------------------
declare -r TRUE=0
declare -r FALSE=1

# takes a string and returns true if it seems to represent "yes"
function isYes() {
  local x=$1
  [ $x = "y" ] && echo $TRUE; return
  [ $x = "Y" ] && echo $TRUE; return
  [ $x = "yes" ] && echo $TRUE; return
echo $FALSE
}

echo "This script creates an SBT project directory beneath the current directory."

while [ $TRUE ]; do

echo ""
  read -p "Directory/Project Name (MyFirstProject): " directoryName
  directoryName=${directoryName:-MyFirstProject}

  read -p "Create .gitignore File? (Y/n): " createGitignore
  createGitignore=${createGitignore:-y}

  read -p "Create README.md File? (Y/n): " createReadme
  createReadme=${createReadme:-y}

  echo ""
  echo "-----------------------------------------------"
  echo "Directory/Project Name: $directoryName"
  echo "Create .gitignore File?: $createGitignore"
  echo "Create README.md File?: $createReadme"
  echo "-----------------------------------------------"
  read -p "Create Project? (Y/n): " createProject
  createProject=${createProject:-y}
  [ "$(isYes $createProject)" = "$TRUE" ] && break

done

mkdir -p ${directoryName}/src/{main,test}/{java,resources,scala}
mkdir ${directoryName}/lib ${directoryName}/project ${directoryName}/target

# optional
#mkdir -p ${directoryName}/src/main/config
#mkdir -p ${directoryName}/src/{main,test}/{filters,assembly}
#mkdir -p ${directoryName}/src/site

#---------------------------------
# create an initial build.sbt file
#---------------------------------
echo "name := \"$directoryName\"

version := \"1.0\"

scalaVersion := \"2.12.2\"

resolvers += \"Typesafe Repository\" at \"http://repo.typesafe.com/typesafe/releases/\"

libraryDependencies += \"com.typesafe.akka\" %% \"akka-actor\" % \"2.5.2\"

scalacOptions += \"-deprecation\"

" > ${directoryName}/build.sbt

#------------------------------
# create .gitignore, if desired
#------------------------------
if [ "$(isYes $createGitignore)" = "$TRUE" ]; then
echo "bin/
project/
target/
build/
.cache
.cache-main
.classpath
.history
.project
.scala_dependencies
.settings
.worksheet
.DS_Store
*.class
*.log
*.iml
*.ipr
*.iws
.idea" > ${directoryName}/.gitignore
fi

#-----------------------------
# create README.me, if desired
#-----------------------------
if [ "$(isYes $createReadme)" = "$TRUE" ]; then
touch ${directoryName}/README.md
fi

echo ""
echo "Project created. See the following URL for build.sbt examples:"
echo "http://alvinalexander.com/scala/sbt-syntax-examples"

Installing and using

I put this code in a file named sbtmkdirs, made it executable, put it in my ~/bin directory, and now use it to create new SBT project directories. As you can see from the source, just run the script and it will prompt you with a few questions.

Here's what a quick example run looks like:

/Users/Al/Projects> sbtmkdirs 
This script creates an SBT project directory beneath the current directory.

Directory/Project Name (MyFirstProject): MyProject
Create .gitignore File? (Y/n): [enter]
Create README.md File? (Y/n): [enter]

-----------------------------------------------
Directory/Project Name: MyProject
Create .gitignore File?: y
Create README.md File?: y
-----------------------------------------------
Create Project? (Y/n): [enter]

Project created. See the following URL for build.sbt examples:
http://alvinalexander.com/scala/sbt-syntax-examples

As you can tell from the script, it creates a directory structure that looks like this:

MyProject
|--- README.md
|--- build.sbt
|--- lib
|--- project
|--- src
│   |--- main
│   │   |--- java
│   │   |--- resources
│   │   +-- scala
│   +-- test
│       |--- java
│       |--- resources
│       +-- scala
+-- target

Get it as a Gist

I just put this code on Github. You can find it as a Gist here:

Add new comment

Anonymous format

  • Allowed HTML tags: <em> <strong> <cite> <code> <ul type> <ol start type> <li> <pre>
  • Lines and paragraphs break automatically.