NixOS / nixpkgs

Nix Packages collection & NixOS
MIT License
18.38k stars 14.33k forks source link

Switch from `mkYarnPackage` to `yarn{Config,Build}Hook`. #324246

Open doronbehar opened 5 months ago

doronbehar commented 5 months ago

After https://github.com/NixOS/nixpkgs/pull/318015 will be Now that https://github.com/NixOS/nixpkgs/pull/318015 is merged, we should start deprecate the usage of mkYarnPackage, because it is too complex, and hard to maintain. It also requires to vendor into Nixpkgs a package.json file for each such package (to avoid IFD, see https://github.com/NixOS/nixpkgs/issues/296856 ).

I'm opening this issue before #318015 is ready / merged to refer to this issue in a small documentation I will perform there.

The following list was generated with:

env NIXPKGS_ALLOW_INSECURE=1 nix eval --json -L --impure --expr '
  let
    pkgs = (builtins.getFlake "github:nixos/nixpkgs").legacyPackages.${builtins.currentSystem}; 
  in builtins.map (pPath: let
      p = builtins.baseNameOf (builtins.dirOf pPath);
    in if builtins.hasAttr p pkgs then
      if builtins.hasAttr "maintainers" pkgs.${p}.meta then 
        "- [ ] `${p}`: ${builtins.concatStringsSep " " (builtins.map (m: "@${m.github}") pkgs.${p}.meta.maintainers)}"
      else 
        "- [ ] `${p}`: no maintainers found"
    else
      "- [ ] `${p}`: did not found attribute automatically, file is `${pPath}`"
  ) [
    '"$(git grep -l mkYarnPackage pkgs | while read p; do echo \"$p\"; done)"'
  ]' | jq --raw-output '.[]'
gador commented 5 months ago

Is there a form of migration guide to use the new hooks?

I am using some scripted hacks to get the upstream yarn file, which also needs to be converted to the older v1 file to be used in nixpkgs. There are some dirty hacks involved, specific to pgadmin4, which would have to be used in the main derivation and not in the seperate update.sh script which right now will commit the fixed and ready to use yarn.lock file. (https://github.com/NixOS/nixpkgs/blob/master/pkgs/tools/admin/pgadmin/update.sh#L8-L16)

Also mkYarnModules did not work for pgadmin4 which needed special treatment to build the frontend and also uses the yarn webpacker. (https://github.com/NixOS/nixpkgs/blob/master/pkgs/tools/admin/pgadmin/default.nix#L110-L122)

Is there a way to not use the newly introduced hooks? Is this even desired? Or will I have to find some way to run my specially crafted update.sh and preBuild yarn magic with the hooks?

doronbehar commented 5 months ago

Thanks for willing to cooperate @gador . Indeed this can become complex... The new hooks I added indeed usually makes things a bit simpler, but in such a complex case as you describe, you will have to play with it yourself, and there is no migration guide. However, there are many migration examples in #318015 .

The non-trivial update scripts were discussed a bit in https://github.com/NixOS/nixpkgs/pull/318015 . I believe that with the new hooks you should be able to reach a point where you don't vendor any file (neither yarn.lock or package.json), and you should also be able to update your package with nix-update which is capable of updating the hash of the offlineCache by itself.

gador commented 5 months ago

Thanks for all your work @doronbehar ! I looked through your examples. AFAI can see I could rely on my update script and build script as it is now and not use the newly introduced hooks and everything should continue to work fine. I don't use mkYarnPackage anyway. However I will look into it if there is a way to use the hooks and maybe get rid of the packaged yarn.lock file in the future!

lelgenio commented 4 months ago

I think we'll also need a yarnInstallHook: https://github.com/NixOS/nixpkgs/pull/328544

pyrox0 commented 3 months ago

koodoo-reader, listmonk, spectral-language-server, and treedome were all migrated in #318015

Further, typst-preview can be removed from the list, as it was removed in #325275.

tengkuizdihar commented 3 months ago

thank you for migrating my package, sorry I didn't help in the migration

gcoremans commented 3 weeks ago

Do yarnConfigHook and yarnBuildHook support yarn v2 and up lockfiles?

lelgenio commented 3 weeks ago

Do yarnConfigHook and yarnBuildHook support yarn v2 and up lockfiles?

No, they rely on the same fetchYarnDeps that was used by mkYarnPackage.

Here's an issue about that: https://github.com/NixOS/nixpkgs/issues/254369