rescript-lang / rescript-lang/rescript

Support Yarn-pnp, esy, and npm-link

Aperta
#3,276 13 commenti 69 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

build
Lingua principale
OCaml
Stelle
7.5k
Fork
485
Merge medio
1g 2h
PR unite (30g)
55

Descrizione

The following workflows and package managers don't work when tools build into node_modules directories, or rely on dependencies existing in node_modules.

Because of this, developers building native apps with esy cannot use bs-platform at all. They have very frequently requested the ability to use esy to build bs apps, but there's not much esy can do at this point, and the solution to esy is the same as the solution to yarn pnp and npm link, so might as well solve all three at once.

  1. Yarn Plug'n'play. (Stores dependencies in global cache).
  2. esy used to manage JS dependencies (uses yarn plugin'n'play standard).
  3. Npm link workflows. Two packages can link to the same dependency, with different build flags so putting build artifacts into that dependency's root will have artifacts conflict with each other).

Here's what I believe needs to happen to make bs-platform work with all three of these. The solutions are largely the same for all use cases:

Stop Building Into Dependencies' node_modules

Solves Problems with: Yarn pnp, Esy pnp.

The idea here is that all libraries should be built into the top level project's root directory. Separate Tracking Issue

Don't assume dependencies even exist in node_modules.

Solves Problems with: Yarn pnp, Esy pnp.

Since esy and yarn both never touch the disk if it can read the dependencies from an immutable cache, we can't assume the packages are located at node_modules. Instead yarn pnp generates a .pnp.js and esy generates a ./_esy/default/pnp.js file. That tells you the real locations of dependencies in the immutable cache. Esy uses the exact same pnp standard, but we can make some changes if it makes it easier for you.

Optimization: Yarn pnp requires starting up a JS VM to determine the location of dependencies. I believe we can make esy's pnp.js file carefully constructed so that bsb could just read the locations directly from the text file by parsing simple strings instead of starting a JS VM. It would also work if you started it up with a JS VM but we can overlay an additional protocol on top of yarn pnp for the sake of additional performance.

Avoid postinstall for bs-platform's installation.

Solves Problems with: Yarn pnp.
Esy and npm can still tolerate a postinstall step for bs-platform, but yarn pnp cannot. It's better to avoid it if possible so that even yarn pnp can work well. If not, then at least esy pnp and npm link workflows would still work.

Model compiler explicitly:

This one is only relevant for esy. But if there is an esy.json file alongside package.json for bs-platform, which expresses the dependency on the ocaml compiler it uses, and its version, then esy could be used to install native ocaml ppx's for BuckleScript projects.

Guida per i contributori

Apri la guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Direzione di ricerca

La issue identifica package.json, esy.json, .pnp.js e ./_esy/default/pnp.js come punti di integrazione rilevanti; inizia tracciando il modo in cui bsb individua le dipendenze e dove scrive gli artefatti di build. Confronta la tracking issue separata #2418 e definisci il completamento per i workflow Yarn Plug'n'Play, esy e npm-link, inclusa l'installazione senza postinstall e i metadati espliciti del compilatore OCaml.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
javascript, ocaml
Ambito
build-system, compilers
Tipo di issue
Funzionalità
Difficoltà
5/5
Tempo stimato
Più di una settimana
Stato di attività
Ferma
Chiarezza
Da chiarire
Idoneità per principianti
20/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.