add support for vendor project with go.mod changed
This commit is contained in:
parent
9629df8fef
commit
0a5062f61b
@ -43,6 +43,9 @@ type Build struct {
|
|||||||
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?
|
||||||
|
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
|
||||||
@ -86,6 +89,11 @@ func (b *Build) Build() {
|
|||||||
b.updateGoModFile()
|
b.updateGoModFile()
|
||||||
// 3. inject cover vars
|
// 3. inject cover vars
|
||||||
b.Inject()
|
b.Inject()
|
||||||
|
|
||||||
|
if b.IsVendorMod && b.IsModEdit {
|
||||||
|
b.reVendor()
|
||||||
|
}
|
||||||
|
|
||||||
// 4. build in the temp project
|
// 4. build in the temp project
|
||||||
b.doBuildInTemp()
|
b.doBuildInTemp()
|
||||||
}
|
}
|
||||||
@ -107,6 +115,10 @@ func (b *Build) doBuildInTemp() {
|
|||||||
goflags = append(goflags, "-o", b.CurWd)
|
goflags = append(goflags, "-o", b.CurWd)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if b.IsVendorMod && b.IsModEdit {
|
||||||
|
b.reVendor()
|
||||||
|
}
|
||||||
|
|
||||||
pacakges := b.Packages
|
pacakges := b.Packages
|
||||||
|
|
||||||
goflags = append(goflags, pacakges...)
|
goflags = append(goflags, pacakges...)
|
||||||
@ -149,3 +161,21 @@ func nicePrintArgs(args []string) []string {
|
|||||||
|
|
||||||
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
|
||||||
|
|
||||||
|
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")
|
||||||
|
}
|
||||||
|
@ -130,7 +130,18 @@ func (b *Build) buildCmdArgsParse() {
|
|||||||
}
|
}
|
||||||
flags = append(flags, "-o", outputDir)
|
flags = append(flags, "-o", outputDir)
|
||||||
} else {
|
} else {
|
||||||
flags = append(flags, "-"+f.Name, f.Value.String())
|
if _, ok := booleanFlags[f.Name]; !ok {
|
||||||
|
flags = append(flags, "-"+f.Name, f.Value.String())
|
||||||
|
} else {
|
||||||
|
flags = append(flags, "-"+f.Name)
|
||||||
|
}
|
||||||
|
if f.Name == "mod" {
|
||||||
|
if f.Value.String() == "vendor" {
|
||||||
|
b.IsVendorMod = true
|
||||||
|
} else {
|
||||||
|
b.IsVendorMod = false
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -248,13 +259,18 @@ type goConfig struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var goflags goConfig
|
var goflags goConfig
|
||||||
|
var booleanFlags map[string]struct{} = make(map[string]struct{})
|
||||||
|
|
||||||
func addBuildFlags(cmdSet *flag.FlagSet) {
|
func addBuildFlags(cmdSet *flag.FlagSet) {
|
||||||
cmdSet.BoolVar(&goflags.BuildA, "a", false, "")
|
cmdSet.BoolVar(&goflags.BuildA, "a", false, "")
|
||||||
|
booleanFlags["a"] = struct{}{}
|
||||||
cmdSet.BoolVar(&goflags.BuildN, "n", false, "")
|
cmdSet.BoolVar(&goflags.BuildN, "n", false, "")
|
||||||
|
booleanFlags["n"] = struct{}{}
|
||||||
cmdSet.IntVar(&goflags.BuildP, "p", 4, "")
|
cmdSet.IntVar(&goflags.BuildP, "p", 4, "")
|
||||||
cmdSet.BoolVar(&goflags.BuildV, "v", false, "")
|
cmdSet.BoolVar(&goflags.BuildV, "v", false, "")
|
||||||
|
booleanFlags["v"] = struct{}{}
|
||||||
cmdSet.BoolVar(&goflags.BuildX, "x", false, "")
|
cmdSet.BoolVar(&goflags.BuildX, "x", false, "")
|
||||||
|
booleanFlags["x"] = struct{}{}
|
||||||
cmdSet.StringVar(&goflags.BuildBuildmode, "buildmode", "default", "")
|
cmdSet.StringVar(&goflags.BuildBuildmode, "buildmode", "default", "")
|
||||||
cmdSet.StringVar(&goflags.BuildMod, "mod", "", "")
|
cmdSet.StringVar(&goflags.BuildMod, "mod", "", "")
|
||||||
cmdSet.StringVar(&goflags.Installsuffix, "installsuffix", "", "")
|
cmdSet.StringVar(&goflags.Installsuffix, "installsuffix", "", "")
|
||||||
@ -266,16 +282,22 @@ func addBuildFlags(cmdSet *flag.FlagSet) {
|
|||||||
cmdSet.StringVar(&goflags.BuildGccgoflags, "gccgoflags", "", "")
|
cmdSet.StringVar(&goflags.BuildGccgoflags, "gccgoflags", "", "")
|
||||||
// mod related
|
// mod related
|
||||||
cmdSet.BoolVar(&goflags.ModCacheRW, "modcacherw", false, "")
|
cmdSet.BoolVar(&goflags.ModCacheRW, "modcacherw", false, "")
|
||||||
|
booleanFlags["modcacherw"] = struct{}{}
|
||||||
cmdSet.StringVar(&goflags.ModFile, "modfile", "", "")
|
cmdSet.StringVar(&goflags.ModFile, "modfile", "", "")
|
||||||
cmdSet.StringVar(&goflags.BuildLdflags, "ldflags", "", "")
|
cmdSet.StringVar(&goflags.BuildLdflags, "ldflags", "", "")
|
||||||
cmdSet.BoolVar(&goflags.BuildLinkshared, "linkshared", false, "")
|
cmdSet.BoolVar(&goflags.BuildLinkshared, "linkshared", false, "")
|
||||||
|
booleanFlags["linkshared"] = struct{}{}
|
||||||
cmdSet.StringVar(&goflags.BuildPkgdir, "pkgdir", "", "")
|
cmdSet.StringVar(&goflags.BuildPkgdir, "pkgdir", "", "")
|
||||||
cmdSet.BoolVar(&goflags.BuildRace, "race", false, "")
|
cmdSet.BoolVar(&goflags.BuildRace, "race", false, "")
|
||||||
|
booleanFlags["race"] = struct{}{}
|
||||||
cmdSet.BoolVar(&goflags.BuildMSan, "msan", false, "")
|
cmdSet.BoolVar(&goflags.BuildMSan, "msan", false, "")
|
||||||
|
booleanFlags["msan"] = struct{}{}
|
||||||
cmdSet.StringVar(&goflags.BuildTags, "tags", "", "")
|
cmdSet.StringVar(&goflags.BuildTags, "tags", "", "")
|
||||||
cmdSet.StringVar(&goflags.BuildToolexec, "toolexec", "", "")
|
cmdSet.StringVar(&goflags.BuildToolexec, "toolexec", "", "")
|
||||||
cmdSet.BoolVar(&goflags.BuildTrimpath, "trimpath", false, "")
|
cmdSet.BoolVar(&goflags.BuildTrimpath, "trimpath", false, "")
|
||||||
|
booleanFlags["trimpath"] = struct{}{}
|
||||||
cmdSet.BoolVar(&goflags.BuildWork, "work", false, "")
|
cmdSet.BoolVar(&goflags.BuildWork, "work", false, "")
|
||||||
|
booleanFlags["work"] = struct{}{}
|
||||||
}
|
}
|
||||||
|
|
||||||
func addOutputFlags(cmdSet *flag.FlagSet) {
|
func addOutputFlags(cmdSet *flag.FlagSet) {
|
||||||
|
@ -54,6 +54,9 @@ func (b *Build) readProjectMetaInfo() {
|
|||||||
b.Pkgs = pkgs
|
b.Pkgs = pkgs
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// check if project is in vendor mod
|
||||||
|
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
|
// get working dir in the corresponding tmp dir
|
||||||
@ -69,6 +72,9 @@ func (b *Build) displayProjectMetaInfo() {
|
|||||||
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("Temporary Project Directory: %v", b.TmpModProjectDir)
|
log.Infof("Temporary Project Directory: %v", b.TmpModProjectDir)
|
||||||
|
if b.IsVendorMod {
|
||||||
|
log.Infof("Project in vendor mod")
|
||||||
|
}
|
||||||
log.Infof("")
|
log.Infof("")
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -132,3 +138,16 @@ func (b *Build) listPackages(dir string) map[string]*Package {
|
|||||||
|
|
||||||
return pkgs
|
return pkgs
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (b *Build) checkIfVendorMod() {
|
||||||
|
if b.IsVendorMod == true {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
vendorDir := filepath.Join(b.CurModProjectDir, "vendor")
|
||||||
|
if _, err := os.Stat(vendorDir); err != nil {
|
||||||
|
b.IsVendorMod = false
|
||||||
|
}
|
||||||
|
|
||||||
|
b.IsVendorMod = true
|
||||||
|
}
|
||||||
|
@ -139,6 +139,14 @@ func (b *Build) getPkgTmpDir(pkgDir string) string {
|
|||||||
// 11111_22222_bridge.go 仅仅用于引用 11111_22222_package, where package contains ws agent main logic.
|
// 11111_22222_bridge.go 仅仅用于引用 11111_22222_package, where package contains ws agent main logic.
|
||||||
// 使用 bridge.go 文件是为了避免插桩逻辑中的变量名污染 main 包
|
// 使用 bridge.go 文件是为了避免插桩逻辑中的变量名污染 main 包
|
||||||
func (b *Build) injectGocAgent(where string, covers []*PackageCover) {
|
func (b *Build) injectGocAgent(where string, covers []*PackageCover) {
|
||||||
|
if len(covers) == 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(covers[0].Vars) == 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
injectPkgName := "goc-cover-agent-apis-auto-generated-11111-22222-package"
|
injectPkgName := "goc-cover-agent-apis-auto-generated-11111-22222-package"
|
||||||
injectBridgeName := "goc-cover-agent-apis-auto-generated-11111-22222-bridge.go"
|
injectBridgeName := "goc-cover-agent-apis-auto-generated-11111-22222-bridge.go"
|
||||||
wherePkg := filepath.Join(where, injectPkgName)
|
wherePkg := filepath.Join(where, injectPkgName)
|
||||||
|
@ -40,6 +40,11 @@ func (b *Build) Install() {
|
|||||||
b.updateGoModFile()
|
b.updateGoModFile()
|
||||||
// 3. inject cover vars
|
// 3. inject cover vars
|
||||||
b.Inject()
|
b.Inject()
|
||||||
|
|
||||||
|
if b.IsVendorMod && b.IsModEdit {
|
||||||
|
b.reVendor()
|
||||||
|
}
|
||||||
|
|
||||||
// 4. install in the temp project
|
// 4. install in the temp project
|
||||||
b.doInstallInTemp()
|
b.doInstallInTemp()
|
||||||
}
|
}
|
||||||
|
@ -59,6 +59,11 @@ func (b *Build) Run() {
|
|||||||
b.updateGoModFile()
|
b.updateGoModFile()
|
||||||
// 3. inject cover vars
|
// 3. inject cover vars
|
||||||
b.Inject()
|
b.Inject()
|
||||||
|
|
||||||
|
if b.IsVendorMod && b.IsModEdit {
|
||||||
|
b.reVendor()
|
||||||
|
}
|
||||||
|
|
||||||
// 4. run in the temp project
|
// 4. run in the temp project
|
||||||
go func() {
|
go func() {
|
||||||
ch := make(chan os.Signal, 1)
|
ch := make(chan os.Signal, 1)
|
||||||
|
@ -145,6 +145,7 @@ func (b *Build) updateGoModFile() (updateFlag bool, newModFile []byte) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("fail to update go.mod: %v", err)
|
log.Fatalf("fail to update go.mod: %v", err)
|
||||||
}
|
}
|
||||||
|
b.IsModEdit = true
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user