jetify-com / devbox

Instant, easy, and predictable development environments
https://www.jetify.com/devbox/
Apache License 2.0
8.61k stars 197 forks source link

Node.js hook errors with direnv #1944

Open evanleck opened 7 months ago

evanleck commented 7 months ago

What happened?

I installed nodejs@20 via devbox and added direnv with devbox generate direnv and now when I cd into that directory I get this error:

direnv: loading PATH/.envrc
direnv: using devbox
PATH/.devbox/gen/scripts/.raw-hooks.sh:1: DEVBOX_COREPACK_ENABLED: unbound variable
direnv: error exit status 1

Steps to reproduce

mkdir devbox-node-repro
cd devbox-node-repro/
devbox init
devbox add nodejs@20
# Info: Adding package "nodejs@20" to devbox.json
# 
# nodejs NOTES:
# Devbox automatically configures Corepack for Nodejs when DEVBOX_COREPACK_ENABLED=1. You can install Yarn or Pnpm by adding them to your `package.json` file using # `packageManager`
# Corepack binaries will be installed in your local `.devbox` directory
# 
# This plugin creates the following helper files:
# 
# To show this information, run `devbox info nodejs`
# 
# 
devbox generate direnv
# ✓ Computed the Devbox environment.
# Success: generated .envrc file
# Success: ran `direnv allow`
# direnv: loading ~/Documents/devbox-node-repro/.envrc
# direnv: using devbox
# devbox-node-repro/.devbox/gen/scripts/.raw-hooks.sh:1: DEVBOX_COREPACK_ENABLED: unbound variable
# direnv: error exit status 1

Command

add, generate

devbox.json

{
  "$schema":  "https://raw.githubusercontent.com/jetpack-io/devbox/0.10.1/.schema/devbox.schema.json",
  "packages": ["nodejs@20"],
  "shell": {
    "init_hook": [
      "echo 'Welcome to devbox!' > /dev/null"
    ],
    "scripts": {
      "test": [
        "echo \"Error: no test specified\" && exit 1"
      ]
    }
  }
}

Devbox version

0.10.1

Nix version

nix (Nix) 2.20.5

What system does this bug occur on?

macOS (Apple Silicon)

Debug logs

No response

evanleck commented 7 months ago

Probably worth noting that I’m using fish shell.

savil commented 7 months ago

@evanleck which version of fish shell are you using?

evanleck commented 7 months ago

@savil fish 3.7.1 and direnv 2.34.0

Lagoja commented 6 months ago

Hey @evanleck, I've been trying to reproduce this but I can't get the error to replicate with Fish + Direnv. Can you try the following:

  1. Update to the latest version of Devbox using devbox version update
  2. Delete the contents of your .devbox directory, then regenerate them using devbox shell.

If those don't fix your issue, can you share the contents of the file at devbox-node-repro/.devbox/gen/scripts/.raw-hooks.sh

evanleck commented 6 months ago

@Lagoja thanks for looking into the issue.

  1. Done, I'm on 0.10.4 now.
  2. Done.

Unfortunately, that didn't seem to fix the issue. The contents of .raw-hooks.sh is:

test -z $DEVBOX_COREPACK_ENABLED || corepack enable --install-directory "/Users/evan/Code/devbox-node-repro/.devbox/virtenv/nodejs/corepack-bin/"
test -z $DEVBOX_COREPACK_ENABLED || export PATH="/Users/evan/Code/devbox-node-repro/.devbox/virtenv/nodejs/corepack-bin/:$PATH"

I don't see DEVBOX_COREPACK_ENABLED anywhere in the output of env if that's of any help.

evanleck commented 6 months ago

FWIW changing the contents of .raw-hooks to use test -v seems to fix the issue, though I'm not 100% sure it's functionally equivalent. Worth noting, test -v was introduced in bash 4.2, so this won't work on versions prior to that.

test -v DEVBOX_COREPACK_ENABLED || corepack enable --install-directory "/Users/evan/Code/devbox-node-repro/.devbox/virtenv/nodejs/corepack-bin/"
test -v DEVBOX_COREPACK_ENABLED || export PATH="/Users/evan/Code/devbox-node-repro/.devbox/virtenv/nodejs/corepack-bin/:$PATH"
drdaeman commented 5 months ago

I have exact same issue, with devbox 0.10.9 and zsh 5.9 (NixOS from the current release-24.05 tag). The test -v trick works (thanks a lot for the advice!), and so does wrapping the tests with set +u/set -u.