feat: only inject cmd

This commit is contained in:
liruichen 2024-09-05 15:10:18 +08:00
parent 9c8503082e
commit f0fbcc680a
6 changed files with 316 additions and 230 deletions

44
cmd/inject.go Normal file
View File

@ -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()
}

19
go.mod
View File

@ -1,6 +1,8 @@
module github.com/RickLeee/goc/v2 module github.com/RickLeee/goc/v2
go 1.22 go 1.22.0
toolchain go1.22.5
require ( require (
github.com/gin-gonic/gin v1.7.2 github.com/gin-gonic/gin v1.7.2
@ -17,9 +19,9 @@ require (
github.com/stretchr/testify v1.7.0 github.com/stretchr/testify v1.7.0
github.com/tongjingran/copy v1.4.2 github.com/tongjingran/copy v1.4.2
go.uber.org/zap v1.17.0 go.uber.org/zap v1.17.0
golang.org/x/mod v0.4.2 golang.org/x/mod v0.21.0
golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d golang.org/x/term v0.12.0
golang.org/x/tools v0.1.3 golang.org/x/tools v0.13.0
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b
k8s.io/kubectl v0.21.2 k8s.io/kubectl v0.21.2
k8s.io/test-infra v0.0.0-20210618100605-34aa2f2aa75b k8s.io/test-infra v0.0.0-20210618100605-34aa2f2aa75b
@ -54,13 +56,12 @@ require (
github.com/ugorji/go/codec v1.1.7 // indirect github.com/ugorji/go/codec v1.1.7 // indirect
go.uber.org/atomic v1.7.0 // indirect go.uber.org/atomic v1.7.0 // indirect
go.uber.org/multierr v1.6.0 // indirect go.uber.org/multierr v1.6.0 // indirect
golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83 // indirect golang.org/x/crypto v0.13.0 // indirect
golang.org/x/net v0.0.0-20210428140749-89ef3d95e781 // indirect golang.org/x/net v0.15.0 // indirect
golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43 // indirect golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43 // indirect
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c // indirect golang.org/x/sys v0.12.0 // indirect
golang.org/x/text v0.3.6 // indirect golang.org/x/text v0.13.0 // indirect
golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba // 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/appengine v1.6.7 // indirect
google.golang.org/protobuf v1.26.0 // indirect google.golang.org/protobuf v1.26.0 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/inf.v0 v0.9.1 // indirect

24
go.sum
View File

@ -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-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-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-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.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-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-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/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.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.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.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.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0=
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 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-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-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/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-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-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-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.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-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-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/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-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-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-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c h1:F1jZWGFhYfh0Ci55sIpILtKKK8p3i2/krTr0H1rg74I= golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o=
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 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-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-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.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-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.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/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.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.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.4/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.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-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-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/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-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/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.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
golang.org/x/tools v0.1.3 h1:L69ShwSZEyCsLKoAxDKeMvLDZkumEe8gXUZAjab0tX8= golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ=
golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= 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-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-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=

View File

@ -14,62 +14,86 @@
package build package build
import ( import (
"os" "os"
"os/exec" "os/exec"
"strings" "strings"
"github.com/RickLeee/goc/v2/pkg/log" "github.com/RickLeee/goc/v2/pkg/log"
"github.com/spf13/pflag" "github.com/spf13/pflag"
) )
// Build struct a build // Build struct a build
type Build struct { type Build struct {
Args []string // all goc + go command line args + flags Args []string // all goc + go command line args + flags
FlagSets *pflag.FlagSet FlagSets *pflag.FlagSet
BuildType int BuildType int
Debug bool Debug bool
Host string Host string
Mode string // cover mode Mode string // cover mode
GOPATH string GOPATH string
GOBIN string GOBIN string
CurWd string CurWd string
TmpWd string TmpWd string
CurModProjectDir string CurModProjectDir string
TmpModProjectDir string TmpModProjectDir string
Goflags []string // go command line flags Goflags []string // go command line flags
GoArgs []string // go command line args GoArgs []string // go command line args
Packages []string // go command line [packages] Packages []string // go command line [packages]
IsVendorMod bool // vendor, readonly, or mod? IsVendorMod bool // vendor, readonly, or mod?
IsModEdit bool // is mod file edited? IsModEdit bool // is mod file edited?
ImportPath string // the whole import path of the project ImportPath string // the whole import path of the project
Pkgs map[string]*Package Pkgs map[string]*Package
GlobalCoverVarImportPath string GlobalCoverVarImportPath string
GlobalCoverVarImportPathDir string GlobalCoverVarImportPathDir string
} }
// NewBuild creates a Build struct // NewBuild creates a Build struct
func NewBuild(opts ...gocOption) *Build { func NewBuild(opts ...gocOption) *Build {
b := &Build{} b := &Build{}
for _, opt := range opts { for _, opt := range opts {
opt(b) opt(b)
} }
// 1. 解析 goc 命令行和 go 命令行 // 1. 解析 goc 命令行和 go 命令行
b.buildCmdArgsParse() b.buildCmdArgsParse()
// 2. 解析 go 包位置 // 2. 解析 go 包位置
b.getPackagesDir() b.getPackagesDir()
// 3. 读取工程元信息go.mod, pkgs list ... // 3. 读取工程元信息go.mod, pkgs list ...
b.readProjectMetaInfo() b.readProjectMetaInfo()
// 4. 展示元信息 // 4. 展示元信息
b.displayProjectMetaInfo() 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 // Build starts go build
@ -78,69 +102,81 @@ func NewBuild(opts ...gocOption) *Build {
// 2. inject cover variables and functions into the project, // 2. inject cover variables and functions into the project,
// 3. build the project in temp. // 3. build the project in temp.
func (b *Build) Build() { func (b *Build) Build() {
// 1. 拷贝至临时目录 // 1. 拷贝至临时目录
b.copyProjectToTmp() b.copyProjectToTmp()
defer b.clean() defer b.clean()
log.Donef("project copied to temporary directory") log.Donef("project copied to temporary directory")
// 2. update go.mod file if needed // 2. update go.mod file if needed
b.updateGoModFile() b.updateGoModFile()
// 3. inject cover vars // 3. inject cover vars
b.Inject() b.Inject()
if b.IsVendorMod && b.IsModEdit { if b.IsVendorMod && b.IsModEdit {
b.reVendor() b.reVendor()
} }
// 4. build in the temp project // 4. build in the temp project
b.doBuildInTemp() 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() { func (b *Build) doBuildInTemp() {
log.StartWait("building the injected project") log.StartWait("building the injected project")
goflags := b.Goflags goflags := b.Goflags
// 检查用户是否自定义了 -o // 检查用户是否自定义了 -o
oSet := false oSet := false
for _, flag := range goflags { for _, flag := range goflags {
if flag == "-o" { if flag == "-o" {
oSet = true oSet = true
} }
} }
// 如果没被设置就加一个至原命令执行的目录 // 如果没被设置就加一个至原命令执行的目录
if !oSet { if !oSet {
goflags = append(goflags, "-o", b.CurWd) goflags = append(goflags, "-o", b.CurWd)
} }
if b.IsVendorMod && b.IsModEdit { if b.IsVendorMod && b.IsModEdit {
b.reVendor() b.reVendor()
} }
pacakges := b.Packages pacakges := b.Packages
goflags = append(goflags, pacakges...) goflags = append(goflags, pacakges...)
args := []string{"build"} args := []string{"build"}
args = append(args, goflags...) args = append(args, goflags...)
// go 命令行由 go build [-o output] [build flags] [packages] 组成 // go 命令行由 go build [-o output] [build flags] [packages] 组成
cmd := exec.Command("go", args...) cmd := exec.Command("go", args...)
cmd.Dir = b.TmpWd cmd.Dir = b.TmpWd
cmd.Stdout = os.Stdout cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr cmd.Stderr = os.Stderr
log.Infof("go build cmd is: %v, in path [%v]", nicePrintArgs(cmd.Args), cmd.Dir) log.Infof("go build cmd is: %v, in path [%v]", nicePrintArgs(cmd.Args), cmd.Dir)
if err := cmd.Start(); err != nil { if err := cmd.Start(); err != nil {
log.Fatalf("fail to execute go build: %v", err) log.Fatalf("fail to execute go build: %v", err)
} }
if err := cmd.Wait(); err != nil { if err := cmd.Wait(); err != nil {
log.Fatalf("fail to execute go build: %v", err) log.Fatalf("fail to execute go build: %v", err)
} }
// done // done
log.StopWait() log.StopWait()
log.Donef("go build done") log.Donef("go build done")
} }
// nicePrintArgs 优化 args 打印内容 // 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 . // 实际输出会变为go build -ldflags -X my/package/config.Version=1.0.0 -o /home/lyy/gitdown/gin-test/cmd .
func nicePrintArgs(args []string) []string { func nicePrintArgs(args []string) []string {
output := make([]string, 0) output := make([]string, 0)
for _, arg := range args { for _, arg := range args {
if strings.Contains(arg, " ") { if strings.Contains(arg, " ") {
output = append(output, "\""+arg+"\"") output = append(output, "\""+arg+"\"")
} else { } else {
output = append(output, arg) output = append(output, arg)
} }
} }
return output return output
} }
func (b *Build) reVendor() { func (b *Build) reVendor() {
log.StartWait("re-vendoring the project") log.StartWait("re-vendoring the project")
cmd := exec.Command("go", "mod", "vendor") cmd := exec.Command("go", "mod", "vendor")
cmd.Dir = b.TmpModProjectDir cmd.Dir = b.TmpModProjectDir
cmd.Stdout = os.Stdout cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr cmd.Stderr = os.Stderr
if err := cmd.Start(); err != nil { if err := cmd.Start(); err != nil {
log.Fatalf("fail to execute go vendor: %v", err) log.Fatalf("fail to execute go vendor: %v", err)
} }
if err := cmd.Wait(); err != nil { if err := cmd.Wait(); err != nil {
log.Fatalf("fail to execute go vendor: %v", err) log.Fatalf("fail to execute go vendor: %v", err)
} }
log.StopWait() log.StopWait()
log.Donef("re-vendor the project done") log.Donef("re-vendor the project done")
} }

View File

@ -14,141 +14,143 @@
package build package build
import ( import (
"bytes" "bytes"
"encoding/json" "encoding/json"
"io" "io"
"os" "os"
"os/exec" "os/exec"
"path" "path"
"path/filepath" "path/filepath"
"strings" "strings"
"github.com/RickLeee/goc/v2/pkg/log" "github.com/RickLeee/goc/v2/pkg/log"
) )
// readProjectMetaInfo reads all meta informations of the corresponding project // readProjectMetaInfo reads all meta informations of the corresponding project
func (b *Build) readProjectMetaInfo() { func (b *Build) readProjectMetaInfo(noTemp ...bool) {
// get gopath & gobin // get gopath & gobin
b.GOPATH = b.readGOPATH() b.GOPATH = b.readGOPATH()
b.GOBIN = b.readGOBIN() b.GOBIN = b.readGOBIN()
// 获取 [packages] 及其依赖的 package list // 获取 [packages] 及其依赖的 package list
pkgs := b.listPackages(b.CurWd) pkgs := b.listPackages(b.CurWd)
// get mod info // get mod info
for _, pkg := range pkgs { for _, pkg := range pkgs {
// check if go modules is enabled // check if go modules is enabled
if pkg.Module == nil { if pkg.Module == nil {
log.Fatalf("Go module is not enabled, please set GO111MODULE=auto or on") log.Fatalf("Go module is not enabled, please set GO111MODULE=auto or on")
} }
// 工程根目录 // 工程根目录
b.CurModProjectDir = pkg.Module.Dir b.CurModProjectDir = pkg.Module.Dir
b.ImportPath = pkg.Module.Path b.ImportPath = pkg.Module.Path
break break
} }
// 如果当前目录不是工程根目录,那再次 go list 一次,获取整个工程的包信息 // 如果当前目录不是工程根目录,那再次 go list 一次,获取整个工程的包信息
if b.CurWd != b.CurModProjectDir { if b.CurWd != b.CurModProjectDir {
b.Pkgs = b.listPackages(b.CurModProjectDir) b.Pkgs = b.listPackages(b.CurModProjectDir)
} else { } else {
b.Pkgs = pkgs b.Pkgs = pkgs
} }
// check if project is in vendor mod // check if project is in vendor mod
b.checkIfVendorMod() b.checkIfVendorMod()
// get tmp folder name // get tmp folder name
b.TmpModProjectDir = filepath.Join(os.TempDir(), TmpFolderName(b.CurModProjectDir)) b.TmpModProjectDir = filepath.Join(os.TempDir(), TmpFolderName(b.CurModProjectDir))
// get working dir in the corresponding tmp dir if len(noTemp) != 0 && noTemp[0] {
b.TmpWd = filepath.Join(b.TmpModProjectDir, b.CurWd[len(b.CurModProjectDir):]) b.TmpModProjectDir = b.CurModProjectDir
// get GlobalCoverVarImportPath }
b.GlobalCoverVarImportPath = path.Join(b.ImportPath, TmpFolderName(b.CurModProjectDir)) // get working dir in the corresponding tmp dir
log.Donef("project meta information parsed") 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 // displayProjectMetaInfo prints basic infomation of this project to stdout
func (b *Build) displayProjectMetaInfo() { func (b *Build) displayProjectMetaInfo() {
log.Infof("GOPATH: %v", b.GOPATH) log.Infof("GOPATH: %v", b.GOPATH)
log.Infof("GOBIN: %v", b.GOBIN) log.Infof("GOBIN: %v", b.GOBIN)
log.Infof("Project Directory: %v", b.CurModProjectDir) 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)
log.Infof("Temporary Project Directory: %v", b.TmpModProjectDir) if b.IsVendorMod {
if b.IsVendorMod { log.Infof("Project in vendor mod")
log.Infof("Project in vendor mod") }
} log.Infof("")
log.Infof("")
} }
// readGOPATH reads GOPATH use go env GOPATH command // readGOPATH reads GOPATH use go env GOPATH command
func (b *Build) readGOPATH() string { func (b *Build) readGOPATH() string {
out, err := exec.Command("go", "env", "GOPATH").Output() out, err := exec.Command("go", "env", "GOPATH").Output()
if err != nil { if err != nil {
log.Fatalf("fail to read GOPATH: %v", err) log.Fatalf("fail to read GOPATH: %v", err)
} }
return strings.TrimSpace(string(out)) return strings.TrimSpace(string(out))
} }
// readGOBIN reads GOBIN use go env GOBIN command // readGOBIN reads GOBIN use go env GOBIN command
func (b *Build) readGOBIN() string { func (b *Build) readGOBIN() string {
out, err := exec.Command("go", "env", "GOBIN").Output() out, err := exec.Command("go", "env", "GOBIN").Output()
if err != nil { if err != nil {
log.Fatalf("fail to read GOBIN: %v", err) log.Fatalf("fail to read GOBIN: %v", err)
} }
return strings.TrimSpace(string(out)) return strings.TrimSpace(string(out))
} }
// listPackages list all packages under specific via go list command. // listPackages list all packages under specific via go list command.
func (b *Build) listPackages(dir string) map[string]*Package { func (b *Build) listPackages(dir string) map[string]*Package {
listArgs := []string{"list", "-json"} listArgs := []string{"list", "-json"}
if goflags.BuildTags != "" { if goflags.BuildTags != "" {
listArgs = append(listArgs, "-tags", goflags.BuildTags) listArgs = append(listArgs, "-tags", goflags.BuildTags)
} }
listArgs = append(listArgs, "./...") listArgs = append(listArgs, "./...")
cmd := exec.Command("go", listArgs...) cmd := exec.Command("go", listArgs...)
cmd.Dir = dir cmd.Dir = dir
var errBuf bytes.Buffer var errBuf bytes.Buffer
cmd.Stderr = &errBuf cmd.Stderr = &errBuf
out, err := cmd.Output() out, err := cmd.Output()
if err != nil { if err != nil {
log.Fatalf("execute go list -json failed, err: %v, stdout: %v, stderr: %v", err, string(out), errBuf.String()) log.Fatalf("execute go list -json failed, err: %v, stdout: %v, stderr: %v", err, string(out), errBuf.String())
} }
// 有些时候 go 命令会打印一些信息到 stderr但其实命令整体是成功运行了 // 有些时候 go 命令会打印一些信息到 stderr但其实命令整体是成功运行了
if errBuf.String() != "" { if errBuf.String() != "" {
log.Errorf("%v", errBuf.String()) log.Errorf("%v", errBuf.String())
} }
dec := json.NewDecoder(bytes.NewBuffer(out)) dec := json.NewDecoder(bytes.NewBuffer(out))
pkgs := make(map[string]*Package) pkgs := make(map[string]*Package)
for { for {
var pkg Package var pkg Package
if err := dec.Decode(&pkg); err != nil { if err := dec.Decode(&pkg); err != nil {
if err == io.EOF { if err == io.EOF {
break break
} }
log.Fatalf("reading go list output error: %v", err) log.Fatalf("reading go list output error: %v", err)
} }
if pkg.Error != nil { if pkg.Error != nil {
log.Fatalf("list package %s failed with output: %v", pkg.ImportPath, pkg.Error) 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() { func (b *Build) checkIfVendorMod() {
if b.IsVendorMod == true { if b.IsVendorMod == true {
return return
} }
vendorDir := filepath.Join(b.CurModProjectDir, "vendor") vendorDir := filepath.Join(b.CurModProjectDir, "vendor")
if _, err := os.Stat(vendorDir); err != nil { if _, err := os.Stat(vendorDir); err != nil {
b.IsVendorMod = false b.IsVendorMod = false
} }
b.IsVendorMod = true b.IsVendorMod = true
} }

View File

@ -205,7 +205,6 @@ func (b *Build) injectGocAgent(where string, covers []*PackageCover) {
if err != nil { if err != nil {
log.Errorf("get git branch Error: %v", err) log.Errorf("get git branch Error: %v", err)
} else { } else {
log.Infof("[goc][info] raw branch: %v ", br)
branch = fmtBranch(br) branch = fmtBranch(br)
} }
log.Infof("[goc][info] branch: %v --- commitID: %v", branch, commitID) log.Infof("[goc][info] branch: %v --- commitID: %v", branch, commitID)