diff --git a/cmd/inject.go b/cmd/inject.go new file mode 100644 index 0000000..c41f0e6 --- /dev/null +++ b/cmd/inject.go @@ -0,0 +1,44 @@ +/* + Copyright 2021 Qiniu Cloud (qiniu.com) + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package cmd + +import ( + "github.com/RickLeee/goc/v2/pkg/build" + "github.com/spf13/cobra" +) + +var injectCmd = &cobra.Command{ + Use: "inject", + Run: injectAction, + //DisableFlagParsing: true, // build 命令需要用原生 go 的方式处理 flags + +} + +func init() { + injectCmd.Flags().StringVarP(&gocmode, "gocmode", "", "count", "coverage mode: set, count, atomic, watch") + injectCmd.Flags().StringVarP(&gochost, "gochost", "", "127.0.0.1:7777", "specify the host of the goc sever") + rootCmd.AddCommand(injectCmd) +} + +func injectAction(cmd *cobra.Command, args []string) { + + b := build.NewInject( + build.WithHost(gochost), + build.WithMode(gocmode), + build.WithArgs(args), + build.WithDebug(globalDebug), + ) + b.OnlyInject() + +} diff --git a/go.mod b/go.mod index e7129b2..329357a 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,8 @@ module github.com/RickLeee/goc/v2 -go 1.22 +go 1.22.0 + +toolchain go1.22.5 require ( github.com/gin-gonic/gin v1.7.2 @@ -17,9 +19,9 @@ require ( github.com/stretchr/testify v1.7.0 github.com/tongjingran/copy v1.4.2 go.uber.org/zap v1.17.0 - golang.org/x/mod v0.4.2 - golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d - golang.org/x/tools v0.1.3 + golang.org/x/mod v0.21.0 + golang.org/x/term v0.12.0 + golang.org/x/tools v0.13.0 gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b k8s.io/kubectl v0.21.2 k8s.io/test-infra v0.0.0-20210618100605-34aa2f2aa75b @@ -54,13 +56,12 @@ require ( github.com/ugorji/go/codec v1.1.7 // indirect go.uber.org/atomic v1.7.0 // indirect go.uber.org/multierr v1.6.0 // indirect - golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83 // indirect - golang.org/x/net v0.0.0-20210428140749-89ef3d95e781 // indirect + golang.org/x/crypto v0.13.0 // indirect + golang.org/x/net v0.15.0 // indirect golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43 // indirect - golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c // indirect - golang.org/x/text v0.3.6 // indirect + golang.org/x/sys v0.12.0 // indirect + golang.org/x/text v0.13.0 // indirect golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba // indirect - golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/protobuf v1.26.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect diff --git a/go.sum b/go.sum index c5d1c4c..2273dbf 100644 --- a/go.sum +++ b/go.sum @@ -1320,8 +1320,9 @@ golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83 h1:/ZScEX8SfEmUGRHs0gxpqteO5nfNW6axyZbBdw9A12g= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck= +golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1360,8 +1361,8 @@ golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.1-0.20200828183125-ce943fd02449/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0= +golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1417,8 +1418,9 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210224082022-3d97a244fca7/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210428140749-89ef3d95e781 h1:DzZ89McO9/gWPsQXS/FVKAlG02ZjaQ6AlZRBimEYOd0= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/oauth2 v0.0.0-20180724155351-3d292e4d0cdc/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -1524,12 +1526,13 @@ golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c h1:F1jZWGFhYfh0Ci55sIpILtKKK8p3i2/krTr0H1rg74I= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d h1:SZxvLBoTP5yHO3Frd4z4vrF+DBX9vMVanchswa69toE= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.12.0 h1:/ZfYdc3zq+q02Rv9vGqTeSItdzZTSNDmfTi0mBAuidU= +golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1538,8 +1541,9 @@ golang.org/x/text v0.3.1-0.20181227161524-e6919f6577db/go.mod h1:bEr9sfX3Q8Zfm5f golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1648,8 +1652,8 @@ golang.org/x/tools v0.0.0-20200918232735-d647fc253266/go.mod h1:z6u4i615ZeAfBE4X golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.3 h1:L69ShwSZEyCsLKoAxDKeMvLDZkumEe8gXUZAjab0tX8= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/pkg/build/build.go b/pkg/build/build.go index 6990216..4e8835a 100644 --- a/pkg/build/build.go +++ b/pkg/build/build.go @@ -14,62 +14,86 @@ package build import ( - "os" - "os/exec" - "strings" + "os" + "os/exec" + "strings" - "github.com/RickLeee/goc/v2/pkg/log" - "github.com/spf13/pflag" + "github.com/RickLeee/goc/v2/pkg/log" + "github.com/spf13/pflag" ) // Build struct a build type Build struct { - Args []string // all goc + go command line args + flags - FlagSets *pflag.FlagSet - BuildType int + Args []string // all goc + go command line args + flags + FlagSets *pflag.FlagSet + BuildType int - Debug bool - Host string - Mode string // cover mode + Debug bool + Host string + Mode string // cover mode - GOPATH string - GOBIN string - CurWd string - TmpWd string - CurModProjectDir string - TmpModProjectDir string + GOPATH string + GOBIN string + CurWd string + TmpWd string + CurModProjectDir string + TmpModProjectDir string - Goflags []string // go command line flags - GoArgs []string // go command line args - Packages []string // go command line [packages] + Goflags []string // go command line flags + GoArgs []string // go command line args + Packages []string // go command line [packages] - IsVendorMod bool // vendor, readonly, or mod? - IsModEdit bool // is mod file edited? + IsVendorMod bool // vendor, readonly, or mod? + IsModEdit bool // is mod file edited? - ImportPath string // the whole import path of the project - Pkgs map[string]*Package - GlobalCoverVarImportPath string - GlobalCoverVarImportPathDir string + ImportPath string // the whole import path of the project + Pkgs map[string]*Package + GlobalCoverVarImportPath string + GlobalCoverVarImportPathDir string } // NewBuild creates a Build struct func NewBuild(opts ...gocOption) *Build { - b := &Build{} + b := &Build{} - for _, opt := range opts { - opt(b) - } + for _, opt := range opts { + opt(b) + } - // 1. 解析 goc 命令行和 go 命令行 - b.buildCmdArgsParse() - // 2. 解析 go 包位置 - b.getPackagesDir() - // 3. 读取工程元信息:go.mod, pkgs list ... - b.readProjectMetaInfo() - // 4. 展示元信息 - b.displayProjectMetaInfo() + // 1. 解析 goc 命令行和 go 命令行 + b.buildCmdArgsParse() + // 2. 解析 go 包位置 + b.getPackagesDir() + // 3. 读取工程元信息:go.mod, pkgs list ... + b.readProjectMetaInfo() + // 4. 展示元信息 + b.displayProjectMetaInfo() - return b + return b +} + +func NewInject(opts ...gocOption) *Build { + b := &Build{} + + for _, opt := range opts { + opt(b) + } + curWd, err := os.Getwd() + if err != nil { + log.Fatalf("fail to get current working directory: %v", err) + } + b.CurWd = curWd + + //// 1. 解析 goc 命令行和 go 命令行 + //b.buildCmdArgsParse() + // 2. 解析 go 包位置 + b.getPackagesDir() + // 3. 读取工程元信息:go.mod, pkgs list ... + b.readProjectMetaInfo(true) + // 4. 展示元信息 + b.displayProjectMetaInfo() + + return b } // Build starts go build @@ -78,69 +102,81 @@ func NewBuild(opts ...gocOption) *Build { // 2. inject cover variables and functions into the project, // 3. build the project in temp. func (b *Build) Build() { - // 1. 拷贝至临时目录 - b.copyProjectToTmp() - defer b.clean() + // 1. 拷贝至临时目录 + b.copyProjectToTmp() + defer b.clean() - log.Donef("project copied to temporary directory") + log.Donef("project copied to temporary directory") - // 2. update go.mod file if needed - b.updateGoModFile() - // 3. inject cover vars - b.Inject() + // 2. update go.mod file if needed + b.updateGoModFile() + // 3. inject cover vars + b.Inject() - if b.IsVendorMod && b.IsModEdit { - b.reVendor() - } + if b.IsVendorMod && b.IsModEdit { + b.reVendor() + } - // 4. build in the temp project - b.doBuildInTemp() + // 4. build in the temp project + b.doBuildInTemp() +} + +func (b *Build) OnlyInject() { + + // 2. update go.mod file if needed + b.updateGoModFile() + // 3. inject cover vars + b.Inject() + + if b.IsVendorMod && b.IsModEdit { + b.reVendor() + } } func (b *Build) doBuildInTemp() { - log.StartWait("building the injected project") + log.StartWait("building the injected project") - goflags := b.Goflags - // 检查用户是否自定义了 -o - oSet := false - for _, flag := range goflags { - if flag == "-o" { - oSet = true - } - } + goflags := b.Goflags + // 检查用户是否自定义了 -o + oSet := false + for _, flag := range goflags { + if flag == "-o" { + oSet = true + } + } - // 如果没被设置就加一个至原命令执行的目录 - if !oSet { - goflags = append(goflags, "-o", b.CurWd) - } + // 如果没被设置就加一个至原命令执行的目录 + if !oSet { + goflags = append(goflags, "-o", b.CurWd) + } - if b.IsVendorMod && b.IsModEdit { - b.reVendor() - } + if b.IsVendorMod && b.IsModEdit { + b.reVendor() + } - pacakges := b.Packages + pacakges := b.Packages - goflags = append(goflags, pacakges...) + goflags = append(goflags, pacakges...) - args := []string{"build"} - args = append(args, goflags...) - // go 命令行由 go build [-o output] [build flags] [packages] 组成 - cmd := exec.Command("go", args...) - cmd.Dir = b.TmpWd - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr + args := []string{"build"} + args = append(args, goflags...) + // go 命令行由 go build [-o output] [build flags] [packages] 组成 + cmd := exec.Command("go", args...) + cmd.Dir = b.TmpWd + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr - log.Infof("go build cmd is: %v, in path [%v]", nicePrintArgs(cmd.Args), cmd.Dir) - if err := cmd.Start(); err != nil { - log.Fatalf("fail to execute go build: %v", err) - } - if err := cmd.Wait(); err != nil { - log.Fatalf("fail to execute go build: %v", err) - } + log.Infof("go build cmd is: %v, in path [%v]", nicePrintArgs(cmd.Args), cmd.Dir) + if err := cmd.Start(); err != nil { + log.Fatalf("fail to execute go build: %v", err) + } + if err := cmd.Wait(); err != nil { + log.Fatalf("fail to execute go build: %v", err) + } - // done - log.StopWait() - log.Donef("go build done") + // done + log.StopWait() + log.Donef("go build done") } // nicePrintArgs 优化 args 打印内容 @@ -149,32 +185,32 @@ func (b *Build) doBuildInTemp() { // // 实际输出会变为:go build -ldflags -X my/package/config.Version=1.0.0 -o /home/lyy/gitdown/gin-test/cmd . func nicePrintArgs(args []string) []string { - output := make([]string, 0) - for _, arg := range args { - if strings.Contains(arg, " ") { - output = append(output, "\""+arg+"\"") - } else { - output = append(output, arg) - } - } + output := make([]string, 0) + for _, arg := range args { + if strings.Contains(arg, " ") { + output = append(output, "\""+arg+"\"") + } else { + output = append(output, arg) + } + } - return output + return output } func (b *Build) reVendor() { - log.StartWait("re-vendoring the project") - cmd := exec.Command("go", "mod", "vendor") - cmd.Dir = b.TmpModProjectDir - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr + log.StartWait("re-vendoring the project") + cmd := exec.Command("go", "mod", "vendor") + cmd.Dir = b.TmpModProjectDir + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr - if err := cmd.Start(); err != nil { - log.Fatalf("fail to execute go vendor: %v", err) - } - if err := cmd.Wait(); err != nil { - log.Fatalf("fail to execute go vendor: %v", err) - } + if err := cmd.Start(); err != nil { + log.Fatalf("fail to execute go vendor: %v", err) + } + if err := cmd.Wait(); err != nil { + log.Fatalf("fail to execute go vendor: %v", err) + } - log.StopWait() - log.Donef("re-vendor the project done") + log.StopWait() + log.Donef("re-vendor the project done") } diff --git a/pkg/build/goenv.go b/pkg/build/goenv.go index ccafbad..fa5dbf0 100644 --- a/pkg/build/goenv.go +++ b/pkg/build/goenv.go @@ -14,141 +14,143 @@ package build import ( - "bytes" - "encoding/json" - "io" - "os" - "os/exec" - "path" - "path/filepath" - "strings" + "bytes" + "encoding/json" + "io" + "os" + "os/exec" + "path" + "path/filepath" + "strings" - "github.com/RickLeee/goc/v2/pkg/log" + "github.com/RickLeee/goc/v2/pkg/log" ) // readProjectMetaInfo reads all meta informations of the corresponding project -func (b *Build) readProjectMetaInfo() { - // get gopath & gobin - b.GOPATH = b.readGOPATH() - b.GOBIN = b.readGOBIN() - // 获取 [packages] 及其依赖的 package list - pkgs := b.listPackages(b.CurWd) +func (b *Build) readProjectMetaInfo(noTemp ...bool) { + // get gopath & gobin + b.GOPATH = b.readGOPATH() + b.GOBIN = b.readGOBIN() + // 获取 [packages] 及其依赖的 package list + pkgs := b.listPackages(b.CurWd) - // get mod info - for _, pkg := range pkgs { - // check if go modules is enabled - if pkg.Module == nil { - log.Fatalf("Go module is not enabled, please set GO111MODULE=auto or on") - } - // 工程根目录 - b.CurModProjectDir = pkg.Module.Dir - b.ImportPath = pkg.Module.Path + // get mod info + for _, pkg := range pkgs { + // check if go modules is enabled + if pkg.Module == nil { + log.Fatalf("Go module is not enabled, please set GO111MODULE=auto or on") + } + // 工程根目录 + b.CurModProjectDir = pkg.Module.Dir + b.ImportPath = pkg.Module.Path - break - } + break + } - // 如果当前目录不是工程根目录,那再次 go list 一次,获取整个工程的包信息 - if b.CurWd != b.CurModProjectDir { - b.Pkgs = b.listPackages(b.CurModProjectDir) - } else { - b.Pkgs = pkgs - } + // 如果当前目录不是工程根目录,那再次 go list 一次,获取整个工程的包信息 + if b.CurWd != b.CurModProjectDir { + b.Pkgs = b.listPackages(b.CurModProjectDir) + } else { + b.Pkgs = pkgs + } - // check if project is in vendor mod - b.checkIfVendorMod() + // check if project is in vendor mod + b.checkIfVendorMod() - // get tmp folder name - b.TmpModProjectDir = filepath.Join(os.TempDir(), TmpFolderName(b.CurModProjectDir)) - // get working dir in the corresponding tmp dir - b.TmpWd = filepath.Join(b.TmpModProjectDir, b.CurWd[len(b.CurModProjectDir):]) - // get GlobalCoverVarImportPath - b.GlobalCoverVarImportPath = path.Join(b.ImportPath, TmpFolderName(b.CurModProjectDir)) - log.Donef("project meta information parsed") + // get tmp folder name + b.TmpModProjectDir = filepath.Join(os.TempDir(), TmpFolderName(b.CurModProjectDir)) + if len(noTemp) != 0 && noTemp[0] { + b.TmpModProjectDir = b.CurModProjectDir + } + // get working dir in the corresponding tmp dir + b.TmpWd = filepath.Join(b.TmpModProjectDir, b.CurWd[len(b.CurModProjectDir):]) + // get GlobalCoverVarImportPath + b.GlobalCoverVarImportPath = path.Join(b.ImportPath, TmpFolderName(b.CurModProjectDir)) + log.Donef("project meta information parsed") } // displayProjectMetaInfo prints basic infomation of this project to stdout func (b *Build) displayProjectMetaInfo() { - log.Infof("GOPATH: %v", b.GOPATH) - log.Infof("GOBIN: %v", b.GOBIN) - log.Infof("Project Directory: %v", b.CurModProjectDir) - log.Infof("GOC_REGISTER_EXTRA from env: %v", os.Getenv("GOC_REGISTER_EXTRA")) - log.Infof("Temporary Project Directory: %v", b.TmpModProjectDir) - if b.IsVendorMod { - log.Infof("Project in vendor mod") - } - log.Infof("") + log.Infof("GOPATH: %v", b.GOPATH) + log.Infof("GOBIN: %v", b.GOBIN) + log.Infof("Project Directory: %v", b.CurModProjectDir) + log.Infof("Temporary Project Directory: %v", b.TmpModProjectDir) + if b.IsVendorMod { + log.Infof("Project in vendor mod") + } + log.Infof("") } // readGOPATH reads GOPATH use go env GOPATH command func (b *Build) readGOPATH() string { - out, err := exec.Command("go", "env", "GOPATH").Output() - if err != nil { - log.Fatalf("fail to read GOPATH: %v", err) - } - return strings.TrimSpace(string(out)) + out, err := exec.Command("go", "env", "GOPATH").Output() + if err != nil { + log.Fatalf("fail to read GOPATH: %v", err) + } + return strings.TrimSpace(string(out)) } // readGOBIN reads GOBIN use go env GOBIN command func (b *Build) readGOBIN() string { - out, err := exec.Command("go", "env", "GOBIN").Output() - if err != nil { - log.Fatalf("fail to read GOBIN: %v", err) - } - return strings.TrimSpace(string(out)) + out, err := exec.Command("go", "env", "GOBIN").Output() + if err != nil { + log.Fatalf("fail to read GOBIN: %v", err) + } + return strings.TrimSpace(string(out)) } // listPackages list all packages under specific via go list command. func (b *Build) listPackages(dir string) map[string]*Package { - listArgs := []string{"list", "-json"} - if goflags.BuildTags != "" { - listArgs = append(listArgs, "-tags", goflags.BuildTags) - } - listArgs = append(listArgs, "./...") + listArgs := []string{"list", "-json"} + if goflags.BuildTags != "" { + listArgs = append(listArgs, "-tags", goflags.BuildTags) + } + listArgs = append(listArgs, "./...") - cmd := exec.Command("go", listArgs...) - cmd.Dir = dir + cmd := exec.Command("go", listArgs...) + cmd.Dir = dir - var errBuf bytes.Buffer - cmd.Stderr = &errBuf - out, err := cmd.Output() - if err != nil { - log.Fatalf("execute go list -json failed, err: %v, stdout: %v, stderr: %v", err, string(out), errBuf.String()) - } - // 有些时候 go 命令会打印一些信息到 stderr,但其实命令整体是成功运行了 - if errBuf.String() != "" { - log.Errorf("%v", errBuf.String()) - } + var errBuf bytes.Buffer + cmd.Stderr = &errBuf + out, err := cmd.Output() + if err != nil { + log.Fatalf("execute go list -json failed, err: %v, stdout: %v, stderr: %v", err, string(out), errBuf.String()) + } + // 有些时候 go 命令会打印一些信息到 stderr,但其实命令整体是成功运行了 + if errBuf.String() != "" { + log.Errorf("%v", errBuf.String()) + } - dec := json.NewDecoder(bytes.NewBuffer(out)) - pkgs := make(map[string]*Package) + dec := json.NewDecoder(bytes.NewBuffer(out)) + pkgs := make(map[string]*Package) - for { - var pkg Package - if err := dec.Decode(&pkg); err != nil { - if err == io.EOF { - break - } - log.Fatalf("reading go list output error: %v", err) - } - if pkg.Error != nil { - log.Fatalf("list package %s failed with output: %v", pkg.ImportPath, pkg.Error) - } + for { + var pkg Package + if err := dec.Decode(&pkg); err != nil { + if err == io.EOF { + break + } + log.Fatalf("reading go list output error: %v", err) + } + if pkg.Error != nil { + log.Fatalf("list package %s failed with output: %v", pkg.ImportPath, pkg.Error) + } - pkgs[pkg.ImportPath] = &pkg - } + pkgs[pkg.ImportPath] = &pkg + } - return pkgs + return pkgs } func (b *Build) checkIfVendorMod() { - if b.IsVendorMod == true { - return - } + if b.IsVendorMod == true { + return + } - vendorDir := filepath.Join(b.CurModProjectDir, "vendor") - if _, err := os.Stat(vendorDir); err != nil { - b.IsVendorMod = false - } + vendorDir := filepath.Join(b.CurModProjectDir, "vendor") + if _, err := os.Stat(vendorDir); err != nil { + b.IsVendorMod = false + } - b.IsVendorMod = true + b.IsVendorMod = true } diff --git a/pkg/build/inject.go b/pkg/build/inject.go index e68df93..5d020d5 100644 --- a/pkg/build/inject.go +++ b/pkg/build/inject.go @@ -205,7 +205,6 @@ func (b *Build) injectGocAgent(where string, covers []*PackageCover) { if err != nil { log.Errorf("get git branch Error: %v", err) } else { - log.Infof("[goc][info] raw branch: %v ", br) branch = fmtBranch(br) } log.Infof("[goc][info] branch: %v --- commitID: %v", branch, commitID)