mirror of
https://github.com/wailsapp/wails.git
synced 2025-05-04 01:31:54 +08:00
[v2] Generate module command. Updated wails dev
This commit is contained in:
parent
9e347bf71f
commit
75f703465a
@ -3,6 +3,7 @@ package dev
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/wailsapp/wails/v2/internal/shell"
|
||||||
"io"
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
@ -106,6 +107,13 @@ func AddSubcommand(app *clir.Cli, w io.Writer) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Generate wailsjs module
|
||||||
|
LogGreen("Generating wailsjs module...")
|
||||||
|
_, _, err = shell.RunCommand(cwd, "wails", "generate", "module")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
// frontend:dev server command
|
// frontend:dev server command
|
||||||
if projectConfig.DevCommand != "" {
|
if projectConfig.DevCommand != "" {
|
||||||
var devCommandWaitGroup sync.WaitGroup
|
var devCommandWaitGroup sync.WaitGroup
|
||||||
|
@ -6,8 +6,6 @@ import (
|
|||||||
"github.com/wailsapp/wails/v2/cmd/wails/internal/commands/generate/template"
|
"github.com/wailsapp/wails/v2/cmd/wails/internal/commands/generate/template"
|
||||||
|
|
||||||
"github.com/leaanthony/clir"
|
"github.com/leaanthony/clir"
|
||||||
"github.com/wailsapp/wails/v2/pkg/clilogger"
|
|
||||||
"github.com/wailsapp/wails/v2/pkg/parser"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// AddSubcommand adds the `generate` command for the Wails application
|
// AddSubcommand adds the `generate` command for the Wails application
|
||||||
@ -15,34 +13,11 @@ func AddSubcommand(app *clir.Cli, w io.Writer) error {
|
|||||||
|
|
||||||
command := app.NewSubCommand("generate", "Code Generation Tools")
|
command := app.NewSubCommand("generate", "Code Generation Tools")
|
||||||
|
|
||||||
//AddModuleCommand(app, command, w)
|
err := AddModuleCommand(app, command, w)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
template.AddSubCommand(app, command, w)
|
template.AddSubCommand(app, command, w)
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func logPackage(pkg *parser.Package, logger *clilogger.CLILogger) {
|
|
||||||
|
|
||||||
logger.Println("Processed Go package '" + pkg.Gopackage.Name + "' as '" + pkg.Name + "'")
|
|
||||||
for _, strct := range pkg.Structs() {
|
|
||||||
logger.Println("")
|
|
||||||
logger.Println(" Processed struct '" + strct.Name + "'")
|
|
||||||
if strct.IsBound {
|
|
||||||
for _, method := range strct.Methods {
|
|
||||||
logger.Println(" Bound method '" + method.Name + "'")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if strct.IsUsedAsData {
|
|
||||||
for _, field := range strct.Fields {
|
|
||||||
if !field.Ignored {
|
|
||||||
logger.Print(" Processed ")
|
|
||||||
if field.IsOptional {
|
|
||||||
logger.Print("optional ")
|
|
||||||
}
|
|
||||||
logger.Println("field '" + field.Name + "' as '" + field.JSName() + "'")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
logger.Println("")
|
|
||||||
}
|
|
||||||
|
@ -1,58 +1,50 @@
|
|||||||
package generate
|
package generate
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"io"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/leaanthony/clir"
|
"github.com/leaanthony/clir"
|
||||||
"github.com/wailsapp/wails/v2/pkg/clilogger"
|
"github.com/wailsapp/wails/v2/internal/shell"
|
||||||
"github.com/wailsapp/wails/v2/pkg/parser"
|
"io"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"runtime"
|
||||||
)
|
)
|
||||||
|
|
||||||
func AddModuleCommand(app *clir.Cli, parent *clir.Command, w io.Writer) {
|
// AddModuleCommand adds the `module` subcommand for the `generate` command
|
||||||
|
func AddModuleCommand(app *clir.Cli, parent *clir.Command, w io.Writer) error {
|
||||||
|
|
||||||
// Backend API
|
command := parent.NewSubCommand("module", "Generate wailsjs modules")
|
||||||
backendAPI := parent.NewSubCommand("module", "Generates a JS module for the frontend to interface with the backend")
|
|
||||||
|
|
||||||
// Quiet Init
|
command.Action(func() error {
|
||||||
quiet := false
|
|
||||||
backendAPI.BoolFlag("q", "Suppress output to console", &quiet)
|
|
||||||
|
|
||||||
backendAPI.Action(func() error {
|
filename := "wailsbindings"
|
||||||
|
if runtime.GOOS == "windows" {
|
||||||
|
filename += ".exe"
|
||||||
|
}
|
||||||
|
// go build -tags bindings -o bindings.exe
|
||||||
|
tempDir := os.TempDir()
|
||||||
|
filename = filepath.Join(tempDir, filename)
|
||||||
|
|
||||||
// Create logger
|
cwd, err := os.Getwd()
|
||||||
logger := clilogger.New(w)
|
|
||||||
logger.Mute(quiet)
|
|
||||||
|
|
||||||
app.PrintBanner()
|
|
||||||
|
|
||||||
logger.Print("Generating Javascript module for Go code...")
|
|
||||||
|
|
||||||
// Start Time
|
|
||||||
start := time.Now()
|
|
||||||
|
|
||||||
p, err := parser.GenerateWailsFrontendPackage()
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
logger.Println("done.")
|
_, _, err = shell.RunCommand(cwd, "go", "build", "-tags", "bindings", "-o", filename)
|
||||||
logger.Println("")
|
if err != nil {
|
||||||
|
return err
|
||||||
elapsed := time.Since(start)
|
|
||||||
packages := p.Packages
|
|
||||||
|
|
||||||
// Print report
|
|
||||||
for _, pkg := range p.Packages {
|
|
||||||
if pkg.ShouldGenerate() {
|
|
||||||
logPackage(pkg, logger)
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
logger.Println("%d packages parsed in %s.", len(packages), elapsed)
|
_, _, err = shell.RunCommand(cwd, filename)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = os.Remove(filename)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|
||||||
})
|
})
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
105
v2/internal/appng/app_bindings.go
Normal file
105
v2/internal/appng/app_bindings.go
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
//go:build bindings
|
||||||
|
// +build bindings
|
||||||
|
|
||||||
|
package appng
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/leaanthony/gosod"
|
||||||
|
"github.com/wailsapp/wails/v2/internal/binding"
|
||||||
|
wailsRuntime "github.com/wailsapp/wails/v2/internal/frontend/runtime"
|
||||||
|
"github.com/wailsapp/wails/v2/internal/frontend/runtime/wrapper"
|
||||||
|
"github.com/wailsapp/wails/v2/internal/fs"
|
||||||
|
"github.com/wailsapp/wails/v2/internal/logger"
|
||||||
|
"github.com/wailsapp/wails/v2/internal/project"
|
||||||
|
"github.com/wailsapp/wails/v2/pkg/options"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
)
|
||||||
|
|
||||||
|
// App defines a Wails application structure
|
||||||
|
type App struct {
|
||||||
|
logger *logger.Logger
|
||||||
|
appoptions *options.App
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *App) Run() error {
|
||||||
|
|
||||||
|
// Create binding exemptions - Ugly hack. There must be a better way
|
||||||
|
bindingExemptions := []interface{}{a.appoptions.OnStartup, a.appoptions.OnShutdown, a.appoptions.OnDomReady}
|
||||||
|
appBindings := binding.NewBindings(a.logger, a.appoptions.Bind, bindingExemptions)
|
||||||
|
|
||||||
|
err := generateBindings(appBindings)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateApp creates the app!
|
||||||
|
func CreateApp(appoptions *options.App) (*App, error) {
|
||||||
|
// Set up logger
|
||||||
|
myLogger := logger.New(appoptions.Logger)
|
||||||
|
myLogger.SetLogLevel(appoptions.LogLevel)
|
||||||
|
|
||||||
|
result := &App{
|
||||||
|
logger: myLogger,
|
||||||
|
appoptions: appoptions,
|
||||||
|
}
|
||||||
|
|
||||||
|
return result, nil
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func generateBindings(bindings *binding.Bindings) error {
|
||||||
|
|
||||||
|
cwd, err := os.Getwd()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
projectConfig, err := project.Load(cwd)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
wrapperDir := filepath.Join(projectConfig.WailsJSDir, "wailsjs", "runtime")
|
||||||
|
_ = os.RemoveAll(wrapperDir)
|
||||||
|
extractor := gosod.New(wrapper.RuntimeWrapper)
|
||||||
|
err = extractor.Extract(wrapperDir, nil)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
//ipcdev.js
|
||||||
|
err = os.WriteFile(filepath.Join(wrapperDir, "ipcdev.js"), wailsRuntime.DesktopIPC, 0755)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
//runtimedev.js
|
||||||
|
err = os.WriteFile(filepath.Join(wrapperDir, "runtimedev.js"), wailsRuntime.RuntimeDesktopJS, 0755)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
targetDir := filepath.Join(projectConfig.WailsJSDir, "wailsjs", "go")
|
||||||
|
err = os.RemoveAll(targetDir)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_ = fs.MkDirs(targetDir)
|
||||||
|
|
||||||
|
modelsFile := filepath.Join(targetDir, "models.ts")
|
||||||
|
err = bindings.WriteTS(modelsFile)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Write backend method wrappers
|
||||||
|
bindingsFilename := filepath.Join(targetDir, "bindings.js")
|
||||||
|
err = bindings.GenerateBackendJS(bindingsFilename, true)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
//go:build !dev && !production && windows
|
//go:build !dev && !production && !bindings && windows
|
||||||
|
|
||||||
package appng
|
package appng
|
||||||
|
|
||||||
|
@ -162,7 +162,7 @@ func generateBindings(bindings *binding.Bindings) error {
|
|||||||
|
|
||||||
// Write backend method wrappers
|
// Write backend method wrappers
|
||||||
bindingsFilename := filepath.Join(targetDir, "bindings.js")
|
bindingsFilename := filepath.Join(targetDir, "bindings.js")
|
||||||
err = bindings.GenerateBackendJS(bindingsFilename)
|
err = bindings.GenerateBackendJS(bindingsFilename, false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -16,7 +16,7 @@ import (
|
|||||||
//go:embed assets/package.json
|
//go:embed assets/package.json
|
||||||
var packageJSON []byte
|
var packageJSON []byte
|
||||||
|
|
||||||
func (b *Bindings) GenerateBackendJS(targetfile string) error {
|
func (b *Bindings) GenerateBackendJS(targetfile string, isDevBindings bool) error {
|
||||||
|
|
||||||
store := b.db.store
|
store := b.db.store
|
||||||
var output bytes.Buffer
|
var output bytes.Buffer
|
||||||
@ -24,8 +24,18 @@ func (b *Bindings) GenerateBackendJS(targetfile string) error {
|
|||||||
output.WriteString(`// @ts-check
|
output.WriteString(`// @ts-check
|
||||||
// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
|
// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL
|
||||||
// This file is automatically generated. DO NOT EDIT
|
// This file is automatically generated. DO NOT EDIT
|
||||||
|
`)
|
||||||
|
|
||||||
const go = {`)
|
if isDevBindings {
|
||||||
|
json, err := b.ToJSON()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
output.WriteString("window.wailsbindings = " + json + ";")
|
||||||
|
output.WriteString("\n")
|
||||||
|
}
|
||||||
|
|
||||||
|
output.WriteString(`const go = {`)
|
||||||
output.WriteString("\n")
|
output.WriteString("\n")
|
||||||
|
|
||||||
var sortedPackageNames slicer.StringSlicer
|
var sortedPackageNames slicer.StringSlicer
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
//go:build dev || bindings || (!dev && !production && !bindings)
|
||||||
|
|
||||||
package runtime
|
package runtime
|
||||||
|
|
||||||
import _ "embed"
|
import _ "embed"
|
||||||
|
Loading…
Reference in New Issue
Block a user