electron-userland / electron-builder

A complete solution to package and build a ready for distribution Electron app with “auto update” support out of the box
https://www.electron.build
MIT License
13.61k stars 1.73k forks source link

Wrong module versions used in packaged app, causing it to fail to load #8519

Open giladgd opened 1 week ago

giladgd commented 1 week ago

There's an issue with the latest electron-builder where after packaging an app, the node_modules directory will include wrong module versions for sub-modules.

I'll explain better with a reproducible example:

  1. Run this command:
    npm create --yes node-llama-cpp@3.0.0-beta.46 -- --template electron-typescript-react --name electron-builder-issue

    This scaffolds a node-llama-cpp Electron project that allows you to run LLMs locally on your machine

  2. Select any model from the list, it doesn't matter which one for this issue reproduction
  3. cd electron-builder-issue
  4. Open package.json and remove the postinstall script to skip the model download
  5. npm install
  6. npm run build
  7. Launch the app you built (under the release/mac-arm64 directory) and see that it works
  8. Close the app
  9. Open package.json. Under devDependencies, change the electron-builder version to 25.0.5
  10. npm install
  11. npm run build
  12. Launch the app and see that it fails to open with some error. Sometimes it's about require() of ES Module, sometimes it's about a missing import, it's pretty random from my testings. Locate from the long error which module is "the importer" (the one trying to import another module), and which module is "the imported" (the module that was attempted to be imported).

This is the error I received when trying to open the app:

Uncaught Exception:
Error [ERR_REQUIRE_ESM]: require() of ES Module /Users/user/Documents/workspace/electron-builder-issue/release/mac-arm64/node-llama-cpp-electron-example.app/Contents/Resources/app.asar/node_modules/ansi-regex/index.js from /Users/user/Documents/workspace/electron-builder-issue/release/mac-arm64/node-llama-cpp-electron-example.app/Contents/Resources/app.asar/node_modules/string-width/node_modules/strip-ansi/index.js not supported.
Instead change the require of /Users/user/Documents/workspace/electron-builder-issue/release/mac-arm64/node-llama-cpp-electron-example.app/Contents/Resources/app.asar/node_modules/ansi-regex/index.js in /Users/user/Documents/workspace/electron-builder-issue/release/mac-arm64/node-llama-cpp-electron-example.app/Contents/Resources/app.asar/node_modules/string-width/node_modules/strip-ansi/index.js to a dynamic import() which is available in all CommonJS modules.
at c._load (node:electron/js2c/node_init:2:17025)
at Object.<anonymous> (/Users/user/Documents/workspace/electron-builder-issue/release/mac-arm64/node-llama-cpp-electron-example.app/Contents/Resources/app.asar/node_modules/string-width/node_modules/strip-ansi/index.js:2:19)

In my error: "The importer" is: string-width/node_modules/strip-ansi "The imported" is: ansi-regex

The above error happened because some of the code was trying to load some version of a module but instead received a completely different version of it.

Here's how you can validate that this is indeed the issue:

  1. cd release/mac-arm64/node-llama-cpp-electron-example.app/Contents/Resources/
  2. npx asar e app.asar app.content
  3. cat ./app.content/node_modules/ansi-regex/package.json and see that the version of the bundled ansi-regex is 6.1.0
  4. cat ./app.content/node_modules/string-width/node_modules/strip-ansi/package.json and see this in the package.json of strip-ansi:
    "dependencies": {
     "ansi-regex": "^5.0.1"
    }

As you can see, strip-ansi expected a ^5.0.1 version of ansi-regex, but actually received 6.1.0, which is incompatible.

From my testings, this issue doesn't happen with electron-builder version 25.0.0, but does happen with 25.0.1.

Because of this issue, I downgraded the version of electron-builder in the node-llama-cpp Electron template for now until this is resolved.

mmaietta commented 1 week ago

Can you try to repro on next 25.1.4? There were some updates from an upstream dependency that were merged in.

giladgd commented 1 week ago

I forgot to mention it but I already tried, and the issue is still there.

mmaietta commented 1 week ago

Looking at the linked issue, you mentioned that it doesn't occur in 25.0.0, but does in 25.0.1. This may be the offending PR then since it's related to the module dependency tree resolution changes in upstream dependency app-builder-bin https://github.com/electron-userland/electron-builder/pull/8353/files

@beyondkmp can you take a look at this when you have a chance since it looks to be related to app-builder?

BernhardBehrendt commented 1 week ago

I have also those issues. Tried also to use 25.1.4 but starting from 25.x my app isn't working anymore after electron build process.

Bildschirmfoto 2024-09-21 um 23 49 36
Dwynr commented 1 week ago

We get the same issue after upgrading to 25.x from 24.x in our CI pipeline. Weirdly only on macOS/Linux builds so far, and mostly different dependencies, varies from build to build.

beyondkmp commented 5 days ago

@giladgd I have confirmed that this MR(https://github.com/develar/app-builder/pull/138) can fix this issue.

cmdcolin commented 5 days ago

i had a somewhat similar issue here i think ...has similar 'wrong version of dependency' used/installed in deep node_modules folder with multiple versions of things.... https://github.com/electron-userland/electron-builder/issues/8503

my question is how is the node_modules folder being constructed, is it much different than before and why the change?

the "varies from build to build" is quite strange also!

beyondkmp commented 2 days ago

@giladgd deploying release v25.1.6 now. Please update when you have a chance