github.com/AlpineAIO/wails/v2@v2.0.0-beta.32.0.20240505041856-1047a8fa5fef/pkg/commands/bindings/bindings.go (about) 1 package bindings 2 3 import ( 4 "fmt" 5 "log" 6 "os" 7 "path/filepath" 8 "runtime" 9 10 "github.com/AlpineAIO/wails/v2/internal/colour" 11 "github.com/AlpineAIO/wails/v2/internal/shell" 12 "github.com/AlpineAIO/wails/v2/pkg/commands/buildtags" 13 "github.com/samber/lo" 14 ) 15 16 // Options for generating bindings 17 type Options struct { 18 Filename string 19 Tags []string 20 ProjectDirectory string 21 Compiler string 22 GoModTidy bool 23 TsPrefix string 24 TsSuffix string 25 TsOutputType string 26 } 27 28 // GenerateBindings generates bindings for the Wails project in the given ProjectDirectory. 29 // If no project directory is given then the current working directory is used. 30 func GenerateBindings(options Options) (string, error) { 31 filename, _ := lo.Coalesce(options.Filename, "wailsbindings") 32 if runtime.GOOS == "windows" { 33 filename += ".exe" 34 } 35 36 // go build -tags bindings -o bindings.exe 37 tempDir := os.TempDir() 38 filename = filepath.Join(tempDir, filename) 39 40 workingDirectory, _ := lo.Coalesce(options.ProjectDirectory, lo.Must(os.Getwd())) 41 42 var stdout, stderr string 43 var err error 44 45 tags := append(options.Tags, "bindings") 46 genModuleTags := lo.Without(tags, "desktop", "production", "debug", "dev") 47 tagString := buildtags.Stringify(genModuleTags) 48 49 if options.GoModTidy { 50 stdout, stderr, err = shell.RunCommand(workingDirectory, options.Compiler, "mod", "tidy") 51 if err != nil { 52 return stdout, fmt.Errorf("%s\n%s\n%s", stdout, stderr, err) 53 } 54 } 55 56 stdout, stderr, err = shell.RunCommand(workingDirectory, options.Compiler, "build", "-tags", tagString, "-o", filename) 57 if err != nil { 58 return stdout, fmt.Errorf("%s\n%s\n%s", stdout, stderr, err) 59 } 60 61 if runtime.GOOS == "darwin" { 62 // Remove quarantine attribute 63 stdout, stderr, err = shell.RunCommand(workingDirectory, "xattr", "-rc", filename) 64 if err != nil { 65 return stdout, fmt.Errorf("%s\n%s\n%s", stdout, stderr, err) 66 } 67 } 68 69 defer func() { 70 // Best effort removal of temp file 71 _ = os.Remove(filename) 72 }() 73 74 // Set environment variables accordingly 75 env := os.Environ() 76 env = shell.SetEnv(env, "tsprefix", options.TsPrefix) 77 env = shell.SetEnv(env, "tssuffix", options.TsSuffix) 78 env = shell.SetEnv(env, "tsoutputtype", options.TsOutputType) 79 80 stdout, stderr, err = shell.RunCommandWithEnv(env, workingDirectory, filename) 81 if err != nil { 82 return stdout, fmt.Errorf("%s\n%s\n%s", stdout, stderr, err) 83 } 84 85 if stderr != "" { 86 log.Println(colour.DarkYellow(stderr)) 87 } 88 89 return stdout, nil 90 }