From e9deb248f9c1c054476e6add180f131cada6ad47 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Thu, 13 May 2021 20:12:19 +1000 Subject: [PATCH] Move assets -> build dir. Bundle assets in CLI binary. --- .gitignore | 2 + v2/.vscode/settings.json | 13 --- .../commands/initialise/initialise.go | 9 ++- v2/go.mod | 3 +- v2/go.sum | 8 +- v2/internal/app/server.go | 8 +- .../ffenestri/windows/test/CMakeLists.txt | 7 +- .../ffenestri/windows/test/compile.bat | 1 - v2/internal/project/project.go | 8 +- v2/pkg/buildassets/build/README.md | 52 ++++++++++++ v2/pkg/buildassets/build/appicon.png | Bin 0 -> 44860 bytes .../buildassets/build/darwin/Info.tmpl.plist | 14 ++++ v2/pkg/buildassets/build/dialog/README.md | 3 + v2/pkg/buildassets/build/dialog/info-dark.png | Bin 0 -> 780 bytes .../buildassets/build/dialog/info-dark2x.png | Bin 0 -> 1295 bytes .../buildassets/build/dialog/info-light.png | Bin 0 -> 764 bytes .../buildassets/build/dialog/info-light2x.png | Bin 0 -> 1293 bytes .../build/dialog/question-dark.png | Bin 0 -> 941 bytes .../build/dialog/question-dark2x.png | Bin 0 -> 1557 bytes .../build/dialog/question-light.png | Bin 0 -> 930 bytes .../build/dialog/question-light2x.png | Bin 0 -> 1538 bytes .../buildassets/build/dialog/warning-dark.png | Bin 0 -> 830 bytes .../build/dialog/warning-dark2x.png | Bin 0 -> 1274 bytes .../build/dialog/warning-light.png | Bin 0 -> 720 bytes .../build/dialog/warning-light2x.png | Bin 0 -> 1262 bytes .../build/windows/wails.exe.manifest | 12 +++ .../buildassets/build/windows/wails.rc.tmpl | 2 + v2/pkg/buildassets/buildassets.go | 76 ++++++++++++++++++ v2/pkg/commands/build/base.go | 13 ++- v2/pkg/commands/build/build.go | 13 ++- v2/pkg/commands/build/desktop.go | 6 +- v2/pkg/commands/build/desktop_darwin.go | 4 +- v2/pkg/commands/build/desktop_windows.go | 4 +- v2/pkg/commands/build/hybrid.go | 18 ----- .../build/internal/packager/darwin/Info.plist | 12 +-- .../build/internal/packager/linux/AppRun | 3 - v2/pkg/commands/build/packager.go | 2 +- v2/pkg/commands/build/packager_darwin.go | 4 +- v2/pkg/commands/build/packager_windows.go | 74 ++++++++++++++++- v2/pkg/commands/build/server.go | 6 -- 40 files changed, 298 insertions(+), 79 deletions(-) delete mode 100644 v2/.vscode/settings.json delete mode 100644 v2/internal/ffenestri/windows/test/compile.bat create mode 100644 v2/pkg/buildassets/build/README.md create mode 100644 v2/pkg/buildassets/build/appicon.png create mode 100644 v2/pkg/buildassets/build/darwin/Info.tmpl.plist create mode 100644 v2/pkg/buildassets/build/dialog/README.md create mode 100644 v2/pkg/buildassets/build/dialog/info-dark.png create mode 100644 v2/pkg/buildassets/build/dialog/info-dark2x.png create mode 100644 v2/pkg/buildassets/build/dialog/info-light.png create mode 100644 v2/pkg/buildassets/build/dialog/info-light2x.png create mode 100644 v2/pkg/buildassets/build/dialog/question-dark.png create mode 100644 v2/pkg/buildassets/build/dialog/question-dark2x.png create mode 100644 v2/pkg/buildassets/build/dialog/question-light.png create mode 100644 v2/pkg/buildassets/build/dialog/question-light2x.png create mode 100644 v2/pkg/buildassets/build/dialog/warning-dark.png create mode 100644 v2/pkg/buildassets/build/dialog/warning-dark2x.png create mode 100644 v2/pkg/buildassets/build/dialog/warning-light.png create mode 100644 v2/pkg/buildassets/build/dialog/warning-light2x.png create mode 100644 v2/pkg/buildassets/build/windows/wails.exe.manifest create mode 100644 v2/pkg/buildassets/build/windows/wails.rc.tmpl create mode 100644 v2/pkg/buildassets/buildassets.go delete mode 100644 v2/pkg/commands/build/internal/packager/linux/AppRun diff --git a/.gitignore b/.gitignore index c6fb8433..620386a6 100644 --- a/.gitignore +++ b/.gitignore @@ -28,4 +28,6 @@ v2/test/kitchensink/frontend/public v2/test/kitchensink/build/darwin/desktop/kitchensink v2/test/kitchensink/frontend/package.json.md5 /v2/internal/ffenestri/windows/test/cmake-build-debug/ +!v2/internal/ffenestri/windows/x64/webview2.dll +!v2/internal/ffenestri/windows/x64/WebView2Loader.dll .idea/ diff --git a/v2/.vscode/settings.json b/v2/.vscode/settings.json deleted file mode 100644 index 01d4ec2d..00000000 --- a/v2/.vscode/settings.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "files.associations": { - "ios": "c", - "typeinfo": "c", - "sstream": "c", - "__functional_03": "c", - "functional": "c", - "__locale": "c", - "locale": "c", - "chrono": "c", - "system_error": "c" - } -} \ No newline at end of file diff --git a/v2/cmd/wails/internal/commands/initialise/initialise.go b/v2/cmd/wails/internal/commands/initialise/initialise.go index 04063d74..f83ca10a 100644 --- a/v2/cmd/wails/internal/commands/initialise/initialise.go +++ b/v2/cmd/wails/internal/commands/initialise/initialise.go @@ -2,6 +2,7 @@ package initialise import ( "fmt" + "github.com/wailsapp/wails/v2/pkg/buildassets" "io" "strings" "time" @@ -40,7 +41,7 @@ func AddSubcommand(app *clir.Cli, w io.Writer) error { // Quiet Init quiet := false - command.BoolFlag("q", "Supress output to console", &quiet) + command.BoolFlag("q", "Suppress output to console", &quiet) initGit := false gitInstalled := git.IsInstalled() @@ -129,6 +130,12 @@ func initProject(options *templates.Options) error { return err } + // Install the default assets + err = buildassets.Install(options.TargetDir, options.ProjectName) + if err != nil { + return err + } + if options.InitGit { err = initGit(options) if err != nil { diff --git a/v2/go.mod b/v2/go.mod index 87457ccf..50e44097 100644 --- a/v2/go.mod +++ b/v2/go.mod @@ -10,10 +10,11 @@ require ( github.com/imdario/mergo v0.3.11 github.com/jackmordaunt/icns v1.0.0 github.com/leaanthony/clir v1.0.4 - github.com/leaanthony/debme v1.1.2 + github.com/leaanthony/debme v1.2.0 github.com/leaanthony/go-ansi-parser v1.0.1 github.com/leaanthony/gosod v1.0.1 github.com/leaanthony/slicer v1.5.0 + github.com/leaanthony/winicon v0.0.0-20200606125418-4419cea822a0 github.com/matryer/is v1.4.0 github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 // indirect github.com/olekukonko/tablewriter v0.0.4 diff --git a/v2/go.sum b/v2/go.sum index e4b2e6c3..18148d49 100644 --- a/v2/go.sum +++ b/v2/go.sum @@ -42,14 +42,16 @@ github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYs github.com/leaanthony/clir v1.0.4 h1:Dov2y9zWJmZr7CjaCe86lKa4b5CSxskGAt2yBkoDyiU= github.com/leaanthony/clir v1.0.4/go.mod h1:k/RBkdkFl18xkkACMCLt09bhiZnrGORoxmomeMvDpE0= github.com/leaanthony/debme v1.1.1/go.mod h1:3V+sCm5tYAgQymvSOfYQ5Xx2JCr+OXiD9Jkw3otUjiA= -github.com/leaanthony/debme v1.1.2 h1:dGeQuj0+xPIlDQzGIjmAU52+yRg85u5pWaaqrdLBjD0= -github.com/leaanthony/debme v1.1.2/go.mod h1:3V+sCm5tYAgQymvSOfYQ5Xx2JCr+OXiD9Jkw3otUjiA= +github.com/leaanthony/debme v1.2.0 h1:i7JUQhuv7PtJ/7qV+SIa5QARTGBcojUZ+2eCiV9begU= +github.com/leaanthony/debme v1.2.0/go.mod h1:3V+sCm5tYAgQymvSOfYQ5Xx2JCr+OXiD9Jkw3otUjiA= github.com/leaanthony/go-ansi-parser v1.0.1 h1:97v6c5kYppVsbScf4r/VZdXyQ21KQIfeQOk2DgKxGG4= github.com/leaanthony/go-ansi-parser v1.0.1/go.mod h1:7arTzgVI47srICYhvgUV4CGd063sGEeoSlych5yeSPM= github.com/leaanthony/gosod v1.0.1 h1:F+4c3DmEBfigi7oAswCV2RpQ+k4DcNbhuCZUGdBHacQ= github.com/leaanthony/gosod v1.0.1/go.mod h1:W8RyeSFBXu7RpIxPGEJfW4moSyGGEjlJMLV25wEbAdU= github.com/leaanthony/slicer v1.5.0 h1:aHYTN8xbCCLxJmkNKiLB6tgcMARl4eWmH9/F+S/0HtY= github.com/leaanthony/slicer v1.5.0/go.mod h1:FwrApmf8gOrpzEWM2J/9Lh79tyq8KTX5AzRtwV7m4AY= +github.com/leaanthony/winicon v0.0.0-20200606125418-4419cea822a0 h1:FPGYnfxuuxqCZhrGq8nKjthEcYHgHmFbyY953Xv9cNI= +github.com/leaanthony/winicon v0.0.0-20200606125418-4419cea822a0/go.mod h1:en5xhijl92aphrJdmRPlh4NI1L6wq3gEm0LpXAPghjU= github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE= @@ -92,6 +94,8 @@ github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9dec golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/image v0.0.0-20200430140353-33d19683fad8 h1:6WW6V3x1P/jokJBpRQYUJnMHRP6isStQwCozxnU7XQw= +golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= diff --git a/v2/internal/app/server.go b/v2/internal/app/server.go index 52b8ca28..620139c4 100644 --- a/v2/internal/app/server.go +++ b/v2/internal/app/server.go @@ -79,7 +79,7 @@ func (a *App) Run() error { // Default app options var port = 8080 var ip = "localhost" - var supressLogging = false + var SuppressLogging = false var debugMode = false // Create CLI @@ -89,7 +89,7 @@ func (a *App) Run() error { cli.IntFlag("p", "Port to serve on", &port) cli.StringFlag("i", "IP to serve on", &ip) cli.BoolFlag("d", "Debug mode", &debugMode) - cli.BoolFlag("q", "Supress logging", &supressLogging) + cli.BoolFlag("q", "Suppress logging", &SuppressLogging) // Setup main action cli.Action(func() error { @@ -98,8 +98,8 @@ func (a *App) Run() error { a.webserver.SetPort(port) a.webserver.SetIP(ip) a.webserver.SetBindings(a.bindings) - // Log information (if we aren't supressing it) - if !supressLogging { + // Log information (if we aren't Suppressing it) + if !SuppressLogging { cli.PrintBanner() a.logger.Info("Running server at %s", a.webserver.URL()) } diff --git a/v2/internal/ffenestri/windows/test/CMakeLists.txt b/v2/internal/ffenestri/windows/test/CMakeLists.txt index fd324685..304e016f 100644 --- a/v2/internal/ffenestri/windows/test/CMakeLists.txt +++ b/v2/internal/ffenestri/windows/test/CMakeLists.txt @@ -1,7 +1,6 @@ cmake_minimum_required(VERSION 3.19) -project(test C) +project(test) -set(CMAKE_C_STANDARD 99) -set(SOURCES ../../ffenestri_windows.cpp) +set(CMAKE_CXX_STANDARD 14) -add_executable(test ${SOURCES} main.c) \ No newline at end of file +add_executable(test main.cpp) \ No newline at end of file diff --git a/v2/internal/ffenestri/windows/test/compile.bat b/v2/internal/ffenestri/windows/test/compile.bat deleted file mode 100644 index 9dfd45d1..00000000 --- a/v2/internal/ffenestri/windows/test/compile.bat +++ /dev/null @@ -1 +0,0 @@ -g++ main.c ..\..\ffenestri_windows.cpp -lgdi32 -std=c++11 \ No newline at end of file diff --git a/v2/internal/project/project.go b/v2/internal/project/project.go index ff30cfb0..015a905c 100644 --- a/v2/internal/project/project.go +++ b/v2/internal/project/project.go @@ -25,8 +25,8 @@ type Project struct { // The path to the project directory Path string - // Assets directory - AssetsDir string `json:"assetsdir"` + // Build directory + BuildDir string `json:"builddir"` // The output filename OutputFilename string `json:"outputfilename"` @@ -76,8 +76,8 @@ func Load(projectPath string) (*Project, error) { } // Set default assets directory if none given - if result.AssetsDir == "" { - result.AssetsDir = filepath.Join(result.Path, "assets") + if result.BuildDir == "" { + result.BuildDir = filepath.Join(result.Path, "build") } // Fix up OutputFilename diff --git a/v2/pkg/buildassets/build/README.md b/v2/pkg/buildassets/build/README.md new file mode 100644 index 00000000..b8c1271f --- /dev/null +++ b/v2/pkg/buildassets/build/README.md @@ -0,0 +1,52 @@ +# Assets Directory + +The assets directory is used to house all the assets of your application. + +The structure is: + + * dialog - Icons for dialogs + * tray - Icons for the system tray + * mac - MacOS specific files + * linux - Linux specific files + * windows - Windows specific files + +## Dialog Icons + +Place any PNG file in this directory to be able to use them in message dialogs. +The files should have names in the following format: `name[-(light|dark)][2x].png` + +Examples: + +* `mypic.png` - Standard definition icon with ID `mypic` +* `mypic-light.png` - Standard definition icon with ID `mypic`, used when system theme is light +* `mypic-dark.png` - Standard definition icon with ID `mypic`, used when system theme is dark +* `mypic2x.png` - High definition icon with ID `mypic` +* `mypic-light2x.png` - High definition icon with ID `mypic`, used when system theme is light +* `mypic-dark2x.png` - High definition icon with ID `mypic`, used when system theme is dark + +### Order of preference + +Icons are selected with the following order of preference: + +For High Definition displays: +* name-(theme)2x.png +* name2x.png +* name-(theme).png +* name.png + +For Standard Definition displays: +* name-(theme).png +* name.png + +## Tray + +Place any PNG file in this directory to be able to use them as tray icons. +The name of the filename will be the ID to reference the image. + +Example: + +* `mypic.png` - May be referenced using `runtime.Tray.SetIcon("mypic")` + +## Mac + +The `mac` directory holds files specific to Mac builds, such as `Info.plist`. These may be edited and used as part of the build. diff --git a/v2/pkg/buildassets/build/appicon.png b/v2/pkg/buildassets/build/appicon.png new file mode 100644 index 0000000000000000000000000000000000000000..a3ad26ce7377c1b97dbada650f6f3faf86fe2cd0 GIT binary patch literal 44860 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 + + CFBundlePackageTypeAPPL + CFBundleName{{.Name}} + CFBundleExecutable{{.Name}} + CFBundleIdentifiercom.wails.{{.Name}} + CFBundleVersion1.0.0 + CFBundleGetInfoStringBuilt using Wails (https://wails.app) + CFBundleShortVersionString1.0.0 + CFBundleIconFileiconfile + LSMinimumSystemVersion10.13.0 + NSHighResolutionCapabletrue + NSHumanReadableCopyrightCopyright......... + \ No newline at end of file diff --git a/v2/pkg/buildassets/build/dialog/README.md b/v2/pkg/buildassets/build/dialog/README.md new file mode 100644 index 00000000..b9ddc278 --- /dev/null +++ b/v2/pkg/buildassets/build/dialog/README.md @@ -0,0 +1,3 @@ +# Default Dialog Icons + +This directory contains the default dialog icons. These are pre-compiled into a single C file (`defaultDialogIcons.c`) which resides in the `ffenestri` directory. If these icons are ever updated, then there is a need to run: `go run build.go` in this directory. This will generate a new `defaultDialogIcons.c` file in the `ffenestri` directory. \ No newline at end of file diff --git a/v2/pkg/buildassets/build/dialog/info-dark.png b/v2/pkg/buildassets/build/dialog/info-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..9ff6655ee1e8521c643dd76100bab11a6c3f65e8 GIT binary patch literal 780 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4rT@hhPm4t-!L#Rv;_EsxH2#>{2yqbaQoRs z1_lQ0k|4iehM#jbKKGtzCH+{AYhB=j8AdE=x!TFG5`xz*oH*pbUMA+TKtKHBht_f( z{@j+owhRnRJf1F&ArXh)hTojlWWXb;<2^CfL4fsp>YxArXD6Rp=)j%0?6~=7iAlH9 zc4kJ@Jl&ks?)Ix0Ad1qHjM|Vzs?w52_FIVyU$ddHy&vl%n`xld+JZ~VlO&RYBQV0$%Z<6X_Y?#{X{ujQ+( z_?bQ*xg$42HjC$=Q1!DlDo$C8gd&t~xlI%8jCv3wS!%d4K!3uWt0v#w1Ds1&-c99H zxhC{db$K7FD)(+1CSRopHm8FQLKf>!uMjDEapLE~?mf*q%Vd53hKc-)Y1mWoIy;r& zslW!6A_kkzJv|l-`pVZlWEk>Q?wzt=$WLwYkzr65PS@Z&(7Unm5aWl&L+(;s2i&Es zLM&%aSlHF~wIpfHWB$``+iY}hT%M-#YL%l)@!wXVb|ZN7aek~b!`uCEl| zJ^dl~re}%WYJ%dvUqi!dZ-&Kxzgll`rM~jR{B^t9=C4~{6H>>>?$y6l@PF`u1FAYq7j3_H$M$=uDn8nr{=)b|juYo;{%?o&Y*EZpfV=MQY&X|j#IHdrO5bIA+ypPb=pFV_n= zrynqtu(17_YV&lKPx1@C;tF<|YnFdEU*q|GdvT?C&+f`Qzt)=0D%Ek$`=}PSPTa_0 z!-eATJ)GL@d@PUKPJDm9=jiRv`xJ#AGi;e@zwf-+I)w*WH~Qtymp)DZWF^e+v4?Yg zveDZ2_9xEoY7h~B?bu}{cja;XnVDPOe|EKHm-@P1^pdPr>H6r&{hRoj979jBY6$hN zW@PF58((|pl*7z3tJ)@Lr*8PQ;V+-mp4(Ry+HUcFIOxFrZQ*S$zok`d8Ob42o;0W! z9+$Yl*qof?$>^i~v)%8{!;Y73dl}4{{S2aaawx}`d$0NLf7qngzfeCS!e4oTXTj&L z-}Ybk_xurYNvT+(;t-V3t}L)o=8t)FQwPWLEdgE)+)iQl*@ZX?LxUbX{Hs1MHZfDO z>o(VWH~u3xK1u87>IMsJI+p9Yh2b58TCR7;>`0lLUgsOQuRgl}NzV9{+oZXyJfYc4 zBE>(mneTSmDWB@P;*{uhKU!|O@EOi-*QSbRzc))5Y}w&|;Z&}>{=s+Ih2_m=OeQSr zFKCCG@G;MvxV3%W&Bct`i?14gITN{Pf18G{oLdcillsD$i{V=Bu83i$;pzRZ8b_%?j$k~~J|{P)ZzkEa_YItZ`&dD^Sf zf8j*lC6I>b1&SLVMT`@e1ZY??ewjsiAEl8;n$2~1E)SN!+Cl(D!|LSrM(W^HTv z4UTu`zFfyy&-ze4@khQyoxs6B9;PFKXQm5s2TT`?Kd$2td;HFX4GdQ&6nGzF3h_SX ztH~YUtGWHDj>FccHZwLbn9lf+ag6Co#<9bi+yRF*`=9F^=zX3Ouz?{zV1w&nrai8Q z)kL`yCZD=dqSKITl^U{%!A$G&wyeizU-_2(J$&=4-G&_<2b^5Ze9cWGdOLDbGQO^9 zTi6tnEf@7v;Pz4W=?^dF)>Q0`uCaHh`JdkKa4Um^lVIQNtByLoZ4pI>E9x42{#H#` z8QC6x~wQ&vr2HmwL2T{RcyGq;O_Uu2i|f%_{*tdQ4?l! zE_+^G+`0;x)RU@>rt{ysF3#NZ1xwdPorfP+*3R!vfE8C&W)t?LN`ZyRE P7#KWV{an^LB{Ts5m^Yzu literal 0 HcmV?d00001 diff --git a/v2/pkg/buildassets/build/dialog/info-light.png b/v2/pkg/buildassets/build/dialog/info-light.png new file mode 100644 index 0000000000000000000000000000000000000000..1fb32e8a9988bdb6b611bb47e705182219d755e4 GIT binary patch literal 764 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4rT@hhPm4t-!L#Rlm_^OxH1d`sEn+QU|?WS zD+%%oX85!8B=47+t9|uq!WD1bA1rX@IQsI=mJJg+vI8~c_eoBfY;GnMQGH;RKLZ1k zfTxRNNW|f{;Wsxm8Sscs^mTBU;=A+R-~ax5CX4W1W^%ONH}fLG%#QtwT zraRsL&HVm7cVqCQOTxQ#-m;v0F~v^2uF?3QetG^wv69;#o;_R9vN5ShGTYzd^o>|; zq5lvRUG>{NKBp zlbAXm@W0#NqaWeprLdNdndMERt?s|GZn3Ph-iBM5@ZI2gHD92|5fJe%{^(sMaXzjiIR6xNnuD6D&#E~9bkCxhyX;ADo! zsuGh=wUvEA)1j#*Ob@)JL_@_I zy0oINy|ge+z562R;reYl$?MD>pAOxBubF>+`DeD~D4E&0g?3q+-uX;Ey0xl2};>s}iKvku3DFXw8 zK}nEbFvIUq)+Y{J+pj0N@Ew@4Njt;uo#nAc55-Q27seO%o}Sh(-2Lt0isqWaoFFw- zDeG8ehHK#r49q`0T^vIyZoQd)y==7ukE`jznOVs^JB06e*DU`3f7kB3$O^Rtm9EX7 z9{jbDiL&P+U5W89Md;k1)k7)$NriW?l~Uz-1vGduQry}+}O1nwhS z)GIm4Z%m5iu-$Nw&u4dc+y{fhzpPI5ZL2-gwDsQxH%IqMANGi&Mtx}u47wkwh8cP+ zWIiV0&GCMUUB|a4oH~YP3rrV(s+~61nRjRIRAsrXqIL57jXEW|EDx^#5w-gNcCV*< z7`jg{n6lkW@W%=x`OG&r+>1j#MqiN^b;&UkIv=sX>9L(b%dJy>$=`$6JtTOa*RKit z&n)%XFu-0hcS-%Le%o9uMCdcS<_Q>m7pZ<6KzRdgxgVpldH>Fqh z9(rUQ(ZtGmKTQS=V^5H;(H|^=yXb$jud|h1;1|9C3NXQZBEs zpWj!>eb1bIi3g<(B7!A%3!S$xV))nmIqL3}hzYjJ4LsapQ$%Iw3m%xbY4L;)Nk$C& zl-uo%8}7f2KF!x;AdtiKw$+8dMMF)(?~cg7|F3%#<77@=@=MixS#wautNi)KSN4s+ z<_G*W4yo_>p!tmRg#SjHo(d+5o*RWdEH?^!xH+92;yi9l<>B0*EvdJZhp|#K^?H$t z!}_NhJ{(Mo3>Gex6nd~!vMac$LB%h#vX7;rvX70`(ZNWgqMMELgBb6u5FW;xOCIG~ zsT{ank`eNW<-&?P+e5QoeN8L%o^f^J+h5k{*FQHNoynooae_@p>ivl}{3 zhBMRB=H|1vy7hZKPu_WHX4%Tpc|H$!$Su6FCjRX;{q6e`cc0{*Yq~M;Gdtg(PIt?- z4xH+8?UqF|EpMd#JhOab>rJM2-xp3czI|xx{NVN1X7+$U!XAd3f98FCx6WJ$RIGWr L`njxgN@xNA-G3Q7 literal 0 HcmV?d00001 diff --git a/v2/pkg/buildassets/build/dialog/question-dark.png b/v2/pkg/buildassets/build/dialog/question-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..c2387420ef7e9060fc9576d7bfe0da524e26f27e GIT binary patch literal 941 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4rT@hhPm4t-!L#R%na}eab;j&_&+GYRaur0 z1_lPBk|4iehMzLeHd>3HT+7z)=k4(A@q>d3f=MAJ2HLULF3c!P<(@q$*Mo_ZdCu0k zZ(r=LxYJxXzbshBkb!||qNj^vNW|f{;n~%z40!DBusF6B3WrDpFF$vB+vflOANMU; zs>#Cl?&aqE)9SY;nN)sO>#eVQ>YloOd0dRh#_6wqzt8r!x&CddzQEb-vH72LOS6S* zN>y$|@UK39_E(nDEX#TiTN|#@q(>5cug^0@9*$Vcb2H9B`tp6fS^2!nw;0)WeL15g zyZB~o&i~c_{wO{2E&1u-&!VS){_wB$eE(l$UKhSCY+n+`&imnaZ_TZ8tFyfC4k!G1 zQ?pm*SHjM;_#E~R=|5%)hiJ&$Hp|Z_NHS8XE*AXd6Q8gooV)MO{eT5$bbi#ub;0$|l;YN7Ucr^|POudoiSJ!@ZJU?hJK`rRTryO6p$quU729 zd&OG|?k3t47z@4@F|x@2;5y&XW_{`b))imN{LcNEB(Ns2!b;^(?!`N8S`(eB_OJJs zxfCgG%Kk}7yob+IKQ-#c^WYQ4JPmP6W_Twoj(M-ikiB(I*Ein9k%Ff!*{5I9Ym0LG zIkR?--Ws`}O7VA-wYAbDf@&MOC(K_c;ce}@cVkyaW53(~Tc@g6O2cdt9^5D~v`}I@ z=DdPoc4?=ivZ8>%N=EkE28%YLIM}rxC>2MW_9D5px*C3Gbis`zYZL3 zDq8(L?=AZ`CwZ}7TLR@SEYJN@$h!T5(XSnR_U|=Lew}sV`{U2+%n~&EEgm~x%SkyA zB>h>0-S=u>c=L1;>y6l@P7~kuJXzq z3=9k=B|(0{48NJU9Fm@PHSw|S(3W(0dsA)W6hF&j-}Z-kD5e`fSdsJM(DVr+SGHPT zJY5~MXWsk5q8Qm5>!+qLFtB{|ba4!+xbfVzj`Qyys_k(poWH(~$(q9Cg-^T=nWD<=MrQHmATO4zmY)5;k3 zX;KSrue8~_>lN#ou7Bb6a&7@LHA2=Kth@5RY}NOut+Q6VIuYBd(3aKEyYOR;8PDaC zZL{>5?9Q-h+A^Pdq;WHQ)4|zZ*RAy;x=p5f6)jLP47%~xefOake-r#0rtDbKn%4C% zrmXtJhDSmh1Nkz;{2TH)lqVU?Hd^^fTYaJLXECFt)^8WJZ8^L`^iow;^O*^=rhlwY zSUipUbFIsHYnF+8wg$z@pF8XY@@95~1g)OLu+Cty#It}SYn2YpJ7+&xFr;cBzr@99 zZ>;+DeKyQtysY9`oYtbm{mVo^$Kmr!Lq3O7%W@ec-tq>`*!6LR@U5lQ2c~bZ+buf9 zHTwFjYUQbKS=mm8G4UvF%y3xaxn|pwG`>ppTWl{RIj;&${F<*&b6K8it1Xjl@ulX* zht9j-aj(~(Zxz}-oy++H|Ggbq;W3Fi%j8~c@DRSkWxDHn)*Qye+X9zK@49kM=H}l9 zHH|GQ%hyMAe%V?j>bK*v`2GY@X=6#zEF#nwYNHU)#fYtc0 zb^6?jPwL;IHz>;>9M^>a?jdM_~~@uPW*Glpc;mcbs1h#vI|Alu4$}Xw&1Zw z%8b5UaXbH}f0{j^-pBQTVW_;Qk)&9L%YszhlPQ{eU5@Fzn&0Pe-c##J#LS~czaRbc zN!S*B+~4v5`?DQ?vhVjr39&6U=<}bcW)j^VR1*+uTlVWctDpbKuPl#t+ILyk9W65`A#`#Pz}z4DrY1Je*i76h3;0X&+FY*&g)y*J-7<3$G+w&P;lK zJmTEZmY(!d;XD~BeYLo=XN1bd!;JNor}5geoz}cw9DMF`Om zk|%1lxoVv*G1R#nxq>Hg;iaIpH{OYN@8w&w^wxZl%#BvQGwba`<~Vm>o%Z^&P4B8@ zt(5{rwmjT-^7mQiM%>usS^S>y)U;k-?GoKDVza}xy-oVukZUbH{kX*b>)wg6OM6at zl-^G1Y-4D)igEPtf-cVY1C;On3L_p-6Ev90UU Z*GsT+thVn9W?*1o@O1TaS?83{1OTrfG*18k literal 0 HcmV?d00001 diff --git a/v2/pkg/buildassets/build/dialog/question-light.png b/v2/pkg/buildassets/build/dialog/question-light.png new file mode 100644 index 0000000000000000000000000000000000000000..0d3b6ba02167cdfc38e93eadac6d8e5f3dc71124 GIT binary patch literal 930 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4rT@hhPm4t-!L#RObhS{ab*~kz>52<76Su= zVM&l*FvCxoXB&O3#ZRvFWb1eM_V~d;1;L~c69etoYZqperE<@nl*`1)JZJ0Nw=Z^A z-f1qJU$txQ6$S>TE>9Q7kch)?f^R1^8SuoOjtvwL5M!GC6gpujH?e zp678%cvA7C{`%j+r!!ZuW=dr!p1tobJuBC036pYPX7;h@0^7pX({^_LGpboMY1Q!# zt4hvyvV!+C3%|^JY#Q#OQMg8+P~fd(o%!1PT4BrFuYAv3l0GfSefjSAhp%zBd&sKgh8?Pycx}>BYgMqj5YR43hq= zbYu3=y&STCR#V%l88TmAy*IEaaxo7+_h);%&SoyZ`*w38{{Q%Iu)g&M#uqR6T**7BX1nEmf5X2O_vh%hcc~@Ia^Mz+Je+5M5DD1yc zY&@@Kx>m zUhyLERE`?Q)?FSB#vA9hnz2kgTefTgL-Dd&0TGWV!6_zPt1f)0jhinLdTQ4TF814! zTPKuCbqky?|CqT!ySMe)F{_5HqGv+)FFl*E?)^8tlH1qrexJU#n(=V2McIj>s|H!H-^_dkhQ= z#w9_1!3@8hn7ER*H$9um$GS;U`~4&9n|{Z>?F;pom~Nb-u6$^hg2orM;!E}rhG z4w`dsaYu}*)tf^M3@nd4T^vIyZoQd)yKIwzKx=zJkRT&tcId0f*9)_(-~Z41e{}ye z6@x^E-1UF*5?fQwzq!d6x2NLcBiCvj``KL1ORQ-82-{UJ52Bztr7qo3B3Z>_GF>=)Q9_Elfx($)ox)3O&hJ+>2g#nhOw z$6SEMhmePpz8Mpfyu1sjv9OfF^BFg8sMOqbfVX|878PqwvA&pgcK7tEL} z^s>72_?v>Y@(R)ktEM-!%~QENsjM?BefDq8$VE%!?lZBUSUAfz;+63$9u@X|oM|;P z|NKAAVz?q@s;dzX`ZkxyLkiC7_F8p*lf|;7tnq0=mDkR3x!X#=Bzy2v%LK2 z`<5@MTFhN5Z!NPC*GWuSu=Mmvl_`;jlBa(4U%lzy8PlvaDTe+bAJdPh6#bdPyC<>n zLHzHs&9e+dTo`u2qe>AzQ7$$@-x2h;pP3Lw|~#SMPh~?k(*>{ZEe=f09bJ6c=73mETn`%_Poe z&n(IO7qJm%cg&G8wPK$Zyzcq2lqr`on%XzaYhJ+Nz|yKYOTg#ij3r$MRiqm!&JC61S~+ttuoIqI)7MCGl6iPo>42W>=Qj`(57;?#f7%V~OQI$n=+YZ*Wtq zs&tQq!~&h05nG(DI^}N6NWICY*?nbEPWnS5GyaGjTS~es6|^NL5Zo%?&!`zK~r?U|Tq)jshhTbQ1DgK~ym zdfMw{bJsICKX%obJ3rib>$0^gO%Gm?a{MZ~`D@wz8!{Wp{;%tL?mXi*_lED{1rGua zbh#@%HxyJBL{fiQ(Yo&j$tak60vz6njx0cuB->=zY1S-otUHx3vIVCg!06qwX Ai2wiq literal 0 HcmV?d00001 diff --git a/v2/pkg/buildassets/build/dialog/warning-dark.png b/v2/pkg/buildassets/build/dialog/warning-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..db432321b616ea1b443acd6edc0635da2306cf95 GIT binary patch literal 830 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4rT@hhPm4t-!L#RR0Q~hxH2#>{2vH#Y{io` z3=9nFB|(0{49vfm)}8Eoy-7xxr+SI=q;C%wl)I~P9Q}0X+Ley%KuvYNedcESBlhvh z6fiI_`FXlHhD02`6O!HE(-GswLR0>>bGP`#-$09UjN$r zcw$A#56jAPb!Qnr*ZS7{nll2@9tAy%K9ah#U zD02N_F@+`R-2APIU$1jt+;Df!^CB6Zr+U{hFsf+J&MFn{UfLs7tn4+WA7qo8v4mUx)u2=5^;9lbd&*E(mns z+9ttwwL7-ZKrL(6i>;2U#C3L9yOeVqd=SXBkYM!b^<=ixYv4%S$6U7WtitxEdKoFx zE=Nji&=9;~l_qzdM~I~+dv)Ve<#{zZ9}2l&J5SM{EVF2j+fS?YF^gkVeztGg zE<|TVu@ObuAS$!TTGp`Q#43=E#GelF{r5}E*TkGj+V literal 0 HcmV?d00001 diff --git a/v2/pkg/buildassets/build/dialog/warning-dark2x.png b/v2/pkg/buildassets/build/dialog/warning-dark2x.png new file mode 100644 index 0000000000000000000000000000000000000000..3325d22d287bdaaf97d0841e3a90678ab0686203 GIT binary patch literal 1274 zcmeAS@N?(olHy`uVBq!ia0y~yU}ykg4rT@hhA$5${$yZam=@p@;>y6l@PF`u1FAWPEX%rd?APPH2=|!-wy3rQK+UW z!hX!UCRVU|>WtEK1_tIwo-U3d6}R3@yV7V|0@BMCv z0;Gh6+=?&0zqLr+&aUj?;dXv`yOMO#I4^m$a$;)H9u3WqQXNvdaSH_2m zcrJN&F_x_#~cneVSXi|&8cWtO6R@5muMut|Tiy3OJt7af;= z!s_q8KS$3^TPf8O=eDuC>DTY&#@C{L=S01CWdEP-Ry8f8YVWNd9_JksLfmh%dA`YN z=y5RmKY7*fc!jgqSNv-6S=GEa>zmny#@^`KmaCQwe8HzT)`-mMsFX_?%&dTlpVZ3tO`FMy7usbv!|>Y;us57 z=tNY7o!`YeC;G{0r`%H|+$SdN6|3bCUl7fp^J4N27c)(c1?)MTXP;znzZ9Qv;lFYJ zi+x%g3)X)ZoMm|0F!2}bhN2_B87W5tTe}!O)z-Lv&A8j%VEXjKQk@%L6%)d*#V_bw zq;p~_%LPU46~SNLI3Jj7q z>q83^4E?Px)t;KYb@!#}^mme<=O6gvpYcy>R(;2VV4iC}KSVwoBo%A%D$5+nBd`R<-CAHajMMa*5&2PWVH-s*{A-=F;ibrV!eu& zt9e6I|7(5YM^)eX#h$6pj&xtW?LPahm+p4`VbK=1Z_4YP_22&O`0Iy1?V?`S{7-LK zD9gkX?PT#rQLMTroh4;e9s5izhMChA#juM$y_C33&B64$;Edea7W0`M7TaFx49FHg zepls6m35x%>#gjwMYsIkCBEY>kUj7-4nPTl?m1DOB(Owp#N4<_$ObW}W|WIBd?mUcs85 ze@hcO^o4KE-ZbH7eoxKh-VGjKj<;I)K6mg+-?2mCpHos|=~bD)kN>m$S5$Q9tXNjZ zTIco8{a7CtAJfSYO?NgZpmaIH38EP^v3k37i7YJ&q zNN9K{YA)^RG0}Lsw%@U=EA;~0ZvWl2};>s}iKvku3DFXw8 zK}nEbFvIUqC!XuuyPDV~pC0hg&PeimH^nkv@x`Mp6O1qHEaktaqG?Wn?;)qcv_!29mwIFvefhBzU7`)b^n+D{@;D>hCtHI zVn5Z8~}Q;~SiXwMbDX_jAAV-CH4WR<$FV}`?)6W+&L?<*9%=-uFV zqSuO%$GgbJK(jrWsoC(G{R}4ge-dp8j}24zFy%Zx;?sR&*Zc5HXN&-3iQluGH=OWx7nE`Dot7SPUS>&P+re7~mV3+t_# z-dXDdGD|o7+_0UMd0X6P)snOuJO|VzKHcnTdiYmSQ)05v;?q+MCyG=}Fq-Idks)}= z|6{>3^uDq`aP+r%tJu?-ad+*V7xydw^-k$%R7yV3dGy1n&+}d0*as@zXMg0?$#_(d z)mmY(ntkflUqPi?q#PVi&H1~5Npnh}*b7tf_w%`poZ=);C9B>$#$>$q7pr$g>Y}Gh zQlggCWlvq_*9_B^22rzz-1;~86%)?C*1zC-miwABN5tn}Qn#I#E3(Yl;5+4G)0XKB zf0WYegAeTgb~caIQGx3a`zy6Y@k-uWlXmHR`8!{ahs)(t_RQADUB$WPQ+KEDGk*L} zc*lRvyYbH7n>qTDHl!U2JTqNzcJNE1N3UnR-B}>}+2K$_QsyCtONNscinV_i-(?`| zW+dgs81&TAK}*6bQAgY**-~2AGsow~tjwhBW6wf_W(RM3KI_Ij;{^%1eUW7>Y61Mie_GjF&?>{&9 z_o==YF0ESgym8a-iO()+wQimJ|Iww|(%1X+T88HA7UkQ^MUy`EfBeBd z^O4)mMXfivoJISu9sd-0#Nz%g>vP-NEatl}*yv$->Eyy|&o^6NshYn`?)6*84UrvX z@ohqR>rE}g9j*Lzwv|;KbX;F?X0^RZez;9rP|?pTHF^89?95mEJfdqQE0tdpa8dK` hs_QEP7rXI#>F;cxyCh|6U>B&|@^tlcS?83{1OPKS3ZVc1 literal 0 HcmV?d00001 diff --git a/v2/pkg/buildassets/build/windows/wails.exe.manifest b/v2/pkg/buildassets/build/windows/wails.exe.manifest new file mode 100644 index 00000000..b236d268 --- /dev/null +++ b/v2/pkg/buildassets/build/windows/wails.exe.manifest @@ -0,0 +1,12 @@ + + + + + + + true/pm + permonitorv2,permonitor + true + + + \ No newline at end of file diff --git a/v2/pkg/buildassets/build/windows/wails.rc.tmpl b/v2/pkg/buildassets/build/windows/wails.rc.tmpl new file mode 100644 index 00000000..a1254d9d --- /dev/null +++ b/v2/pkg/buildassets/build/windows/wails.rc.tmpl @@ -0,0 +1,2 @@ +100 ICON "app.ico" +110 24 "{{.Name}}.exe.manifest" \ No newline at end of file diff --git a/v2/pkg/buildassets/buildassets.go b/v2/pkg/buildassets/buildassets.go new file mode 100644 index 00000000..3924dbbb --- /dev/null +++ b/v2/pkg/buildassets/buildassets.go @@ -0,0 +1,76 @@ +package buildassets + +import ( + "embed" + "github.com/leaanthony/debme" + "github.com/leaanthony/gosod" + "os" + "path/filepath" + "text/template" +) + +//go:embed build +var assets embed.FS + +type assetData struct { + Name string +} + +// Install will install all default project assets +func Install(targetDir string, projectName string) error { + templateDir := gosod.New(assets) + err := templateDir.Extract(targetDir, &assetData{Name: projectName}) + if err != nil { + return err + } + + // Rename the manifest file + windowsDir := filepath.Join(targetDir, "build", "windows") + manifest := filepath.Join(windowsDir, "wails.exe.manifest") + targetFile := filepath.Join(windowsDir, projectName+".exe.manifest") + err = os.Rename(manifest, targetFile) + if err != nil { + return err + } + + // Rename the rc file + rc := filepath.Join(windowsDir, "wails.rc") + targetFile = filepath.Join(windowsDir, projectName+".rc") + err = os.Rename(rc, targetFile) + if err != nil { + return err + } + return nil +} + +// RegenerateRCFile will recreate the RC file +func RegenerateRCFile(projectDir string, projectName string) error { + targetFile, err := os.OpenFile(filepath.Join(projectDir, "build", "windows", projectName+".rc"), os.O_CREATE, 0644) + if err != nil { + return err + } + data := &assetData{Name: projectName} + templateData, err := assets.ReadFile("build/windows/wails.rc.tmpl") + if err != nil { + return err + } + + tmpl, err := template.New("rc").Parse(string(templateData)) + if err != nil { + return err + } + err = tmpl.Execute(targetFile, data) + if err != nil { + return err + } + return nil + +} + +func RegenerateManifest(target string) error { + a, err := debme.FS(assets, "build") + if err != nil { + return err + } + return a.CopyFile("windows/wails.exe.manifest", target, 0644) +} diff --git a/v2/pkg/commands/build/base.go b/v2/pkg/commands/build/base.go index 3894b060..106cdcbc 100644 --- a/v2/pkg/commands/build/base.go +++ b/v2/pkg/commands/build/base.go @@ -152,7 +152,16 @@ func (b *BaseBuilder) CleanUp() { func (b *BaseBuilder) OutputFilename(options *Options) string { outputFile := options.OutputFile if outputFile == "" { - outputFile = b.projectData.OutputFilename + target := strings.TrimSuffix(b.projectData.OutputFilename, ".exe") + if b.projectData.OutputType != "desktop" { + target += "-" + b.projectData.OutputType + } + switch b.options.Platform { + case "windows": + outputFile = b.projectData.OutputFilename + case "darwin", "linux": + outputFile = fmt.Sprintf("%s-%s-%s", target, b.options.Platform, b.options.Arch) + } } return outputFile } @@ -306,7 +315,7 @@ func (b *BaseBuilder) CompileProject(options *Options) error { println("Done.") // If we are targeting windows, dump the DLLs if options.Platform == "windows" { - err := os.WriteFile(filepath.Join(appDir, "webview2.dll"), x64.WebView2, 0755) + err := os.WriteFile(filepath.Join(appDir, "webview.dll"), x64.WebView2, 0755) if err != nil { return err } diff --git a/v2/pkg/commands/build/build.go b/v2/pkg/commands/build/build.go index aaf917a1..9ee38419 100644 --- a/v2/pkg/commands/build/build.go +++ b/v2/pkg/commands/build/build.go @@ -74,7 +74,7 @@ func Build(options *Options) (string, error) { options.ProjectData = projectData // Set build directory - options.BuildDirectory = filepath.Join(options.ProjectData.Path, "build", options.Platform, options.OutputType) + options.BuildDirectory = filepath.Join(options.ProjectData.Path, "build", "bin") // Save the project type projectData.OutputType = options.OutputType @@ -161,8 +161,14 @@ func Build(options *Options) (string, error) { return "", fmt.Errorf("%s - %s", err.Error(), stderr) } // Remove temp binaries - fs.DeleteFile(filepath.Join(options.BuildDirectory, amd64Filename)) - fs.DeleteFile(filepath.Join(options.BuildDirectory, arm64Filename)) + err = fs.DeleteFile(filepath.Join(options.BuildDirectory, amd64Filename)) + if err != nil { + return "", err + } + err = fs.DeleteFile(filepath.Join(options.BuildDirectory, arm64Filename)) + if err != nil { + return "", err + } projectData.OutputFilename = outputFile options.CompiledBinary = filepath.Join(options.BuildDirectory, outputFile) } else { @@ -171,7 +177,6 @@ func Build(options *Options) (string, error) { return "", err } } - outputLogger.Println("Done.") // Do we need to pack the app? if options.Pack { diff --git a/v2/pkg/commands/build/desktop.go b/v2/pkg/commands/build/desktop.go index d3edd182..27bcbcf3 100644 --- a/v2/pkg/commands/build/desktop.go +++ b/v2/pkg/commands/build/desktop.go @@ -25,11 +25,11 @@ func (d *DesktopBuilder) BuildAssets(options *Options) error { var err error // Check assets directory exists - if !fs.DirExists(options.ProjectData.AssetsDir) { + if !fs.DirExists(options.ProjectData.BuildDir) { // Path to default assets defaultAssets := fs.RelativePath("./internal/assets") // Copy the default assets directory - err := fs.CopyDir(defaultAssets, options.ProjectData.AssetsDir) + err := fs.CopyDir(defaultAssets, options.ProjectData.BuildDir) if err != nil { return err } @@ -106,7 +106,7 @@ func (d *DesktopBuilder) BuildBaseAssets(assets *html.AssetBundle, options *Opti func (d *DesktopBuilder) processApplicationIcon(assetDir string) error { // Copy default icon if one doesn't exist - iconFile := filepath.Join(d.projectData.AssetsDir, "appicon.png") + iconFile := filepath.Join(d.projectData.BuildDir, "appicon.png") if !fs.FileExists(iconFile) { err := fs.CopyFile(defaultIconPath(), iconFile) if err != nil { diff --git a/v2/pkg/commands/build/desktop_darwin.go b/v2/pkg/commands/build/desktop_darwin.go index 76fe0589..9cf0d888 100644 --- a/v2/pkg/commands/build/desktop_darwin.go +++ b/v2/pkg/commands/build/desktop_darwin.go @@ -27,7 +27,7 @@ func (d *DesktopBuilder) processTrayIcons(assetDir string, options *Options) err var err error // Get all the tray icon filenames - trayIconDirectory := filepath.Join(options.ProjectData.AssetsDir, "tray") + trayIconDirectory := filepath.Join(options.ProjectData.BuildDir, "tray") // If the directory doesn't exist, create it if !fs.DirExists(trayIconDirectory) { @@ -116,7 +116,7 @@ func (d *DesktopBuilder) processDialogIcons(assetDir string, options *Options) e var err error // Get all the dialog icon filenames - dialogIconDirectory := filepath.Join(options.ProjectData.AssetsDir, "dialog") + dialogIconDirectory := filepath.Join(options.ProjectData.BuildDir, "dialog") var dialogIconFilenames []string // If the directory does not exist, create it diff --git a/v2/pkg/commands/build/desktop_windows.go b/v2/pkg/commands/build/desktop_windows.go index d3286db3..39698818 100644 --- a/v2/pkg/commands/build/desktop_windows.go +++ b/v2/pkg/commands/build/desktop_windows.go @@ -8,7 +8,7 @@ func (d *DesktopBuilder) processTrayIcons(assetDir string, options *Options) err // var err error // // // Get all the tray icon filenames - // trayIconDirectory := filepath.Join(options.ProjectData.AssetsDir, "tray") + // trayIconDirectory := filepath.Join(options.ProjectData.BuildDir, "tray") // // // If the directory doesn't exist, create it // if !fs.DirExists(trayIconDirectory) { @@ -97,7 +97,7 @@ func (d *DesktopBuilder) processDialogIcons(assetDir string, options *Options) e // var err error // // // Get all the dialog icon filenames - // dialogIconDirectory := filepath.Join(options.ProjectData.AssetsDir, "dialog") + // dialogIconDirectory := filepath.Join(options.ProjectData.BuildDir, "dialog") // var dialogIconFilenames []string // // // If the directory does not exist, create it diff --git a/v2/pkg/commands/build/hybrid.go b/v2/pkg/commands/build/hybrid.go index 381b3603..8047e20e 100644 --- a/v2/pkg/commands/build/hybrid.go +++ b/v2/pkg/commands/build/hybrid.go @@ -30,12 +30,6 @@ func (b *HybridBuilder) BuildAssets(options *Options) error { if err != nil { return err } - // Build static assets - err = b.buildCustomAssets(b.projectData) - if err != nil { - return err - } - return nil } @@ -63,18 +57,6 @@ func (b *HybridBuilder) BuildBaseAssets(options *Options) error { return err } - // Build desktop static assets - err = b.desktop.buildCustomAssets(b.projectData) - if err != nil { - return err - } - - // Build server static assets - err = b.server.buildCustomAssets(b.projectData) - if err != nil { - return err - } - return nil } diff --git a/v2/pkg/commands/build/internal/packager/darwin/Info.plist b/v2/pkg/commands/build/internal/packager/darwin/Info.plist index 30ded0ef..8e67cb18 100644 --- a/v2/pkg/commands/build/internal/packager/darwin/Info.plist +++ b/v2/pkg/commands/build/internal/packager/darwin/Info.plist @@ -2,11 +2,13 @@ CFBundlePackageTypeAPPL CFBundleName{{.Title}} - CFBundleExecutable{{.Exe}} - CFBundleIdentifier{{.PackageID}} - CFBundleVersion{{.Version}} - CFBundleGetInfoStringBuilt by {{.Author}} using Wails (https://wails.app) - CFBundleShortVersionString{{.Version}} + CFBundleExecutable{{.Title}} + CFBundleIdentifiercom.wails.{{.Title}} + CFBundleVersion1.0.0 + CFBundleGetInfoStringBuilt using Wails (https://wails.app) + CFBundleShortVersionString1.0.0 CFBundleIconFileiconfile + LSMinimumSystemVersion10.13.0 NSHighResolutionCapabletrue + NSHumanReadableCopyrightCopyright......... \ No newline at end of file diff --git a/v2/pkg/commands/build/internal/packager/linux/AppRun b/v2/pkg/commands/build/internal/packager/linux/AppRun deleted file mode 100644 index 621fed61..00000000 --- a/v2/pkg/commands/build/internal/packager/linux/AppRun +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh -cd "$(dirname "$0")" -exec ./{{.OutputFilename}} \ No newline at end of file diff --git a/v2/pkg/commands/build/packager.go b/v2/pkg/commands/build/packager.go index c32900a0..9472d35e 100644 --- a/v2/pkg/commands/build/packager.go +++ b/v2/pkg/commands/build/packager.go @@ -14,7 +14,7 @@ func packageProject(options *Options, platform string) error { var err error switch platform { - case "linux", "darwin": + case "darwin", "windows": err = packageApplication(options) default: err = fmt.Errorf("packing not supported for %s yet", platform) diff --git a/v2/pkg/commands/build/packager_darwin.go b/v2/pkg/commands/build/packager_darwin.go index 6062b6d3..9668492a 100644 --- a/v2/pkg/commands/build/packager_darwin.go +++ b/v2/pkg/commands/build/packager_darwin.go @@ -49,7 +49,7 @@ func packageApplication(options *Options) error { } // Generate Icons - err = processApplicationIcon(resourceDir, options.ProjectData.AssetsDir) + err = processApplicationIcon(resourceDir, options.ProjectData.BuildDir) if err != nil { return err } @@ -68,7 +68,7 @@ func packageApplication(options *Options) error { func processPList(options *Options, contentsDirectory string) error { // Check if plist already exists in project dir - plistFile := filepath.Join(options.ProjectData.AssetsDir, "mac", "Info.plist") + plistFile := filepath.Join(options.ProjectData.BuildDir, "darwin", "Info.plist") // If the file doesn't exist, generate it if !fs.FileExists(plistFile) { diff --git a/v2/pkg/commands/build/packager_windows.go b/v2/pkg/commands/build/packager_windows.go index a64ba85c..92521794 100644 --- a/v2/pkg/commands/build/packager_windows.go +++ b/v2/pkg/commands/build/packager_windows.go @@ -1,6 +1,78 @@ package build +import ( + "fmt" + "github.com/leaanthony/winicon" + "github.com/wailsapp/wails/v2/internal/fs" + "github.com/wailsapp/wails/v2/pkg/buildassets" + "os" + "path/filepath" +) + func packageApplication(options *Options) error { - // TBD + // Generate icon + var err error + err = generateIcoFile(options) + if err != nil { + return err + } + + // Ensure RC file is present + err = generateRCFile(options) + if err != nil { + return err + } + + // Ensure Manifest is present + err = generateManifest(options) + if err != nil { + return err + } + // Run + + return nil +} + +func generateManifest(options *Options) error { + filename := options.ProjectData.Name + ".exe.manifest" + manifestFile := filepath.Join(options.ProjectData.Path, "build", "windows", filename) + if !fs.FileExists(manifestFile) { + return buildassets.RegenerateManifest(manifestFile) + } + return nil +} + +func generateRCFile(options *Options) error { + filename := options.ProjectData.Name + ".rc" + rcFile := filepath.Join(options.ProjectData.Path, "build", "windows", filename) + if !fs.FileExists(rcFile) { + return buildassets.RegenerateRCFile(options.ProjectData.Path, options.ProjectData.Name) + } + return nil +} + +func generateIcoFile(options *Options) error { + // Check ico file exists already + icoFile := filepath.Join(options.ProjectData.Path, "build", "windows", "app.ico") + if !fs.FileExists(icoFile) { + // Check icon exists + appicon := filepath.Join(options.ProjectData.Path, "build", "appicon.png") + if !fs.FileExists(appicon) { + return fmt.Errorf("application icon missing: %s", appicon) + } + // Load icon + input, err := os.Open(appicon) + if err != nil { + return err + } + output, err := os.OpenFile(icoFile, os.O_CREATE, 0644) + if err != nil { + return err + } + err = winicon.GenerateIcon(input, output, []int{256, 128, 64, 48, 32, 16}) + if err != nil { + return err + } + } return nil } diff --git a/v2/pkg/commands/build/server.go b/v2/pkg/commands/build/server.go index 8e305a8f..e6e34bfb 100644 --- a/v2/pkg/commands/build/server.go +++ b/v2/pkg/commands/build/server.go @@ -37,12 +37,6 @@ func (s *ServerBuilder) BuildAssets(_ *Options) error { return err } - // Build static assets - err = s.buildCustomAssets(s.projectData) - if err != nil { - return err - } - return nil }