tj / n

Node version management

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Using a cached download fails

fhoeben opened this issue · comments

Problem

Unable to use a previously downloaded version of node 16

Short Version

When I restore previously downloaded nodejs version and I try to switch to another version it doesn't work

found : /codebuild/output/src3902752751/src/.nvmrc
read : v16.20.0
copying : node/16.20.0
find: '/usr/local/n/versions/node/16.20.0/lib': No such file or directory
cp: cannot stat '/usr/local/n/versions/node/16.20.0/bin/node': No such file or directory
find: '/usr/local/n/versions/node/16.20.0/include': No such file or directory
find: '/usr/local/n/versions/node/16.20.0/share': No such file or directory
find: '/usr/local/n/versions/node/16.20.0/share/man': No such file or directory
/usr/local/bin/n: line 744: /usr/local/bin/node: No such file or directory
installed :  (with npm 6.14.13)

Long Version

Since downloading node 16 can take up to 5 minutes I would like to cache the downloaded contents and re-use that in my CI server (Linux). But when I cache and restore /usr/local/n/**/* (or /usr/local/n/versions/node/**/*). I get these errors about file or directories not found. When I don't cache the directories all goes well.

When I try to cache locally on my Mac I can reproduce this problem using the environment variables (N_CACHE_PREFIX or N_PREFIX) from the README.

% mkdir tmp/n_cache
% export N_CACHE_PREFIX=tmp/n_cache
% n auto
       found : /Users/fried/dev/itrp/4me-core/.nvmrc
        read : v16.20.0
  installing : node-v16.20.0
       mkdir : tmp/n_cache/n/versions/node/16.20.0
       fetch : https://nodejs.org/dist/v16.20.0/node-v16.20.0-darwin-arm64.tar.xz
#=#=-  #       #                                                                                                                                                                                                                                               #=O#-     #        #                                  
     copying : node/16.20.0
find: tmp/n_cache/n/versions/node/16.20.0/lib: No such file or directory
cp: tmp/n_cache/n/versions/node/16.20.0/bin/node: No such file or directory
find: tmp/n_cache/n/versions/node/16.20.0/include: No such file or directory
find: tmp/n_cache/n/versions/node/16.20.0/share: No such file or directory
find: tmp/n_cache/n/versions/node/16.20.0/share/man: No such file or directory
/Users/fried/.nvm/versions/node/v16.20.0/bin/n: line 744: /usr/local/bin/node: No such file or directory
   installed : 

or

% mkdir tmp/n_cache2               
% export N_PREFIX=tmp/n_cache2 
% n auto                           
       found : /Users/fried/dev/itrp/4me-core/.nvmrc
        read : v16.20.0
  installing : node-v16.20.0
       mkdir : tmp/n_cache/n/versions/node/16.20.0
       fetch : https://nodejs.org/dist/v16.20.0/node-v16.20.0-darwin-arm64.tar.xz
     copying : node/16.20.0
find: tmp/n_cache/n/versions/node/16.20.0/lib: No such file or directory
cp: tmp/n_cache/n/versions/node/16.20.0/bin/node: No such file or directory
find: tmp/n_cache/n/versions/node/16.20.0/include: No such file or directory
find: tmp/n_cache/n/versions/node/16.20.0/share: No such file or directory
find: tmp/n_cache/n/versions/node/16.20.0/share/man: No such file or directory
/Users/fried/.nvm/versions/node/v16.20.0/bin/n: line 744: tmp/n_cache2/bin/node: No such file or directory
   installed : 

How do I properly setup a cache so I don't have to download the required node version each time?

Configuration

n --version
v9.1.0

And I double checked, the directories that are reported as not found seem to exist:

% ls -la tmp/n_cache/n/versions/node/16.20.0
total 1656
drwxr-xr-x@ 11 fried  staff     352 Aug 16 09:40 .
drwxr-xr-x@  3 fried  staff      96 Aug 16 09:38 ..
-rw-r--r--@  1 fried  staff  713847 Mar 28 22:30 CHANGELOG.md
-rw-r--r--@  1 fried  staff   92799 Mar 28 22:30 LICENSE
-rw-r--r--@  1 fried  staff   35345 Mar 28 22:30 README.md
drwxr-xr-x@  6 fried  staff     192 Aug 16 09:40 bin
drwxr-xr-x@  3 fried  staff      96 Mar 28 22:30 include
drwxr-xr-x@  4 fried  staff     128 Mar 28 22:30 lib
-rw-r--r--@  1 fried  staff       0 Aug 16 09:39 n.lock
drwxr-xr-x@  5 fried  staff     160 Mar 28 22:30 share
drwxr-xr-x@  3 fried  staff      96 Aug 16 09:40 tmp

% ls -la tmp/n_cache/n/versions/node/16.20.0/lib
total 0
drwxr-xr-x@  4 fried  staff  128 Mar 28 22:30 .
drwxr-xr-x@ 11 fried  staff  352 Aug 16 09:40 ..
drwxr-xr-x@  3 fried  staff   96 Aug 16 09:39 dtrace
drwxr-xr-x@  4 fried  staff  128 Mar 28 22:30 node_modules

Found the issue: one has to use full paths and not relative directories.

So using export N_CACHE_PREFIX=/Users/fried/dev/itrp/4me-core/tmp/n_cache makes it work locally.

I think it would be good to add this to the README.md, or just fix it so relative paths also work.

On my CI server I always get a different local directory so having to specify a full path is an extra hassle I would like to avoid.

(Had this typed up, so posting although new information confirmed this is the problem!)

I am not sure this explains all your problems, but I was able to reproduce an error for this case:

% mkdir tmp/n_cache
% export N_CACHE_PREFIX=tmp/n_cache
% n v16
...
find: tmp/n_cache/n/versions/node/16.20.2/lib: No such file or directory

The problem here is the path is only relative. With an absolute path, the installs succeeds.

% export N_CACHE_PREFIX=${pwd}/tmp/n_cache
% n v16                                   
...
   installed : v16.20.2 (with npm 8.19.4)

On my CI server I always get a different local directory so having to specify a full path is an extra hassle I would like to avoid.

This is easy to achieve in a script:

export N_CACHE_PREFIX="${pwd}/tmp/n_cache"

Thanks for the pointer. I already addressed it, but I would have rather not have had to think about it.

So I have a working solution but I believe it would be good that you either documented the fact it needs to be a full path, or (even better) allow the usage of relative paths for these environment variables.