Document packaging, and add a script that verifies a package runs
A package broken in the ways that matter still builds, installs and starts; native modules left inside the asar fail on a user's machine the first time they open a terminal. scripts/verify-package.mjs extracts the AppImage and asserts the binaries really are unpacked beside it. Also records that the deb metadata fields are placeholders.
This commit is contained in:
@@ -22,7 +22,7 @@ Early. See the milestone table in the implementation plan.
|
|||||||
| M6 | Flow control and reconnect resilience | done |
|
| M6 | Flow control and reconnect resilience | done |
|
||||||
| M7 | Port forwarding (`-L` / `-R` / `-D`) | |
|
| M7 | Port forwarding (`-L` / `-R` / `-D`) | |
|
||||||
| M8 | Local terminal + serial | local terminal done, serial not |
|
| M8 | Local terminal + serial | local terminal done, serial not |
|
||||||
| M9 | Packaging | |
|
| M9 | Packaging | done |
|
||||||
|
|
||||||
## Prerequisites
|
## Prerequisites
|
||||||
|
|
||||||
@@ -151,6 +151,45 @@ That covers the whole outbound path, and the result cannot be faked by a
|
|||||||
rendering bug. The final report carries `remoteUser`, read back from a file the
|
rendering bug. The final report carries `remoteUser`, read back from a file the
|
||||||
remote wrote — which is the return path proven separately.
|
remote wrote — which is the return path proven separately.
|
||||||
|
|
||||||
|
## Packaging
|
||||||
|
|
||||||
|
```sh
|
||||||
|
npm run dist # AppImage + deb into release/
|
||||||
|
npm run verify:package # check the result can actually run
|
||||||
|
```
|
||||||
|
|
||||||
|
`scripts/verify-package.mjs` exists because a package that is broken in the
|
||||||
|
ways that matter still builds, still installs, and still starts. Native modules
|
||||||
|
cannot be loaded from inside an asar archive, and when they are left there the
|
||||||
|
failure appears on a user's machine the first time they open a terminal — not
|
||||||
|
in CI, and not in `npm test`. So the script extracts the AppImage and asserts
|
||||||
|
that each native binary really is in `app.asar.unpacked`.
|
||||||
|
|
||||||
|
Two things it checks that are easy to get wrong:
|
||||||
|
|
||||||
|
- **`ssh2` carries a native module.** `sshcrypto.node` is easy to miss because
|
||||||
|
the library reads as pure JavaScript — and because a failed load falls back
|
||||||
|
to a JS implementation silently, so nothing would ever report it.
|
||||||
|
- **`node-pty` must be unpacked whole, not just its `.node` files.** On macOS
|
||||||
|
and Windows it ships `spawn-helper`, a real executable loaded from disk rather
|
||||||
|
than `dlopen`ed, which stays trapped in the archive if only `*.node` is
|
||||||
|
unpacked.
|
||||||
|
|
||||||
|
`npmRebuild` is off: every native module here is built on `node-addon-api`, so
|
||||||
|
the binaries from `npm install` load unchanged in Electron's Node. Rebuilding
|
||||||
|
would cost time and risk replacing working binaries for no gain.
|
||||||
|
|
||||||
|
Both `.deb` metadata and `desktopName` are set, and the AppImage's
|
||||||
|
`.desktop` entry is generated from `linux.desktop.entry`.
|
||||||
|
|
||||||
|
### Packaging notes for whoever picks this up
|
||||||
|
|
||||||
|
- The `author`, `homepage` and `maintainer` fields are **placeholders**
|
||||||
|
(`ylhan@example.com`, `example.com`). They are required by the deb format and
|
||||||
|
must be replaced before distributing.
|
||||||
|
- `asarUnpack` lists `node_modules/@serialport/**` for a backend that does not
|
||||||
|
exist yet. Harmless now; load-bearing once the serial transport lands.
|
||||||
|
|
||||||
## Toolchain constraints
|
## Toolchain constraints
|
||||||
|
|
||||||
### Why Electron is pinned exactly
|
### Why Electron is pinned exactly
|
||||||
|
|||||||
Reference in New Issue
Block a user