diff --git a/cmd/guess_deps.go b/cmd/guess_deps.go
index 97bf7db..f637c7c 100644
--- a/cmd/guess_deps.go
+++ b/cmd/guess_deps.go
@@ -2,7 +2,6 @@
 
 import (
 	"github.com/Masterminds/cookoo"
-	"go/build"
 	"os"
 	"strings"
 )
@@ -12,9 +11,13 @@
 // Params
 // 	- dirname (string): Directory to use as the base. Default: "."
 func GuessDeps(c cookoo.Context, p *cookoo.Params) (interface{}, cookoo.Interrupt) {
+	buildContext, err := GetBuildContext()
+	if err != nil {
+		return nil, err
+	}
 	base := p.Get("dirname", ".").(string)
 	deps := make(map[string]bool)
-	err := findDeps(deps, base, "")
+	err = findDeps(buildContext, deps, base, "")
 	deps = compactDeps(deps)
 	delete(deps, base)
 	if err != nil {
@@ -24,7 +27,7 @@
 	config := new(Config)
 
 	// Get the name of the top level package
-	config.Name = guessPackageName(base)
+	config.Name = guessPackageName(buildContext, base)
 	config.Imports = make([]*Dependency, len(deps))
 	i := 0
 	for pa := range deps {
@@ -45,13 +48,13 @@
 // As of Go 1.5 the go command knows about the vendor directory but the go/build
 // package does not. It only knows about the GOPATH and GOROOT. In order to look
 // for packages in the vendor/ directory we need to fake it for now.
-func findDeps(soFar map[string]bool, name, vpath string) error {
+func findDeps(b *BuildCtxt, soFar map[string]bool, name, vpath string) error {
 	cwd, err := os.Getwd()
 	if err != nil {
 		return err
 	}
 
-	pkg, err := build.Import(name, cwd, 0)
+	pkg, err := b.Import(name, cwd, 0)
 	if err != nil {
 		return err
 	}
@@ -79,8 +82,8 @@
 
 			// Try looking for a dependency as a vendor. If it's not there then
 			// fall back to a way where it will be found in the GOPATH or GOROOT.
-			if err := findDeps(soFar, vpath+"/vendor/"+imp, vpath); err != nil {
-				if err := findDeps(soFar, imp, vpath); err != nil {
+			if err := findDeps(b, soFar, vpath+"/vendor/"+imp, vpath); err != nil {
+				if err := findDeps(b, soFar, imp, vpath); err != nil {
 					return err
 				}
 			}
@@ -106,13 +109,13 @@
 
 // Attempt to guess at the package name at the top level. When unable to detect
 // a name goes to default of "main".
-func guessPackageName(base string) string {
+func guessPackageName(b *BuildCtxt, base string) string {
 	cwd, err := os.Getwd()
 	if err != nil {
 		return "main"
 	}
 
-	pkg, err := build.Import(base, cwd, 0)
+	pkg, err := b.Import(base, cwd, 0)
 	if err != nil {
 		return "main"
 	}
diff --git a/cmd/tree.go b/cmd/tree.go
index 885f34a..98435fd 100644
--- a/cmd/tree.go
+++ b/cmd/tree.go
@@ -3,7 +3,6 @@
 import (
 	"errors"
 	"fmt"
-	"go/build"
 	"os"
 	"path/filepath"
 	"sort"
@@ -16,9 +15,13 @@
 
 // Tree prints a tree representing dependencies.
 func Tree(c cookoo.Context, p *cookoo.Params) (interface{}, cookoo.Interrupt) {
+	buildContext, err := GetBuildContext()
+	if err != nil {
+		return nil, err
+	}
 	showcore := p.Get("showcore", false).(bool)
 	basedir := p.Get("dir", ".").(string)
-	myName := guessPackageName(basedir)
+	myName := guessPackageName(buildContext, basedir)
 
 	if basedir == "." {
 		var err error
@@ -30,7 +33,7 @@
 	}
 
 	fmt.Println(myName)
-	displayTree(basedir, myName, 1, showcore)
+	displayTree(buildContext, basedir, myName, 1, showcore)
 	return nil, nil
 }
 
@@ -41,19 +44,22 @@
 // Returns:
 //
 func ListDeps(c cookoo.Context, p *cookoo.Params) (interface{}, cookoo.Interrupt) {
+	buildContext, err := GetBuildContext()
+	if err != nil {
+		return nil, err
+	}
 	basedir := p.Get("dir", ".").(string)
-	myName := guessPackageName(basedir)
+	myName := guessPackageName(buildContext, basedir)
 
-	var err error
 	basedir, err = filepath.Abs(basedir)
 	if err != nil {
 		return nil, err
 	}
 
 	direct := map[string]bool{}
-	d := walkDeps(basedir, myName)
+	d := walkDeps(buildContext, basedir, myName)
 	for _, i := range d {
-		listDeps(direct, i, basedir)
+		listDeps(buildContext, direct, i, basedir)
 	}
 
 	sortable := make([]string, len(direct))
@@ -76,8 +82,8 @@
 	return nil, nil
 }
 
-func listDeps(info map[string]bool, name, path string) {
-	found := findPkg(name, path)
+func listDeps(b *BuildCtxt, info map[string]bool, name, path string) {
+	found := findPkg(b, name, path)
 	switch found.PType {
 	case ptypeUnknown:
 		info[name] = false
@@ -86,16 +92,16 @@
 		break
 	default:
 		info[name] = true
-		for _, i := range walkDeps(found.Path, found.Name) {
-			listDeps(info, i, found.Path)
+		for _, i := range walkDeps(b, found.Path, found.Name) {
+			listDeps(b, info, i, found.Path)
 		}
 	}
 }
 
-func displayTree(basedir, myName string, level int, core bool) {
-	deps := walkDeps(basedir, myName)
+func displayTree(b *BuildCtxt, basedir, myName string, level int, core bool) {
+	deps := walkDeps(b, basedir, myName)
 	for _, name := range deps {
-		found := findPkg(name, basedir)
+		found := findPkg(b, name, basedir)
 		if found.PType == ptypeUnknown {
 			msg := "glide get " + found.Name
 			fmt.Printf("\t%s\t(%s)\n", found.Name, msg)
@@ -106,7 +112,7 @@
 		}
 		fmt.Print(strings.Repeat("\t", level))
 		fmt.Printf("%s   (%s)\n", found.Name, found.Path)
-		displayTree(found.Path, found.Name, level+1, core)
+		displayTree(b, found.Path, found.Name, level+1, core)
 	}
 }
 
@@ -125,7 +131,7 @@
 	PType      ptype
 }
 
-func findPkg(name, cwd string) *pinfo {
+func findPkg(b *BuildCtxt, name, cwd string) *pinfo {
 	var fi os.FileInfo
 	var err error
 	var p string
@@ -144,7 +150,7 @@
 		}
 	}
 	// Check $GOPATH
-	for _, r := range strings.Split(os.Getenv("GOPATH"), ":") {
+	for _, r := range strings.Split(b.GOPATH, ":") {
 		p = filepath.Join(r, "src", name)
 		if fi, err = os.Stat(p); err == nil && (fi.IsDir() || isLink(fi)) {
 			info.Path = p
@@ -154,7 +160,7 @@
 	}
 
 	// Check $GOROOT
-	for _, r := range strings.Split(os.Getenv("GOROOT"), ":") {
+	for _, r := range strings.Split(b.GOROOT, ":") {
 		p = filepath.Join(r, "src", name)
 		if fi, err = os.Stat(p); err == nil && (fi.IsDir() || isLink(fi)) {
 			info.Path = p
@@ -169,7 +175,7 @@
 	return fi.Mode()&os.ModeSymlink == os.ModeSymlink
 }
 
-func walkDeps(base, myName string) []string {
+func walkDeps(b *BuildCtxt, base, myName string) []string {
 	externalDeps := []string{}
 	filepath.Walk(base, func(path string, fi os.FileInfo, err error) error {
 		if excludeSubtree(path, fi) {
@@ -178,7 +184,8 @@
 			}
 			return nil
 		}
-		pkg, err := build.ImportDir(path, 0)
+
+		pkg, err := b.ImportDir(path, 0)
 		if err != nil {
 			return err
 		}
diff --git a/cmd/util.go b/cmd/util.go
index b445f2d..20960fc 100644
--- a/cmd/util.go
+++ b/cmd/util.go
@@ -2,11 +2,13 @@
 
 import (
 	"fmt"
+	"go/build"
 	"io"
 	"os"
 	"os/exec"
 	"path"
 	"path/filepath"
+	"strings"
 
 	"github.com/Masterminds/cookoo"
 )
@@ -122,6 +124,27 @@
 	return ps
 }
 
+// Convenience wrapper for not having to import go/build anywhere else
+type BuildCtxt struct {
+	build.Context
+}
+
+// GetBuildContext returns a build context from go/build. When the $GOROOT
+// variable is not set in the users environment it sets the context's root
+// path to the path returned by 'go env GOROOT'.
+func GetBuildContext() (*BuildCtxt, error) {
+	buildContext := &BuildCtxt{build.Default}
+	if goRoot := os.Getenv("GOROOT"); len(goRoot) == 0 {
+		out, err := exec.Command("go", "env", "GOROOT").Output()
+		if goRoot = strings.TrimSpace(string(out)); len(goRoot) == 0 || err != nil {
+			return nil, fmt.Errorf("Please set the $GOROOT environment " +
+				"variable to use this command\n")
+		}
+		buildContext.GOROOT = goRoot
+	}
+	return buildContext, nil
+}
+
 func fileExist(name string) (bool, error) {
 	_, err := os.Stat(name)
 	if err == nil {
