diff --git a/cmd/flatten.go b/cmd/flatten.go
index 74aff62..746c083 100644
--- a/cmd/flatten.go
+++ b/cmd/flatten.go
@@ -231,54 +231,58 @@
 // for dependencies. So generally it should be the last merge strategy
 // that you try.
 func mergeGuess(dir, pkg string, deps map[string]*Dependency) ([]string, bool) {
-	Info("Scanning %s for dependencies.", pkg)
-	buildContext, err := GetBuildContext()
-	if err != nil {
-		Warn("Could not scan package %q: %s", pkg, err)
-		return []string{}, false
-	}
+	/*
+			Info("Scanning %s for dependencies.", pkg)
+			buildContext, err := GetBuildContext()
+			if err != nil {
+				Warn("Could not scan package %q: %s", pkg, err)
+				return []string{}, false
+			}
 
-	res := []string{}
+			res := []string{}
 
-	if _, err := os.Stat(dir); err != nil {
-		Warn("Directory is missing: %s", dir)
+			if _, err := os.Stat(dir); err != nil {
+				Warn("Directory is missing: %s", dir)
+				return res, true
+			}
+
+			d := walkDeps(buildContext, dir, pkg)
+			for _, name := range d {
+				name, _ := NormalizeName(name)
+				repo := getRepoRootFromPackage(name)
+				if _, ok := deps[name]; ok {
+					Debug("====> Seen %s already. Skipping", name)
+					continue
+				}
+
+				found := findPkg(buildContext, name, dir)
+				switch found.PType {
+				case ptypeUnknown:
+					Debug("✨☆ Undownloaded dependency: %s", name)
+					nd := &Dependency{
+						Name:       name,
+						Repository: "https://" + repo,
+					}
+					deps[name] = nd
+					res = append(res, name)
+				case ptypeGoroot, ptypeCgo:
+					break
+				default:
+					// We're looking for dependencies that might exist in $GOPATH
+					// but not be on vendor. We add any that are on $GOPATH.
+					if _, ok := deps[name]; !ok {
+						Debug("✨☆ GOPATH dependency: %s", name)
+						nd := &Dependency{Name: name}
+						deps[name] = nd
+						res = append(res, name)
+					}
+				}
+			}
+
 		return res, true
-	}
-
-	d := walkDeps(buildContext, dir, pkg)
-	for _, name := range d {
-		name, _ := NormalizeName(name)
-		repo := getRepoRootFromPackage(name)
-		if _, ok := deps[name]; ok {
-			Debug("====> Seen %s already. Skipping", name)
-			continue
-		}
-
-		found := findPkg(buildContext, name, dir)
-		switch found.PType {
-		case ptypeUnknown:
-			Debug("✨☆ Undownloaded dependency: %s", name)
-			nd := &Dependency{
-				Name:       name,
-				Repository: "https://" + repo,
-			}
-			deps[name] = nd
-			res = append(res, name)
-		case ptypeGoroot, ptypeCgo:
-			break
-		default:
-			// We're looking for dependencies that might exist in $GOPATH
-			// but not be on vendor. We add any that are on $GOPATH.
-			if _, ok := deps[name]; !ok {
-				Debug("✨☆ GOPATH dependency: %s", name)
-				nd := &Dependency{Name: name}
-				deps[name] = nd
-				res = append(res, name)
-			}
-		}
-	}
-
-	return res, true
+	*/
+	Info("Package %s manages its own dependencies", pkg)
+	return []string{}, true
 }
 
 // mergeDeps merges any dependency array into deps.
