From 1d785d7d407c7f4764872c296acfd1edfcf74709 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Thu, 24 Oct 2019 15:29:09 +1100 Subject: [PATCH] feat: Install NPM Package --- cmd/program.go | 13 ++++++++++++ cmd/project.go | 19 ++++++++++------- cmd/wails/15_migrate.go | 45 +++++++++++++++++++++++++++++++++++++++-- go.mod | 2 ++ 4 files changed, 70 insertions(+), 9 deletions(-) diff --git a/cmd/program.go b/cmd/program.go index 3b81b225..680dd17e 100644 --- a/cmd/program.go +++ b/cmd/program.go @@ -100,6 +100,19 @@ func (p *ProgramHelper) InstallGoPackage(packageName string) error { return err } +// InstallNPMPackage installs the given npm package +func (p *ProgramHelper) InstallNPMPackage(packageName string, save bool) error { + args := strings.Split("install "+packageName, " ") + if save { + args = append(args, "--save") + } + _, stderr, err := p.shell.Run("npm", args...) + if err != nil { + fmt.Println(stderr) + } + return err +} + // RunCommand runs the given command func (p *ProgramHelper) RunCommand(command string) error { args := strings.Split(command, " ") diff --git a/cmd/project.go b/cmd/project.go index 508e8135..91de152c 100644 --- a/cmd/project.go +++ b/cmd/project.go @@ -13,12 +13,16 @@ import ( "github.com/leaanthony/slicer" ) +// PackageManager indicates different package managers type PackageManager int const ( - unknown PackageManager = iota - npm - yarn + // UNKNOWN package manager + UNKNOWN PackageManager = iota + // NPM package manager + NPM + // YARN package manager + YARN ) type author struct { @@ -161,20 +165,21 @@ func (po *ProjectOptions) Defaults() { po.WailsVersion = Version } +// GetNPMBinaryName returns the type of package manager used by the project func (po *ProjectOptions) GetNPMBinaryName() (PackageManager, error) { if po.FrontEnd == nil { - return unknown, fmt.Errorf("No frontend specified in project options") + return UNKNOWN, fmt.Errorf("No frontend specified in project options") } if strings.Index(po.FrontEnd.Install, "npm") > -1 { - return npm, nil + return NPM, nil } if strings.Index(po.FrontEnd.Install, "yarn") > -1 { - return yarn, nil + return YARN, nil } - return unknown, nil + return UNKNOWN, nil } // PromptForInputs asks the user to input project details diff --git a/cmd/wails/15_migrate.go b/cmd/wails/15_migrate.go index 78585305..5068a136 100644 --- a/cmd/wails/15_migrate.go +++ b/cmd/wails/15_migrate.go @@ -20,6 +20,7 @@ var checkSpinner = spinner.NewSpinner() var migrateProjectOptions = &cmd.ProjectOptions{} var migrateFS = cmd.NewFSHelper() var migrateGithub = cmd.NewGitHubHelper() +var programHelper = cmd.NewProgramHelper() var lessThanV1 *semver.Constraints // The user's go.mod @@ -30,6 +31,9 @@ var goModFile string var mainJSFile string var mainJSContents string +// Frontend directory +var frontEndDir string + func init() { var dryrun bool @@ -147,6 +151,12 @@ func init() { } } + // Install runtime + err = installWailsRuntime() + if err != nil { + return err + } + return nil }) } @@ -230,7 +240,7 @@ func checkWailsBridge() (string, error) { return "", fmt.Errorf("Unable to determine frontend directory") } - frontEndDir := migrateProjectOptions.FrontEnd.Dir + frontEndDir = migrateProjectOptions.FrontEnd.Dir wailsBridgePath, err := filepath.Abs(filepath.Join(".", frontEndDir, "src", "wailsbridge.js")) if err != nil { @@ -263,7 +273,7 @@ func checkMainJS() (bool, error) { return false, fmt.Errorf("Unable to determine frontend directory") } - frontEndDir := migrateProjectOptions.FrontEnd.Dir + frontEndDir = migrateProjectOptions.FrontEnd.Dir mainJSFile, err = filepath.Abs(filepath.Join(".", frontEndDir, "src", "main.js")) if err != nil { @@ -360,3 +370,34 @@ func patchMainJS() error { checkSpinner.Success() return nil } + +func installWailsRuntime() error { + + checkSpinner.Start("Installing @wailsapp/runtime module") + + // Change to the frontend directory + err := os.Chdir(frontEndDir) + if err != nil { + checkSpinner.Error() + return nil + } + + // Determine package manager + packageManager, err := migrateProjectOptions.GetNPMBinaryName() + if err != nil { + checkSpinner.Error() + return nil + } + + switch packageManager { + case cmd.NPM: + // npm install --save @wailsapp/runtime + programHelper.InstallNPMPackage("@wailsapp/runtime", true) + default: + checkSpinner.Error() + return fmt.Errorf("Unknown package manager") + } + + checkSpinner.Success() + return nil +} diff --git a/go.mod b/go.mod index d725cb72..1aa2aaae 100644 --- a/go.mod +++ b/go.mod @@ -29,3 +29,5 @@ require ( gopkg.in/AlecAivazis/survey.v1 v1.8.4 gopkg.in/yaml.v3 v3.0.0-20190709130402-674ba3eaed22 ) + +go 1.13