github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/internal/build/util.go (about) 1 2 //此源码被清华学神尹成大魔王专业翻译分析并修改 3 //尹成QQ77025077 4 //尹成微信18510341407 5 //尹成所在QQ群721929980 6 //尹成邮箱 yinc13@mails.tsinghua.edu.cn 7 //尹成毕业于清华大学,微软区块链领域全球最有价值专家 8 //https://mvp.microsoft.com/zh-cn/PublicProfile/4033620 9 //版权所有2016 Go Ethereum作者 10 //此文件是Go以太坊库的一部分。 11 // 12 //Go-Ethereum库是免费软件:您可以重新分发它和/或修改 13 //根据GNU发布的较低通用公共许可证的条款 14 //自由软件基金会,或者许可证的第3版,或者 15 //(由您选择)任何更高版本。 16 // 17 //Go以太坊图书馆的发行目的是希望它会有用, 18 //但没有任何保证;甚至没有 19 //适销性或特定用途的适用性。见 20 //GNU较低的通用公共许可证,了解更多详细信息。 21 // 22 //你应该收到一份GNU较低级别的公共许可证副本 23 //以及Go以太坊图书馆。如果没有,请参见<http://www.gnu.org/licenses/>。 24 25 package build 26 27 import ( 28 "bytes" 29 "flag" 30 "fmt" 31 "io" 32 "io/ioutil" 33 "log" 34 "os" 35 "os/exec" 36 "path" 37 "path/filepath" 38 "runtime" 39 "strings" 40 "text/template" 41 ) 42 43 var DryRunFlag = flag.Bool("n", false, "dry run, don't execute commands") 44 45 //mustrun执行给定的命令并退出主机进程 46 //任何错误。 47 func MustRun(cmd *exec.Cmd) { 48 fmt.Println(">>>", strings.Join(cmd.Args, " ")) 49 if !*DryRunFlag { 50 cmd.Stderr = os.Stderr 51 cmd.Stdout = os.Stdout 52 if err := cmd.Run(); err != nil { 53 log.Fatal(err) 54 } 55 } 56 } 57 58 func MustRunCommand(cmd string, args ...string) { 59 MustRun(exec.Command(cmd, args...)) 60 } 61 62 //gopath返回gopath环境 63 //变量应设置为。 64 func GOPATH() string { 65 if os.Getenv("GOPATH") == "" { 66 log.Fatal("GOPATH is not set") 67 } 68 return os.Getenv("GOPATH") 69 } 70 71 var warnedAboutGit bool 72 73 //rungit运行git子命令并返回其输出。 74 //命令必须成功完成。 75 func RunGit(args ...string) string { 76 cmd := exec.Command("git", args...) 77 var stdout, stderr bytes.Buffer 78 cmd.Stdout, cmd.Stderr = &stdout, &stderr 79 if err := cmd.Run(); err == exec.ErrNotFound { 80 if !warnedAboutGit { 81 log.Println("Warning: can't find 'git' in PATH") 82 warnedAboutGit = true 83 } 84 return "" 85 } else if err != nil { 86 log.Fatal(strings.Join(cmd.Args, " "), ": ", err, "\n", stderr.String()) 87 } 88 return strings.TrimSpace(stdout.String()) 89 } 90 91 //ReGGITFILE返回.git目录中的文件内容。 92 func readGitFile(file string) string { 93 content, err := ioutil.ReadFile(path.Join(".git", file)) 94 if err != nil { 95 return "" 96 } 97 return strings.TrimSpace(string(content)) 98 } 99 100 //渲染将给定的模板文件渲染为输出文件。 101 func Render(templateFile, outputFile string, outputPerm os.FileMode, x interface{}) { 102 tpl := template.Must(template.ParseFiles(templateFile)) 103 render(tpl, outputFile, outputPerm, x) 104 } 105 106 //renderString将给定的模板字符串呈现为outputfile。 107 func RenderString(templateContent, outputFile string, outputPerm os.FileMode, x interface{}) { 108 tpl := template.Must(template.New("").Parse(templateContent)) 109 render(tpl, outputFile, outputPerm, x) 110 } 111 112 func render(tpl *template.Template, outputFile string, outputPerm os.FileMode, x interface{}) { 113 if err := os.MkdirAll(filepath.Dir(outputFile), 0755); err != nil { 114 log.Fatal(err) 115 } 116 out, err := os.OpenFile(outputFile, os.O_CREATE|os.O_WRONLY|os.O_EXCL, outputPerm) 117 if err != nil { 118 log.Fatal(err) 119 } 120 if err := tpl.Execute(out, x); err != nil { 121 log.Fatal(err) 122 } 123 if err := out.Close(); err != nil { 124 log.Fatal(err) 125 } 126 } 127 128 //复制文件复制文件。 129 func CopyFile(dst, src string, mode os.FileMode) { 130 if err := os.MkdirAll(filepath.Dir(dst), 0755); err != nil { 131 log.Fatal(err) 132 } 133 destFile, err := os.OpenFile(dst, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, mode) 134 if err != nil { 135 log.Fatal(err) 136 } 137 defer destFile.Close() 138 139 srcFile, err := os.Open(src) 140 if err != nil { 141 log.Fatal(err) 142 } 143 defer srcFile.Close() 144 145 if _, err := io.Copy(destFile, srcFile); err != nil { 146 log.Fatal(err) 147 } 148 } 149 150 //go tool返回运行go工具的命令。它使用Goroot而不是Path 151 //因此,由生成执行的go命令使用与运行的“主机”相同的go版本 152 //编译代码。例如 153 // 154 ///usr/lib/go-1.8/bin/go运行build/ci.go… 155 // 156 //使用Go 1.8运行,并从同一个goroot调用Go 1.8工具。这也很重要 157 //因为主机上的runtime.version检查应该与运行的工具匹配。 158 func GoTool(tool string, args ...string) *exec.Cmd { 159 args = append([]string{tool}, args...) 160 return exec.Command(filepath.Join(runtime.GOROOT(), "bin", "go"), args...) 161 } 162 163 //ExpPkPaseServEndoor扩展了CMD/GO导入路径模式,跳过 164 //自动售货的包裹。 165 func ExpandPackagesNoVendor(patterns []string) []string { 166 expand := false 167 for _, pkg := range patterns { 168 if strings.Contains(pkg, "...") { 169 expand = true 170 } 171 } 172 if expand { 173 cmd := GoTool("list", patterns...) 174 out, err := cmd.CombinedOutput() 175 if err != nil { 176 log.Fatalf("package listing failed: %v\n%s", err, string(out)) 177 } 178 var packages []string 179 for _, line := range strings.Split(string(out), "\n") { 180 if !strings.Contains(line, "/vendor/") { 181 packages = append(packages, strings.TrimSpace(line)) 182 } 183 } 184 return packages 185 } 186 return patterns 187 }