github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/internal/build/util.go (about) 1 2 //<developer> 3 // <name>linapex 曹一峰</name> 4 // <email>linapex@163.com</email> 5 // <wx>superexc</wx> 6 // <qqgroup>128148617</qqgroup> 7 // <url>https://jsq.ink</url> 8 // <role>pku engineer</role> 9 // <date>2019-03-16 19:16:38</date> 10 //</624450091746332672> 11 12 13 package build 14 15 import ( 16 "bytes" 17 "flag" 18 "fmt" 19 "io" 20 "io/ioutil" 21 "log" 22 "os" 23 "os/exec" 24 "path" 25 "path/filepath" 26 "runtime" 27 "strings" 28 "text/template" 29 ) 30 31 var DryRunFlag = flag.Bool("n", false, "dry run, don't execute commands") 32 33 //mustrun执行给定的命令并退出主机进程 34 //任何错误。 35 func MustRun(cmd *exec.Cmd) { 36 fmt.Println(">>>", strings.Join(cmd.Args, " ")) 37 if !*DryRunFlag { 38 cmd.Stderr = os.Stderr 39 cmd.Stdout = os.Stdout 40 if err := cmd.Run(); err != nil { 41 log.Fatal(err) 42 } 43 } 44 } 45 46 func MustRunCommand(cmd string, args ...string) { 47 MustRun(exec.Command(cmd, args...)) 48 } 49 50 //gopath返回gopath环境 51 //变量应设置为。 52 func GOPATH() string { 53 if os.Getenv("GOPATH") == "" { 54 log.Fatal("GOPATH is not set") 55 } 56 return os.Getenv("GOPATH") 57 } 58 59 var warnedAboutGit bool 60 61 //RunGit runs a git subcommand and returns its output. 62 //命令必须成功完成。 63 func RunGit(args ...string) string { 64 cmd := exec.Command("git", args...) 65 var stdout, stderr bytes.Buffer 66 cmd.Stdout, cmd.Stderr = &stdout, &stderr 67 if err := cmd.Run(); err == exec.ErrNotFound { 68 if !warnedAboutGit { 69 log.Println("Warning: can't find 'git' in PATH") 70 warnedAboutGit = true 71 } 72 return "" 73 } else if err != nil { 74 log.Fatal(strings.Join(cmd.Args, " "), ": ", err, "\n", stderr.String()) 75 } 76 return strings.TrimSpace(stdout.String()) 77 } 78 79 //ReGGITFILE返回.git目录中的文件内容。 80 func readGitFile(file string) string { 81 content, err := ioutil.ReadFile(path.Join(".git", file)) 82 if err != nil { 83 return "" 84 } 85 return strings.TrimSpace(string(content)) 86 } 87 88 //渲染将给定的模板文件渲染为输出文件。 89 func Render(templateFile, outputFile string, outputPerm os.FileMode, x interface{}) { 90 tpl := template.Must(template.ParseFiles(templateFile)) 91 render(tpl, outputFile, outputPerm, x) 92 } 93 94 //renderString将给定的模板字符串呈现为outputfile。 95 func RenderString(templateContent, outputFile string, outputPerm os.FileMode, x interface{}) { 96 tpl := template.Must(template.New("").Parse(templateContent)) 97 render(tpl, outputFile, outputPerm, x) 98 } 99 100 func render(tpl *template.Template, outputFile string, outputPerm os.FileMode, x interface{}) { 101 if err := os.MkdirAll(filepath.Dir(outputFile), 0755); err != nil { 102 log.Fatal(err) 103 } 104 out, err := os.OpenFile(outputFile, os.O_CREATE|os.O_WRONLY|os.O_EXCL, outputPerm) 105 if err != nil { 106 log.Fatal(err) 107 } 108 if err := tpl.Execute(out, x); err != nil { 109 log.Fatal(err) 110 } 111 if err := out.Close(); err != nil { 112 log.Fatal(err) 113 } 114 } 115 116 //复制文件复制文件。 117 func CopyFile(dst, src string, mode os.FileMode) { 118 if err := os.MkdirAll(filepath.Dir(dst), 0755); err != nil { 119 log.Fatal(err) 120 } 121 destFile, err := os.OpenFile(dst, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, mode) 122 if err != nil { 123 log.Fatal(err) 124 } 125 defer destFile.Close() 126 127 srcFile, err := os.Open(src) 128 if err != nil { 129 log.Fatal(err) 130 } 131 defer srcFile.Close() 132 133 if _, err := io.Copy(destFile, srcFile); err != nil { 134 log.Fatal(err) 135 } 136 } 137 138 //go tool返回运行go工具的命令。它使用Goroot而不是Path 139 //因此,由生成执行的go命令使用与运行的“主机”相同的go版本 140 //编译代码。例如 141 // 142 ///usr/lib/go-1.11/bin/go运行build/ci.go… 143 // 144 //使用Go 1.11运行并从同一个goroot调用Go 1.11工具。这也很重要 145 //因为主机上的runtime.version检查应该与运行的工具匹配。 146 func GoTool(tool string, args ...string) *exec.Cmd { 147 args = append([]string{tool}, args...) 148 return exec.Command(filepath.Join(runtime.GOROOT(), "bin", "go"), args...) 149 } 150 151 //ExpPkPaseServEndoor扩展了CMD/GO导入路径模式,跳过 152 //自动售货的包裹。 153 func ExpandPackagesNoVendor(patterns []string) []string { 154 expand := false 155 for _, pkg := range patterns { 156 if strings.Contains(pkg, "...") { 157 expand = true 158 } 159 } 160 if expand { 161 cmd := GoTool("list", patterns...) 162 out, err := cmd.CombinedOutput() 163 if err != nil { 164 log.Fatalf("package listing failed: %v\n%s", err, string(out)) 165 } 166 var packages []string 167 for _, line := range strings.Split(string(out), "\n") { 168 if !strings.Contains(line, "/vendor/") { 169 packages = append(packages, strings.TrimSpace(line)) 170 } 171 } 172 return packages 173 } 174 return patterns 175 } 176