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.