mirror of
https://github.com/taigrr/wails.git
synced 2026-04-12 18:11:31 -07:00
handle windows resources + cleanup when done
Moved the file cleanup to a CleanWindows function which simply deletes all the files a Windows compilation generates for the icon resources. Windows resource files MUST be in the same directory as the `go` source or it will not be included in the resulting binary. package.PackageWindows should be renamed to `GenerateWindowsResources` since it doesn't actually package anything but rather generates the various resources that are used during compilation.
This commit is contained in:
committed by
Lea Anthony
parent
a78acbb247
commit
75be8f698a
@@ -83,25 +83,14 @@ func EmbedAssets() ([]string, error) {
|
||||
return targetFiles, nil
|
||||
}
|
||||
|
||||
// BuildDocker builds the project using the cross compiling wailsapp/xgo:latest container
|
||||
func BuildDocker(binaryName string, buildMode string, projectOptions *ProjectOptions) error {
|
||||
if buildMode == BuildModeBridge {
|
||||
return fmt.Errorf("you cant serve the application in cross-compilation")
|
||||
}
|
||||
|
||||
// Check build directory
|
||||
buildDirectory := filepath.Join(fs.Cwd(), "build")
|
||||
if !fs.DirExists(buildDirectory) {
|
||||
fs.MkDir(buildDirectory)
|
||||
}
|
||||
|
||||
func InitializeCrossCompilation(verbose bool) error {
|
||||
// Check Docker
|
||||
if err := CheckIfInstalled("docker"); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
var packSpinner *spinner.Spinner
|
||||
if !projectOptions.Verbose {
|
||||
if !verbose {
|
||||
packSpinner = spinner.New("Pulling wailsapp/xgo:latest docker image... (may take a while)")
|
||||
packSpinner.SetSpinSpeed(50)
|
||||
packSpinner.Start()
|
||||
@@ -109,7 +98,7 @@ func BuildDocker(binaryName string, buildMode string, projectOptions *ProjectOpt
|
||||
println("Pulling wailsapp/xgo:latest docker image... (may take a while)")
|
||||
}
|
||||
|
||||
err := NewProgramHelper(projectOptions.Verbose).RunCommandArray([]string{"docker",
|
||||
err := NewProgramHelper(verbose).RunCommandArray([]string{"docker",
|
||||
"pull", "wailsapp/xgo:latest"})
|
||||
|
||||
if err != nil {
|
||||
@@ -122,6 +111,22 @@ func BuildDocker(binaryName string, buildMode string, projectOptions *ProjectOpt
|
||||
packSpinner.Success()
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// BuildDocker builds the project using the cross compiling wailsapp/xgo:latest container
|
||||
func BuildDocker(binaryName string, buildMode string, projectOptions *ProjectOptions) error {
|
||||
var packSpinner *spinner.Spinner
|
||||
if buildMode == BuildModeBridge {
|
||||
return fmt.Errorf("you cant serve the application in cross-compilation")
|
||||
}
|
||||
|
||||
// Check build directory
|
||||
buildDirectory := filepath.Join(fs.Cwd(), "build")
|
||||
if !fs.DirExists(buildDirectory) {
|
||||
fs.MkDir(buildDirectory)
|
||||
}
|
||||
|
||||
buildCommand := slicer.String()
|
||||
userid := 1000
|
||||
user, _ := user.Current()
|
||||
@@ -168,7 +173,7 @@ func BuildDocker(binaryName string, buildMode string, projectOptions *ProjectOpt
|
||||
println(compileMessage)
|
||||
}
|
||||
|
||||
err = NewProgramHelper(projectOptions.Verbose).RunCommandArray(buildCommand.AsSlice())
|
||||
err := NewProgramHelper(projectOptions.Verbose).RunCommandArray(buildCommand.AsSlice())
|
||||
if err != nil {
|
||||
if packSpinner != nil {
|
||||
packSpinner.Error()
|
||||
@@ -190,6 +195,10 @@ func BuildNative(binaryName string, forceRebuild bool, buildMode string, project
|
||||
return err
|
||||
}
|
||||
|
||||
if err := CheckWindres(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
compileMessage := "Packing + Compiling project"
|
||||
|
||||
if buildMode == BuildModeDebug {
|
||||
@@ -265,6 +274,21 @@ func BuildApplication(binaryName string, forceRebuild bool, buildMode string, pa
|
||||
return err
|
||||
}
|
||||
|
||||
if projectOptions.CrossCompile {
|
||||
if err := InitializeCrossCompilation(projectOptions.Verbose); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
helper := NewPackageHelper(projectOptions.Platform)
|
||||
|
||||
// Generate windows resources
|
||||
if projectOptions.Platform == "windows" {
|
||||
if err := helper.PackageWindows(projectOptions, false); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
// cleanup temporary embedded assets
|
||||
defer func() {
|
||||
for _, filename := range targetFiles {
|
||||
@@ -272,6 +296,9 @@ func BuildApplication(binaryName string, forceRebuild bool, buildMode string, pa
|
||||
fmt.Println(err)
|
||||
}
|
||||
}
|
||||
if projectOptions.Platform == "windows" {
|
||||
helper.CleanWindows(projectOptions)
|
||||
}
|
||||
}()
|
||||
|
||||
if projectOptions.CrossCompile {
|
||||
@@ -302,15 +329,6 @@ func PackageApplication(projectOptions *ProjectOptions) error {
|
||||
packageSpinner.Start()
|
||||
}
|
||||
|
||||
if projectOptions.Platform == "windows" {
|
||||
if err := NewPackageHelper(projectOptions.Platform).PackageWindows(projectOptions, true); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := CheckWindres(); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
err := NewPackageHelper(projectOptions.Platform).Package(projectOptions)
|
||||
if err != nil {
|
||||
if packageSpinner != nil {
|
||||
@@ -373,7 +391,7 @@ func CheckMewn(verbose bool) (err error) {
|
||||
|
||||
// CheckWindres checks if Windres is installed and if not, aborts
|
||||
func CheckWindres() (err error) {
|
||||
if runtime.GOOS != "windows" {
|
||||
if runtime.GOOS != "windows" { // FIXME: Handle windows cross-compile for windows!
|
||||
return nil
|
||||
}
|
||||
programHelper := NewProgramHelper()
|
||||
|
||||
@@ -173,13 +173,25 @@ func (b *PackageHelper) packageOSX(po *ProjectOptions) error {
|
||||
return err
|
||||
}
|
||||
|
||||
// CleanWindows removes any windows related files found in the directory
|
||||
func (b *PackageHelper) CleanWindows(po *ProjectOptions) {
|
||||
pdir := b.fs.Cwd()
|
||||
basename := strings.TrimSuffix(po.BinaryName, ".exe")
|
||||
exts := []string{".ico", ".exe.manifest", ".rc", "-res.syso"}
|
||||
rsrcs := []string{}
|
||||
for _, ext := range exts {
|
||||
rsrcs = append(rsrcs, filepath.Join(pdir, basename+ext))
|
||||
}
|
||||
b.fs.RemoveFiles(rsrcs, true)
|
||||
}
|
||||
|
||||
// PackageWindows packages the application for windows platforms
|
||||
func (b *PackageHelper) PackageWindows(po *ProjectOptions, cleanUp bool) error {
|
||||
build := path.Join(b.fs.Cwd(), "build")
|
||||
outputDir := b.fs.Cwd()
|
||||
basename := strings.TrimSuffix(po.BinaryName, ".exe")
|
||||
|
||||
// Copy icon
|
||||
tgtIconFile := filepath.Join(build, basename+".ico")
|
||||
tgtIconFile := filepath.Join(outputDir, basename+".ico")
|
||||
if !b.fs.FileExists(tgtIconFile) {
|
||||
srcIconfile := filepath.Join(b.getPackageFileBaseDir(), "wails.ico")
|
||||
err := b.fs.CopyFile(srcIconfile, tgtIconFile)
|
||||
@@ -189,7 +201,7 @@ func (b *PackageHelper) PackageWindows(po *ProjectOptions, cleanUp bool) error {
|
||||
}
|
||||
|
||||
// Copy manifest
|
||||
tgtManifestFile := filepath.Join(build, basename+".exe.manifest")
|
||||
tgtManifestFile := filepath.Join(outputDir, basename+".exe.manifest")
|
||||
if !b.fs.FileExists(tgtManifestFile) {
|
||||
srcManifestfile := filepath.Join(b.getPackageFileBaseDir(), "wails.exe.manifest")
|
||||
err := b.fs.CopyFile(srcManifestfile, tgtManifestFile)
|
||||
@@ -199,7 +211,7 @@ func (b *PackageHelper) PackageWindows(po *ProjectOptions, cleanUp bool) error {
|
||||
}
|
||||
|
||||
// Copy rc file
|
||||
tgtRCFile := filepath.Join(build, basename+".rc")
|
||||
tgtRCFile := filepath.Join(outputDir, basename+".rc")
|
||||
if !b.fs.FileExists(tgtRCFile) {
|
||||
srcRCfile := filepath.Join(b.getPackageFileBaseDir(), "wails.rc")
|
||||
rcfilebytes, err := ioutil.ReadFile(srcRCfile)
|
||||
@@ -214,17 +226,18 @@ func (b *PackageHelper) PackageWindows(po *ProjectOptions, cleanUp bool) error {
|
||||
}
|
||||
|
||||
// Build syso
|
||||
sysofile := filepath.Join(build, basename+"-res.syso")
|
||||
sysofile := filepath.Join(outputDir, basename+"-res.syso")
|
||||
|
||||
// cross-compile
|
||||
if b.platform != runtime.GOOS {
|
||||
args := []string{
|
||||
"docker", "run", "--rm",
|
||||
"-v", build + ":/build",
|
||||
"-v", outputDir + ":/build",
|
||||
"--entrypoint", "/bin/sh",
|
||||
"wailsapp/xgo:latest",
|
||||
"-c", "/usr/bin/x86_64-w64-mingw32-windres -o /build/" + basename + "-res.syso /build/" + basename + ".rc",
|
||||
}
|
||||
fmt.Println(args)
|
||||
if err := NewProgramHelper().RunCommandArray(args); err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -241,16 +254,6 @@ func (b *PackageHelper) PackageWindows(po *ProjectOptions, cleanUp bool) error {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
// clean up
|
||||
if cleanUp {
|
||||
filesToDelete := []string{tgtIconFile, tgtManifestFile, tgtRCFile, sysofile}
|
||||
err := b.fs.RemoveFiles(filesToDelete)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user