I have a hard time making Cypress work. If you use Cypress under NixOS, I would really appreciate some help.
Here is what I did and some workarounds:
rm -rf ~/.cache/Cypress
rm -rf ~/.config/Cypress
rm -rf /tmp/test-cypress
mkdir /tmp/test-cypress
cd /tmp/test-cypress
cat > shell.nix <<EOF
with import <nixpkgs> { };
{ }:
stdenv.mkDerivation {
name = "node";
buildInputs = [ pkgs."nodejs" yarn cypress ];
shellHook = ''
'';
}
EOF
nix-shell --run 'yarn init --yes'
nix-shell --run 'yarn add --dev cypress'
nix-shell --run 'yarn add --dev cypress@4.3.0'
Now you can execute:
nix-shell --run 'npx cypress open'
Instead of tacking the NixOS Cypress binary from the PATH
, it will download Cypress and try to run it from $HOME/.cache/Cypress
. We can try to force the Cypress binary we want:
nix-shell --run 'CYPRESS_INSTALL_BINARY=0 CYPRESS_RUN_BINARY=$(which Cypress) npx cypress open'
This opens Cypress and generates a few example tests. Click on one and you get a new error:
EACCES: permission denied, open '~/.config/Cypress/cy/production/browsers/chromium-stable/interactive/CypressExtension/background.js'
This file was just created but it only got the read permission:
$ ls -l '~/.config/Cypress/cy/production/browsers/chromium-stable/interactive/CypressExtension/background.js'
-r--r--r-- 1 cassou users 579142 Apr 23 09:03 ~/.config/Cypress/cy/production/browsers/chromium-stable/interactive/CypressExtension/background.js
Cypress requires write acess to this file though. What happens is that
Cypress copies files from /nix/store
to $HOME/.config/Cypress
. Because the store is read-only, the copied files are read-only by default. There was a PR trying to fix this for Cypress but the author never finished it.
We can try to first copy the Cypress binary from the store and then let Cypress copy that instead:
cp --recursive --no-preserve=mode /nix/store/mcsh4x07gp365chyzhsdq4z17shisf1s-cypress-4.3.0 Cypress-store
sed --in-place 's,^exec -a .*$,exec -a "$0" "'$PWD'/Cypress-store/bin/.Cypress-wrapped" "$@",' Cypress-store/bin/Cypress
chmod +x Cypress-store/bin/Cypress
chmod +x Cypress-store/opt/cypress/Cypress
The sed
expression adapts the NixOS shell wrapper so it calls the
right Cypress binary instead of the one on the nix store. At this
point, the $HOME/.config/Cypress/
probably contains files owned by
root so you have to get rid of it:
sudo rm -rf ~/.config/Cypress/
Now you can try again:
nix-shell --run 'CYPRESS_INSTALL_BINARY=0 CYPRESS_RUN_BINARY=$PWD/Cypress-store/bin/Cypress npx cypress open'
This works.
Is there a way to do better than all that?