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  }