playwright/packages
Andrey Lushnikov 2064d27dc6
fix(installer): retain browsers installed via Playwrigth CLI (#5904)
Browser registry is responsible for 3 things:
1. Remove downloaded browsers if there are no packages that refer to them
2. Install default browsers needed for the current package
3. Install browsers on-demand when used through Playwright CLI

Currently, registry relies on a single "download" field in `browsers.json`
to carry both (1) and (2). However, browsers in (3) are marked as
`download: false` so that they aren't installed automatically in (2), so
auto-remove procedure in (1) removes them on subsequent installation.

One possible approach to fix this would be modifying package's `browsers.json` to
change `download: false` to `true` when browsers are installed with
Playwright CLI. This approach was explored here:
bc04a51800

We decided against this since we have a history of issues related to
package modifications after NPM installation. This breaks all
sorts of yarn/npm caching mechanisms.

Instead, this patch is a two-step refactor:
- remove the "download" field in `browsers.json`. Now, all registries
(including old ones from previously-released versions) will retain any
browsers that are mentioned in the `browsers.json`.
- add a new flag "installByDefault", that is **only used** for default
installation.

With this change, the registry tasks are done like this:
- (1) auto-removal: if browser has a back reference, it is retained,
otherwise it is removed from registry
- (2) default installation: use only `installByDefault` to carry default installations
- (3) CLI installation: simply installs browsers. Since we retain
everythings that's referenced in (1), browsers aren't removed.

Fixes #5902
2021-03-22 11:43:29 -07:00
..
common fix(types): do not use import('electron') (#5572) 2021-02-23 18:48:34 -08:00
installation-tests fix: install chromium along with ffmpeg (#5774) 2021-03-10 14:01:35 -08:00
playwright-android docs: document Android and friends (#5415) 2021-02-11 10:31:57 -08:00
playwright-chromium api: export all browsers from every package (#3128) 2020-07-24 16:36:00 -07:00
playwright-core devops: playwwright-core installation should not touch browser registry (#4089) 2020-10-08 11:42:56 -07:00
playwright-electron docs: document electron api (#5229) 2021-02-01 11:43:26 -08:00
playwright-firefox api: export all browsers from every package (#3128) 2020-07-24 16:36:00 -07:00
playwright-webkit api: export all browsers from every package (#3128) 2020-07-24 16:36:00 -07:00
.gitignore api: export all browsers from every package (#3128) 2020-07-24 16:36:00 -07:00
build_package.js fix(installer): retain browsers installed via Playwrigth CLI (#5904) 2021-03-22 11:43:29 -07:00
README.md devops: drop playwright-electron dependency on playwright-core (#2634) 2020-06-18 17:11:10 -07:00

Managing and Publishing Playwright Packages

Overview

  • Playwright ships multiple packages to NPM. All packages that are published to NPM are listed as folders under //packages/.
  • Playwright's root package.json is never published to NPM. It is only used for devmode, e.g. when running npm install with no arguments or installing from github.
  • Playwright dependencies for all packages are the same and are managed with the root package.json.
  • Playwright browser versions for all packages are the same and are managed with the browsers.json.

Note

As of May 20, 2020, the only exception is the playwright-electron package that doesn't follow the pack and is published manually. This is due to it's pre-1.0 status.

Building NPM package

To build a package that will be shipped to NPM, use //packages/build_package.js script. The script populates package folder with contents, and then uses npm pack to archive the folder.

As of May 20, 2020, //packages/build_package.js does the following:

  • copies certain files and folders from playwright-internal to the subpackage (e.g. //lib, //types, //LICENSE etc)
  • generates package.json and puts it in the subpackage
  • generates browsers.json and puts it in the subpackage
  • uses npm pack to pack the subpackage folder
  • removes all the files that were added during the process

To build playwright package and save result as ./playwright.tgz file:

$ ./packages/build_package.js playwright ./playwright.tgz

To debug what files are put into the folder, use --no-cleanup flag and inspect the package folder:

$ ./packages/build_package.js playwright ./playwright.tgz --no-cleanup
$ ls ./packages/playwright # inspect the folder

Testing packages

To test packages, use //packages/installation-tests/installation-tests.sh.

Publishing packages

All package publishing happens exclusively over CI/CD using the //utils/publish_all_packages.sh script.

Special handling for playwright-electron

  • playwright-electron version is pre-1.0.0 and thus managed separately. It's specified inside the //packages/build_package.js file.
  • playwright-electron is published manually.

To publish a new version of playwright-electron:

  1. Bump playwright-electron version inside //packages/build_package.js
  2. Submit PR with the updated version
  3. Build package with ./build_package.js playwright-electron ./playwright-electron.tgz
  4. Publish package with npm publish playwright-electron.tgz