github.com/mattn/gom@v0.0.0-20190726063113-0ebf2b5d812d/main.go (about) 1 package main 2 3 import ( 4 "flag" 5 "fmt" 6 "os" 7 "path/filepath" 8 "strings" 9 10 "github.com/hashicorp/go-version" 11 "github.com/mattn/gover" 12 ) 13 14 func usage() { 15 fmt.Printf(`Usage of %s: 16 Tasks: 17 gom build [options] : Build with _vendor packages 18 gom install [options] : Install bundled packages into _vendor directory, by default. 19 GOM_VENDOR_NAME=. gom install [options], for regular src folder. 20 gom test [options] : Run tests with bundles 21 gom run [options] : Run go file with bundles 22 gom doc [options] : Run godoc for bundles 23 gom exec [arguments] : Execute command with bundle environment 24 gom tool [options] : Run go tool with bundles 25 gom env [arguments] : Run go env 26 gom fmt [arguments] : Run go fmt 27 gom list [arguments] : Run go list 28 gom vet [arguments] : Run go vet 29 gom update : Update all dependencies (Experiment) 30 gom gen travis-yml : Generate .travis.yml which uses "gom test" 31 gom gen gomfile : Scan packages from current directory as root 32 recursively, and generate Gomfile 33 gom lock : Generate Gomfile.lock 34 `, os.Args[0]) 35 os.Exit(1) 36 } 37 38 var productionEnv = flag.Bool("production", false, "production environment") 39 var developmentEnv = flag.Bool("development", false, "development environment") 40 var testEnv = flag.Bool("test", false, "test environment") 41 var customGroups = flag.String("groups", "", "comma-separated list of Gomfile groups") 42 var customGroupList []string 43 var vendorFolder string 44 var isVendoringSupported bool 45 46 func init() { 47 isVendoringSupported = checkVendoringSupport() 48 if isVendoringSupported { 49 vendorFolder = "vendor" 50 } else { 51 if len(os.Getenv("GOM_VENDOR_NAME")) > 0 { 52 vendorFolder = os.Getenv("GOM_VENDOR_NAME") 53 } else { 54 vendorFolder = "_vendor" 55 } 56 } 57 } 58 59 func goversion() string { 60 defer recover() 61 return gover.Version() 62 } 63 64 // checkVendoringSupport return whether go have native vendor support. 65 // If return false, gom behave vendor directory as GOPATH. 66 // If return true, gom doesn't move anything. 67 func checkVendoringSupport() bool { 68 go150, _ := version.NewVersion("1.5.0") 69 go160, _ := version.NewVersion("1.6.0") 70 go173, _ := version.NewVersion("1.7.3") 71 ver := goversion() 72 73 // TODO: maybe gccgo? 74 if ver == "" { 75 return true 76 } 77 78 goVer, err := version.NewVersion(strings.TrimPrefix(ver, "go")) 79 if err != nil { 80 panic(fmt.Sprintf("gover.Version() returned invalid semantic version: %s", ver)) 81 } 82 83 // See: https://golang.org/doc/go1.6#go_command 84 if goVer.LessThan(go150) { 85 return false 86 } else if (goVer.Equal(go150) || goVer.GreaterThan(go150)) && goVer.LessThan(go160) { 87 return os.Getenv("GO15VENDOREXPERIMENT") == "1" 88 } else if (goVer.Equal(go160) || goVer.GreaterThan(go160)) && goVer.LessThan(go173) { 89 return os.Getenv("GO15VENDOREXPERIMENT") != "0" 90 } else { 91 return true 92 } 93 } 94 95 func vendorSrc(vendor string) string { 96 if isVendoringSupported { 97 return vendor 98 } else { 99 return filepath.Join(vendor, "src") 100 } 101 } 102 103 func main() { 104 flag.Usage = usage 105 flag.Parse() 106 if flag.NArg() == 0 { 107 usage() 108 } 109 handleSignal() 110 111 if !*productionEnv && !*developmentEnv && !*testEnv { 112 *developmentEnv = true 113 } 114 115 customGroupList = strings.Split(*customGroups, ",") 116 117 var err error 118 subArgs := flag.Args()[1:] 119 switch flag.Arg(0) { 120 case "install", "i": 121 err = install(subArgs) 122 case "build", "b": 123 err = run(append([]string{"go", "build"}, subArgs...), None) 124 case "test", "t": 125 err = run(append([]string{"go", "test"}, subArgs...), None) 126 case "run", "r": 127 err = run(append([]string{"go", "run"}, subArgs...), None) 128 case "doc", "d": 129 err = run(append([]string{"godoc"}, subArgs...), None) 130 case "exec", "e": 131 err = run(subArgs, None) 132 case "env", "tool", "fmt", "list", "vet": 133 err = run(append([]string{"go", flag.Arg(0)}, subArgs...), None) 134 case "update", "u": 135 err = update() 136 case "gen", "g": 137 switch flag.Arg(1) { 138 case "travis-yml": 139 err = genTravisYml() 140 case "gomfile": 141 err = genGomfile() 142 default: 143 usage() 144 } 145 case "lock", "l": 146 err = genGomfileLock() 147 default: 148 usage() 149 } 150 if err != nil { 151 fmt.Fprintln(os.Stderr, "gom: ", err) 152 os.Exit(1) 153 } 154 }