github.com/c3pm-labs/c3pm@v0.3.0/ctpm/build.go (about) 1 package ctpm 2 3 import ( 4 "fmt" 5 "github.com/Masterminds/semver/v3" 6 "github.com/c3pm-labs/c3pm/adapter" 7 "github.com/c3pm-labs/c3pm/adapter_interface" 8 "github.com/c3pm-labs/c3pm/config" 9 "github.com/c3pm-labs/c3pm/config/manifest" 10 "github.com/c3pm-labs/c3pm/dependencies" 11 ) 12 13 type DependencyBuilder struct { 14 Done manifest.Dependencies 15 } 16 17 func (d DependencyBuilder) FetchDeps(request dependencies.PackageRequest) (dependencies.Dependencies, error) { 18 if _, ok := d.Done[request.Name]; ok { 19 return dependencies.Dependencies{}, nil 20 } 21 libPath := config.LibCachePath(request.Name, request.Version) 22 pc, err := config.Load(libPath) 23 if err != nil { 24 return nil, fmt.Errorf("failed to read c3pm.yml: %w", err) 25 } 26 ret := make(dependencies.Dependencies) 27 for k, v := range pc.Manifest.Dependencies { 28 ret[k] = v 29 } 30 return ret, nil 31 } 32 33 func (d DependencyBuilder) PreAct(_ dependencies.PackageRequest) error { return nil } 34 func (d DependencyBuilder) PostAct(request dependencies.PackageRequest) error { 35 fmt.Printf("Building %s:%s\n", request.Name, request.Version) 36 37 libPath := config.LibCachePath(request.Name, request.Version) 38 pc, err := config.Load(libPath) 39 if err != nil { 40 return fmt.Errorf("failed to read c3pm.yml: %w", err) 41 } 42 getter := adapter.AdapterGetterImp{} 43 var adp adapter_interface.Adapter 44 adp, err = getter.FromPC(pc.Manifest.Build.Adapter) 45 if err != nil { 46 return err 47 } 48 err = adp.Build(pc) 49 if err != nil { 50 return fmt.Errorf("error building: %w", err) 51 } 52 d.Done[fmt.Sprintf(request.Name)] = request.Version 53 return nil 54 } 55 56 func getAllDependencies(pc *config.ProjectConfig) error { 57 allDeps := make(manifest.Dependencies) 58 allDeps[pc.Manifest.Name] = pc.Manifest.Version.String() 59 for name, version := range pc.Manifest.Dependencies { 60 _, err := dependencies.Install(dependencies.PackageRequest{Name: name, Version: version}, DependencyBuilder{Done: allDeps}) 61 if err != nil { 62 return err 63 } 64 } 65 delete(allDeps, pc.Manifest.Name) 66 pc.Manifest.Dependencies = allDeps 67 return nil 68 } 69 70 func Build(pc *config.ProjectConfig) error { 71 getter := adapter.AdapterGetterImp{} 72 adp, err := getter.FromPC(pc.Manifest.Build.Adapter) 73 if err != nil { 74 return err 75 } 76 err = getAllDependencies(pc) 77 if err != nil { 78 return err 79 } 80 return adp.Build(pc) 81 } 82 83 func addAllDependencies(pc *config.ProjectConfig) error { 84 for dep, version := range pc.Manifest.Dependencies { 85 semverVersion, err := semver.NewVersion(version) 86 if err != nil { 87 return fmt.Errorf("error getting dependencies: %w", err) 88 } 89 if err := Install(dep, semverVersion.String()); err != nil { 90 return fmt.Errorf("error adding %s: %w", dep, err) 91 } 92 } 93 return nil 94 } 95 96 func AddDependenciesAndBuild(pc *config.ProjectConfig) error { 97 err := addAllDependencies(pc) 98 if err != nil { 99 return fmt.Errorf("error installing dependencies: %w", err) 100 } 101 err = Build(pc) 102 if err != nil { 103 return fmt.Errorf("build failed: %w", err) 104 } 105 return nil 106 }