wails icon indicating copy to clipboard operation
wails copied to clipboard

MacOS: wails build -o outputName ignored.

Open Snider opened this issue 3 years ago • 17 comments

Description

When building an application on MacOS the -o arg is ignored, and the configuration value in the code is used.

To Reproduce

macos:
    runs-on: macos-latest
    steps:
      # Checkout code
      - uses: actions/checkout@v3
        with:
          repository: letheanVPN/desktop
          submodules: recursive
      - uses: dAppServer/wails-build-action@v2
        with:
          build-name: letheanTest
          build-platform: darwin/universal
          wails-build-webview2: "embed"
          wails-version: "v2.3.1"
          go-version: ^1.18
          sign: "false"

Expected behaviour

The output name to be the same as provided with -o

Screenshots

image

Attempted Fixes

No response

System Details

https://github.com/dAppServer/wails-build-action/actions/runs/3885309312/jobs/6629024935

Additional context

linux and windows will use the -o value; not sure if you build from Linux for macOS if it builds fine or not.

https://github.com/dAppServer/wails-build-action/actions/runs/3885309312 Workflow file to test the GHA: https://github.com/dAppServer/wails-build-action/blob/11-action-fails-with-wails-231-on-macos-due-to-ditto-error/.github/workflows/lethean-desktop.yml

Workflow file to test using GHA: https://github.com/dAppServer/wails-build-action/blob/main/.github/workflows/lethean-desktop.yml

Snider avatar Jan 10 '23 20:01 Snider

I've been taking a look at this, and I'd like to develop the fix. Here's what I've figured out so far.

Building a macOS app comes in two parts: compiling the go binary, and packaging the .app.

go binary

In v2/pkg/commands/build/build.go, in the execBuildApplication function, building the go binary has 2 logical branches for darwin; the if statement is on https://github.com/wailsapp/wails/blob/master/v2/pkg/commands/build/build.go#L266

If we are building a "universal" build (compiling for both arm64 and amd64 architectures), then on https://github.com/wailsapp/wails/blob/master/v2/pkg/commands/build/build.go#L311 the go compilation's OutputFile name is set to the value of the -o flag; if only one architecture is being built, this doesn't happen presently.

macos packaging the .app

Packaging the app for darwin takes place in https://github.com/wailsapp/wails/blob/master/v2/pkg/commands/build/packager.go#L64, and doesn't seem to check if there's a filename been set with the -o flag.

gwynforthewyn avatar Jan 29 '23 04:01 gwynforthewyn

This isn't a huge check-in, but as I've been fixing this I keep getting tripped up by the difference between the Universal and the individual architecture builds, so I decided I need to add tests for the build.go file and validate I'm not introducing regressions, and well, here - https://github.com/gwynforthewyn/wails/commit/fcbefc924eb8b8410573bb18bab035a10540ac2f

It took me a few hours to figure that out : )

gwynforthewyn avatar Jan 30 '23 02:01 gwynforthewyn

Thanks for looking into this @gwynforthewyn, it's a sneaky little bug

Snider avatar Jan 30 '23 15:01 Snider

Just a note to say I’m still on this, but during the week I have work and find it hard go get the time to redirect back.

I did reach the conclusion that unit testing isn’t the best type of testing here: to run the build command you need a project layout to actually build. I think that in order to build that layout on the file system, I’d need to run main::initProject during test setup, but that can’t be called from a test inside the build package. I may just knock together a shell script to validate my file system layout as I’m tweaking things, nbd.

gwynforthewyn avatar Feb 02 '23 19:02 gwynforthewyn

Just a note to say I’m still on this, but during the week I have work and find it hard go get the time to redirect back.

I did reach the conclusion that unit testing isn’t the best type of testing here: to run the build command you need a project layout to actually build. I think that in order to build that layout on the file system, I’d need to run main::initProject during test setup, but that can’t be called from a test inside the build package. I may just knock together a shell script to validate my file system layout as I’m tweaking things, nbd.

No stress, when you get time.

A shell script might be a good idea, not sure if this is helpful, I'm doing some build shenanigans that might help give some ideas to force a name mismatch: https://github.com/dAppServer/pwa-native-action/blob/main/action.yml

Snider avatar Feb 02 '23 20:02 Snider

I have a draft PR for a fix up; I do need to finish the tests, but I wanted to ask some guidance.

The request here was for the output binary to be renamed. Renaming this means that there needs to be different information inside the Info.plist file - we cannot continue referencing the old binary name, as this isn't being generated. Then I figured that if I'm changing the name inside the Info.plist file, it makes sense that the .app name is changed too.

However, here's a plist file generated with this PR's changes. Should I change the CFBundleName, too?:

