adopted-ember-addons / ember-electron

:zap: Build, test, compile and package desktop apps with Ember and Electron
https://ember-electron.js.org/
Other
806 stars 111 forks source link

make fails: Expected buildPath to be an absolute path #1501

Open basz opened 1 year ago

basz commented 1 year ago

make fails with "Expected buildPath to be an absolute path".

Built project successfully. Stored in "electron-app/ember-dist". Making Electron project. Expected buildPath to be an absolute path

diggin it seem the buildPath is set as 'electron-app' in the make task while forge

a quick fix inside node_modules/ember-electron/lib/tasks/make.js to prove we can get past this.

dir: path.join(process.cwd() , electronProjectPath),
bendemboski commented 1 year ago

@basz I'm not following here. Does this reproduce with a specific version of electron-forge? A specific version of ember-electron? A specific project setup?

basz commented 1 year ago

Hi, yes i bit of an unclear report.

It's basically a new test application ember new + ember install ember-electron

npx ember --version
ember-cli: 4.12.1
node: 18.16.0
os: darwin arm64

new project with ember-electron ^4.2.1", that has @electron/rebuild@3.2.13 and @electron-forge/core@6.1.1

the electron-app package.json contains

"@electron-forge/cli": "^6.1.1",
"@electron-forge/maker-deb": "^6.1.1",
"@electron-forge/maker-rpm": "^6.1.1",
"@electron-forge/maker-squirrel": "^6.1.1",
"@electron-forge/maker-zip": "^6.1.1",
"@electron-forge/plugin-webpack": "^6.1.1",

electron/rebuild has this requirement quite some time. https://github.com/electron/rebuild/blame/main/src/rebuild.ts#L136

I think @electron-forge/core at some point changed it requirements about the given buildPath argument

basz commented 1 year ago

does that make sense? Would you accept a PR using cwd + 'electron-app'. If so should I change the utility that produces electronProjectPath or the make.js only.

bendemboski commented 1 year ago

@basz I'm having trouble understanding/reproducing this. When I follow your steps it seems to work just fine, and when I edit @electron/rebuild in electron-app/node_modules to make it log out this.buildPath it's absolute.

Can you put together a sample repository that reproduces this problem?

basz commented 1 year ago

yes. try this gem... https://hithub.com/basz/ember-electron-app.git

git clone git@github.com:basz/ember-electron-app.git
cd ember-electron-app
yarn install && yarn install --cwd electron-app
npx ember electron:make

That will result in

Checking dependencies in electron-app...
Environment: production
⠴ building... [Babel: @ember-data/adapter > applyPatches]"warn" is imported from external module "@ember/debug" but never used in "-private/utils/serialize-into-hash.js" and "-private/utils/determine-body-promise.js".
⠼ building... [Babel: @ember-data/store > applyPatches]"registerWaiter" and "unregisterWaiter" are imported from external module "@ember/test" but never used in "-private/store-service.js".
cleaning up...
Built project successfully. Stored in "electron-app/ember-dist".
Making Electron project.
Expected buildPath to be an absolute path
bendemboski commented 1 year ago

I see, it's related to the webpack plugin -- if you aren't using the webpack plugin it works fine. I think that's probably a bug in the webpack plugin because neither electron-forge nor electron-packager say the path must be absolute, but the webpack plugin passes it straight to @electron/rebuild, which blows up on it. So it might be worth filing an issue and/or PRing a fix in @electron-forge for the webpack plugin.

But given the bug exists, I'd be fine with a PR making it absolute. It looks like we already do that in the electron task so I think we'd just want to add the same path.resolve() to the other tasks (package, make, and publish).

basz commented 1 year ago

That i do not understand. webpack changes paths how? shouldn't webpack be only packing stuff? are you saying that by using webpack electron-forge is bypassed or something?

I'll make a PR tomorrow to make.js and while i'm at it also package.js and publish.js

Thanks for having a look

bendemboski commented 1 year ago

The webpack plugin invokes @electron/rebuild itself, presumably because it needs native dependencies to be built for the current platform when running webpack? And this.projectDir is just the dir argument to @electron-forge, with no absolute-ifying or anything.

The core @electron-forge package method invokes @electron/rebuild as well by supplying a hook to electron-packager that does the rebuilding. electron-packager ends up doing everything off in a temp directory, and the buildPath argument that gets passed to @electron/rebuild is always an absolute path pointing into that temp directory.

So when running without the webpack plugin, the rebuild is only invoked from the package method and it is supplied an absolute path. But when running with the webpack plugin, it's invoked from both places (I think), and when invoked from the webpack plugin, blows up if dir is relative.

basz commented 1 year ago

Thank you for taking the time to explain that. Very useful insightful.