; cat build/bin/roflcopter.app/Contents/Info.plist 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <dict>
        <key>CFBundlePackageType</key>
        <string>APPL</string>
        <key>CFBundleName</key>
        <string>2290_ignore_output_filename_macos</string> #should I change this?
        <key>CFBundleExecutable</key>
        <string>roflcopter</string>
        <key>CFBundleIdentifier</key>
        <string>com.wails.roflcopter</string>
        <key>CFBundleVersion</key>
        <string>1.0.0</string>
        <key>CFBundleGetInfoString</key>
        <string>Built using Wails (https://wails.io)</string>
        <key>CFBundleShortVersionString</key>
        <string>1.0.0</string>
        <key>CFBundleIconFile</key>
        <string>iconfile</string>
        <key>LSMinimumSystemVersion</key>
        <string>10.13.0</string>
        <key>NSHighResolutionCapable</key>
        <string>true</string>
        <key>NSHumanReadableCopyright</key>
        <string>Copyright.........</string>
    </dict>
</plist>

Additionally, the window that holds the wails app contains the default name in its title bar:

wails

I haven't figured out how to change that just yet, but I can try to get that updated too if you'd like?

(Also, the amount of knowledge needed to fix this is absolutely not represented by the tiny diff 😄 )

gwynforthewyn avatar Feb 08 '23 05:02 gwynforthewyn

Heya @gwynforthewyn, Thanks for this.

I think the title comes from the CFBundleName setting, so updating the plist should fix the secondary issue; it's limited to 15 chars, but CFBundleDisplayName is not, so maybe adjust the display name and keep the BundleName the same as that prop is used for i18n and permissions.

I can see some edge cases where this is not ideal, but probably an accepted caveat of overriding the code-defined app name on the build depends on how @leaanthony feels about it, as there might be different side effects.

At least this brings MacOS build behaviour in line with Linux & Windows, even though some are non-ideal; once the build is constant across platforms, it's no longer a Wails issue and becomes the app developers.

https://developer.apple.com/documentation/bundleresources/information_property_list/cfbundlename

Snider avatar Feb 08 '23 11:02 Snider

It's time to get into spooky behaviour.

I opened up Info.plist in my build app and added a CFBundleDisplayName key with a new value in it, but when I open the app with open /path/to/my/app.app the window title persists as a lingering problem. You can see in this screenshot that CFBundleName and CFBundleDisplayName look like they're used in the menu bar, not the window title. I'm a noob at this, though 🤷‍♀️

Screenshot 2023-02-09 at 6 59 37 AM

I can't actually see any strings that match my window title in the .app folder for this build. https://developer.apple.com/documentation/swiftui/configure-your-apps-navigation-titles seems to suggest I need to figure out where the navigationTitle is set.

I'll keep pecking away at this.

gwynforthewyn avatar Feb 09 '23 14:02 gwynforthewyn

This looks promising https://github.com/wailsapp/wails/blob/master/v2/internal/frontend/desktop/darwin/window.go#L68

I'll need to figure out what data is being sent in there. This'll be a stretch of my skills, I think 😅

gwynforthewyn avatar Feb 09 '23 14:02 gwynforthewyn

Snap! Looks like it is taken from the Tittle attr from the main.go file.

image

Snider avatar Feb 09 '23 14:02 Snider

Yes! I just reached the same point! In that case, I'm not sure how to handle this just yet, as it'd involve overriding user-provided source code.

My thoughts are currently that I could leave this alone as the build/Run process is changing in v3, or I'm happy to try and figure out something like updating the init command to insert a check for whether an override file name was provided; that doesn't fix it for historical users, but would give anyone using v2 in future a nicer experience.

gwynforthewyn avatar Feb 09 '23 14:02 gwynforthewyn

I don't think overriding the app name on the build is a good idea, but there might be cases where the app exe needs a more straightforward name.

The issue for Wails is that both Linux and Windows take the -o and MacOS doesn't, so making MacOS builds behave the same I think is perfect, tbh.

As you pointed out, anything more and your editing userland code which is not a Wails problem. :)

p.s if you add GitHub sponsors I'll make sure my project donates enough to buy a bottle of something for your trouble.

Snider avatar Feb 09 '23 14:02 Snider

I think I'll have time to get the testing done on this over the weekend. There is a draft PR at https://github.com/wailsapp/wails/pull/2358; the patch is surprisingly tiny.

p.s if you add GitHub sponsors I'll make sure my project donates enough to buy a bottle of something for your trouble.

Thank you, but I'm doing this for the love. I'm just happy to help out.

gwynforthewyn avatar Feb 16 '23 13:02 gwynforthewyn

I think I'll have time to get the testing done on this over the weekend. There is a draft PR at #2358; the patch is surprisingly tiny.

p.s if you add GitHub sponsors I'll make sure my project donates enough to buy a bottle of something for your trouble.

Thank you, but I'm doing this for the love. I'm just happy to help out.

Thanks, well, we donated trees in your name instead. (it's about 100 trees in case you are wondering)

image https://donate.trees.org/team/400781

Thanks for working on this :)

Snider avatar Feb 16 '23 13:02 Snider

PR's open : ) https://github.com/wailsapp/wails/pull/2358

gwynforthewyn avatar Feb 20 '23 01:02 gwynforthewyn

make sure matrix.build.name same with wails.json -> outputfilename

lpdswing avatar Apr 06 '23 13:04 lpdswing

I'm getting similar problem:

# Build Options

Platform(s)        | darwin/universal                                                       
Compiler           | /Users/runner/.asdf/installs/golang/1.18.3/go/bin/go                   
Skip Bindings      | false                                                                  
Build Mode         | production                                                             
Frontend Directory | /Users/runner/work/discord-image-browser/discord-image-browser/frontend
Obfuscated         | false                                                                  
Skip Frontend      | false                                                                  
Compress           | false                                                                  
Package            | true                                                                   
Clean Bin Dir      | false                                                                  
LDFlags            |                                                                        
Tags               | []                                                                     
Race Detector      | false                                                                  
Output File        | discordimagebrowser-darwin-universal 

so I'd expect that it creates a folder :

build/bin/discordimagebrowser-darwin-universal/

This is not at all what happens.

Instead it creates:

build/bin/discordimagebrowser.app/

airtonix avatar Apr 29 '23 02:04 airtonix

wails3 如何在执行wails3 build时不生成带调试窗口的程序

konster avatar Jul 14 '25 02:07 konster