NPM Link Error EEXIST -4075 when linking multiple folders - node.js

I am working on a installer, after we install the files we run a script that uses NPM Link to setup some folders.
When I run the script on my VM it works without any errors/warnings. When I try to run it on my own machine I get this error:
84 verbose node v9.5.0
85 verbose npm v5.6.0
86 error path C:\Users\me\AppData\Roaming\npm\node_modules\module
87 error code EEXIST
88 error errno -4075
89 error syscall symlink
90 error EEXIST: file already exists, symlink 'C:\Users\me\AppData\Roaming\npm\node_modules\module' -> target folder
91 error File exists: C:\Users\Me\AppData\Roaming\npm\node_modules\module
92 error Move it away, and try again.
93 verbose exit [ -4075, true ]
Now I know this file already exists, I already linked it. But I am not getting this error on my VM where I do the exact same thing. Do I need to remove the node_module everytime I link it? That can't be right, right?
I already re-installed NodeJS on my own machine.
This is basically what I do:
call NPM link ..\Folder1
call NPM link ..\Folder2
call NPM link ..\Folder3
And I have to do this for multiple folders. Some folders need to have all 3 linked, others just the 1 or the 2. So for every folder I do this in, I get the error for every operation. It does the linking but I really want to get rid of the error, especially cause it works on my VM.
I already tried to go in to the folders and call NPM Link (without arguments) but that doesn't seem to do anything.

Found out what was the problem.
First you run NPM Link (No arguments) in the source folder.
NPM Link
Then you run NPM Link module_name in the target folder.
NPM Link [module_name]
So use the module_name instead of the location.

Related

How to publish [my own] npm package that can be invoked globally

I've published a new public node app via npm. (Note: This is clearly an alpha. Don't expect very good, much less perfection.) I'm unable to get it work as a global install.
https://www.npmjs.com/package/khutzpa
To test, I installed it globally with this:
npm install -g khutzpa
On macOS, that installs in /usr/local/lib/node_modules/khutzpa for me.
I expected to be able to execute it at this point from the command line like this:
khutzpa /usr/local/lib/node_modules/khutzpa/tests/fakeSite /openInBrowser
I cannot. When I run that line, I receive:
zsh: command not found: khutzpa
I have other packages installed globally that are found, including prettier and eslint.
If I run it via a full path to its index.js, it's happy and runs exactly like I'd expect.
node /usr/local/lib/node_modules/khutzpa/index.js /usr/local/lib/node_modules/khutzpa/tests/fakeSite /openInBrowser
That's the basic issue. Is there something additional I'm supposed to set up?
More info
index.js
I think all I need in package.json is the main entry, and I have that...
"main": "index.js",
You can see the index.js file in full here.
In that file, I'm doing a if (require.main === module) { check to see if it's used as a module, which might be an issue now (?), but that doesn't seem to explain why it's not found at all.
npx
If I run with...
npx khutzpa /usr/local/lib/node_modules/khutzpa/tests/fakeSite /openInBrowser
I receive...
npm ERR! could not determine executable to run
There's not a lot more info in the log it creates afaict.
34 verbose stack Error: could not determine executable to run
34 verbose stack at getBinFromManifest (/usr/local/lib/node_modules/npm/node_modules/libnpmexec/lib/get-bin-from-manifest.js:17:23)
34 verbose stack at exec (/usr/local/lib/node_modules/npm/node_modules/libnpmexec/lib/index.js:114:15)
34 verbose stack at async module.exports (/usr/local/lib/node_modules/npm/lib/cli.js:66:5)
35 verbose pkgid khutzpa#0.0.1-alpha
36 verbose cwd /usr/local/lib/node_modules/prettier
37 verbose Darwin 21.5.0
38 verbose argv "/usr/local/bin/node" "/usr/local/lib/node_modules/npm/bin/npm-cli.js" "exec" "--" "khutzpa" "/usr/local/lib/node_modules/khutzpa/tests/fakeSite" "/openInBrowser"
39 verbose node v16.15.0
40 verbose npm v8.5.5
41 error could not determine executable to run
42 verbose exit 1
as a require in another package
Just tried invoking as an include, and it seems to work okay, except that I have to use khutzpa.default to invoke it, which I didn't think I needed to do. Maybe a hint. I'mma googling.
But I...
Created a dir.
npm init -y
On command line in that dir ran npm install khutzpa
Inserted this code:
const khutzpa = require("khutzpa");
console.log(khutzpa);
khutzpa.default("/usr/local/lib/node_modules/khutzpa/tests/fakeSite", 3000, 1);
That works, though khutzpa("/usr/local/lib/node_modules/khutzpa/tests/fakeSite", 3000, 1); does not, so maybe an export issue?
Looks like there may have been two issues:
I needed a "sharp-exclamation" in my index.js file to let npm know where node is (?).
I needed a "bin" entry in package.json.
The best way to sum this is probably by pointing at this commit that fixed things.
Here's a summary in an image with a reasonably good alt description, I believe. I'll add some WinMerge reports in a bit:

Error: ENOENT: no such file or directory | npm-created files

When I run a simple npm script to start a test, I get a peculiar error:
Error: ENOENT: no such file or directory, open 'C:\Users\Chris\AppData\Local\Temp\e2e-1656352094051.cmd'
at Object.openSync (node:fs:585:3)
at writeFileSync (node:fs:2170:35)
at makeSpawnArgs (C:\Program Files\nodejs\node_modules\npm\node_modules\#npmcli\run-script\lib\make-spawn-args.js:82:3)
at runScriptPkg (C:\Program Files\nodejs\node_modules\npm\node_modules\#npmcli\run-script\lib\run-script-pkg.js:57:55)
at runScript (C:\Program Files\nodejs\node_modules\npm\node_modules\#npmcli\run-script\lib\run-script.js:9:16)
at RunScript.run (C:\Program Files\nodejs\node_modules\npm\lib\commands\run-script.js:125:13)
at async module.exports (C:\Program Files\nodejs\node_modules\npm\lib\cli.js:78:5)
e2e is the name of the script I'm trying to run, which makes me think that e2e-1656352094051.cmd is the name of a file that npm created for itself. But how am I supposed to make sure that such a file exists when npm is the process responsible for creating the file?
I've tried searching for answer to the problem, but it's a little difficult when no such file or directory is an error message that's present for thousands of issues that are completely unrelated to my own problem.
It turns out that I had updated my version of npm that morning, and that this update (8.13) causes some quirks with the Windows filesystem when combined with script names that include a colon. I've filed a ticket with the GitHub page for the npm cli, and changed the names of my scripts to use hyphens instead of colons for now.

Node/NPM not resolving modules from local node_modules folder

I am on Windows and my app is located at folder H../my-app. my-app has a node_modules folder which has all the required modules installed. However, when I compile the app by typing the script command in terminal, Node starts looking for modules in C:/Developer... and gives error that xyz module not found, even though it is present in my-app/node_modules. Why is this happening?
I understand that Node will look for modules in global directory if not found locally, but that's also not the case here as my global node directory is in H drive, not C.
I cannot log the entire error here as I am working on a remote machine and there is no way I can copy code out of it, but here is a line of error as logged into npm-debug.log:
verbose stack Exit Status 1
verbose stack at EventEmitter.<anonymous> (C:..\node\6.3.1\node_modules\npm\node_modules\npm-lifecycle\index.js:285:16

NPM stuck giving the same error EISDIR: Illegal operation on a directory, read at error (native)

I am stuck with this error no matter what directory I am in, and what I type after "npm" in cmd.exe. Here is the npm-debug.log:
0 info it worked if it ends with ok
1 verbose cli [ 'C:\\Program Files\\nodejs\\node.exe',
1 verbose cli 'C:\\Program Files\\nodejs\\node_modules\\npm\\bin\\npm-cli.js' ]
2 info using npm#2.14.12
3 info using node#v4.2.6
4 verbose stack Error: EISDIR: illegal operation on a directory, read
4 verbose stack at Error (native)
5 verbose cwd C:\Users\me
6 error Windows_NT 6.1.7601
7 error argv "C:\\Program Files\\nodejs\\node.exe" "C:\\Program Files\\nodejs\\node_modules\\npm\\bin\\npm-cli.js"
8 error node v4.2.6
9 error npm v2.14.12
10 error code EISDIR
11 error errno -4068
12 error syscall read
13 error eisdir EISDIR: illegal operation on a directory, read
13 error eisdir This is most likely not a problem with npm itself
13 error eisdir and is related to npm not being able to find a package.json in
13 error eisdir a package you are trying to install.
14 verbose exit [ -4068, true ]
I have tried and uninstalling/reinstalling nodejs multiple times, I even deleted npm and npm-cache folders in C:\Users\me\AppData\Roaming. I'm not sure what went wrong to cause this. One second it was working fine, and now I can't get rid of this error. The explanation in the log does not make sense, as it gives this error in any directory. I should note that running a command prompt as administrator does not give this error. I'm pulling my hair out this Friday evening trying to get this fixed, any help would be greatly appreciated!
EISDIR stands for "Error, Is Directory". This means that NPM is trying to do something to a file but it is a directory. In your case, NPM is trying to "read" a file which is a directory (Line: 4). Since the operation cannot be done the error is thrown.
Three things to make sure here.
Make sure the file exists. If it does not, you need to create it. (If NPM depends on any specific information in the file, you will need to have that information there).
Make sure it is in fact a file and not a directory.
It has the right permissions. You can change the file to have all permissions with "sudo chmod 777 FILE_NAME". (Careful: You are giving Read, Write and Execute permissions to every one on that file)
I ran into the same problem while I was changing some npm settings. I did a mistake with one npm config set command and this added a line referring to a non-existing directory to C:\Users\{User}\.npmrc. After I deleted that line manually from .npmrc, the problem was gone.
In my case I was getting the "EISDIR: illegal operation on a directory, read" because in my .angular-cli.json file I wasn't providing a full path in "scripts:"
For example I had
"scripts": [
"../node_modules/hammerjs",
"../node_modules/moment"
],
In fact it should have been
"scripts": [
"../node_modules/hammerjs/hammer.min.js",
"../node_modules/moment/min/moment.min.js"
],
Had the same problem today after i've upgraded my npm from version 6.4.1 to version 6.5.0. I fixed this by downloading the .pkg installer (recommended for most users) from node.js and runned it afterwards.
I had the same issue on Mac OS X (installed with homebrew), and the .npmrc is not the only place node stored config variables. There is a glocal npmrc config file in /usr/local/etc that you have to edit using this command:
sudo nano npmrc
Remove the ca= line, or whatever the config setting was that broke your install, save that file, and try npm again, and you should see it working.
These strange errors occured recently on my OSX machine.
I could help myself the quick & dirty way by running:
sudo chmod -R 777 /usr/local/lib/node_modules/
Something seemed to have messed up the access rights of all global node modules.
For me it was because I was using the the wrong path; it should have been a path to a file yet I was wrongly using a path to a directory:
Changed this:
path.resolve(__dirname, '../');
Into this:
path.resolve(__dirname, '../.env')
So most of the answers were saying it was related to the .npmrc file.
In my case, I was deploying a serverless application using serverless deploy and the message
EISDIR: illegal operation on a directory, unlink '/home/malvadao/workspace/project/.build/node_modules'
was being thrown.
Deleting the .build folder did it for me. It was the folder generated after Typescript compilation. Since the folder is recreated after launching the serverless deploy command, it was enough to solve the problem and continue the flow.
In other words, manually deleting the folder might be enough for you to move forward, without the need to touch .npmrc
If your problem is associated with the React Native packager. Try resetting the cache with react-native start --reset-cache.
For me fixing was add slash after directory name
Make sure node_modules (and your root package.json) doesn't contain a reference to npm's "package.json" module. Deleting package.json FOLDER from node_modules solved the issue for me.
Just delete .npmrc folder in c:users>'username' and try running the command it will be resolved !
Doing a complete uninstall, including removing paths, etc and reinstalling has solved the problem, very strange problem though.
How to completely remove node.js from Windows
I had this issue with gulp. The problem was that gulp added a dependency to my source file and I think npm tried to open it:
{
"name": "name",
"version": "2.0.0",
"description": "",
"main": "gulpfile.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"devDependencies": {
"appname": "file://gulp",
"gulp-concat": "^2.6.1",
"gulp-electron": "^0.1.3",
"gulp-shell": "^0.5.2",
"gulp-uglify": "^2.0.0",
"gulp-util": "^3.0.7",
"node-7z": "^0.4.0"
}
}
Make sure that there are no strange references in you package.json file.
Check to ensure you are running npm install from the proper directory.
(The package.json file could be one extra directory down, for example.)
Had the same problem until I tried deleting the .git folder. It worked. I guess this type of problem can have different causes.
In my case I forgot to pass the full path of one of the file it was asking. After passing full path of the file worked :)
In my case, i was facing this issue while installing create-react-app in MAC (Mojave OS) with following command :
sudo npm install create-react-app -g
and got errors like this :
npm WARN tar EISDIR: illegal operation on a directory, open '/usr/local/lib/node_modules/.staging/rxjs-a84420a7/src/scheduler'
npm WARN tar EISDIR: illegal operation on a directory, open '/usr/local/lib/node_modules/.staging/rxjs-a84420a7/src/symbol'
npm WARN tar EISDIR: illegal operation on a directory, open '/usr/local/lib/node_modules/.staging/rxjs-a84420a7/src/testing'
npm WARN tar EISDIR: illegal operation on a directory, open '/usr/local/lib/node_modules/.staging/rxjs-a84420a7/src/util'
npm WARN tar EISDIR: illegal operation on a directory, open '/usr/local/lib/node_modules/.staging/rxjs-a84420a7/src/webSocket'
npm WARN tar EISDIR: illegal operation on a directory, open '/usr/local/lib/node_modules/.staging/rxjs-a84420a7/symbol'
npm WARN tar EISDIR: illegal operation on a directory, open '/usr/local/lib/node_modules/.staging/rxjs-a84420a7/testing'
npm WARN tar EISDIR: illegal operation on a directory, open '/usr/local/lib/node_modules/.staging/rxjs-a84420a7/util'
npm WARN tar EISDIR: illegal operation on a directory, open '/usr/local/lib/node_modules/.staging/rxjs-a84420a7/webSocket'
I have read npm.community that try to install without sudo :
npm install create-react-app -g
and it actually solved my issue ..!!
I had the same problem.
Recently just deleted the .npmrc file in the user directory and afterwards, I ran npm init -y
Works!
In my case, my fault was assuming, that script allow to work with directories, but it waited FILE PATH, so try to set full path to file.
In my case was:
['/var/task/myFolder']
but right path should be :
['/var/task/myFolder/sample.tgs']
Project related to chromium usage inside puppeteer on serverless was lambda. Hope, it helps.
I had a similar problem while setting up boilerplate code. It was reading my bundle.js file as a directory. So as stated here. EISDIR mean its a directory and not a file. To fix the issue, I deleted the file and just recreated (it was originally created automatically).
If you cannot find the file (because its hidden), simply use the terminal to find and delete it.
I had the same issue. There was a linked folder in my directory which was causing the issue. i added that folder to ignore list and then it started working fine as expected.
I know this isn't specifically asking about forever js.. but google lead me here so.. For me it was as simple as an ending slash.
I just changed:
forever start -a -l /dev/null/ /var/www/node/my_file.js
To:
forever start -a -l /dev/null /var/www/node/my_file.js
And the error disappeared
Make sure to check your version of npm and whether or not there are issues with it. I was having the same issue at the time of this post and I discovered that my npm version (6.5) was having issues. I had to uninstall and reinstall npm version 6.4.1 and then everything started to work great again.
I had a broken symlink to node_modules in a subfolder
In my case, I'm using Windows 10 in Spanish and this version mixes English and Spanish directory names. My problem was that the desktop directory has this name for some commands and escritorio to others. I believe that npm cannot resolve this. My solution was to simply change to another directory starting from C:\ different to my home directory.
I had faced similar issue. I set cafile using the command:
npm config set cafile PATH_TO_CERTIFICATE
I was able to resolve this by deleting the certificate file settings, and setting strict-ssl = false.
I fixed this issue by moving my directory from my exFAT drive which does not support symlinking.
My exFat drive is shared between osx and a bootcamp windows partition so when I tried to clone and npm install my project it was failing but never explains that exFAT doesn't support this functionality.
There are drivers out there that you can install to add the ability to symlink but you'll have to do a lot of your setup manually compared to running a simple npm script.
For mac os:
If installed directly from nodejs website the npmrc file would be located in /usr/local/etc/npmrc. Just delete the config which is undefined and this problem would be fixed.
In my case, the C:\Users\{user}\AppData\local\npm files were hidden, so I was not able to find & delete the trouble directory. Took me DAYS to realize this!
So double check to un-hide any folders so you don't miss them! Here's a link to do this if you don't know how.

Azure NPM Issue: msnodesql Fails to deploy

I'm trying to set up msnodesql (formerly node-sqlserver) with my azure hosted site and am running into some issues.
Essentially I'm getting a deployment failed within Azure. I believe it is due to the fact NPM is trying to install msnodesql on the server but will fail because it would need "node-gyp", Python and C++ 2010 installed (which is not present on the azure side). Here is the error message I'm seeing
npm ERR! msnodesql#0.2.0 install: `node-gyp rebuild`
npm ERR! `cmd "/c" "node-gyp rebuild"` failed with 1
npm ERR!
npm ERR! Failed at the msnodesql#0.2.0 install script.
npm ERR! This is most likely a problem with the msnodesql package,
npm ERR! not with npm itself.
npm ERR! Tell the author that this fails on your system:
npm ERR! node-gyp rebuild
npm ERR! You can get their info via:
npm ERR! npm owner ls msnodesql
npm ERR! There is likely additional logging output above.
I've been hacking at this error for a while now and nothing seems to fix it. The best answer I've gotten is to manually include the msnodesql within node_modules (as specified by http://geekswithblogs.net/shaunxu/archive/2012/11/16/install-npm-packages-automatically-for-node.js-on-windows-azure-web.aspx ). I feel like that should fix it but alas it does not. I also tried compiling it against the local x86 node and also just using a prebuilt x86 one (suggested by http://geekswithblogs.net/shaunxu/archive/2012/09/18/node.js-adventure---when-node.js-meets-windows-azure.aspx ).
Any other suggestions would be appreciated here.
Also worth noting is it's working in my local environment just fine and can grab data in from the SQL Azure DB I created (once i've whitelisted my IP) using msnodesql running within webmatrix but hitting Azure SQL DB.
I originally had an issue with the DB and the Website in Azure being on different regions, but I corrected that.
As Glenn Block mentioned, the problem stems from Azure tyring to build the native module when you deploy. This can happen for a few reasons, maybe you didn't upload the binary, maybe it's the wrong binary, or maybe the deployment directory got screwed up.
The Azure server wants the 32 bit driver for Node .6.
What I had to do was FTP into my azure server and delete everything in /site/wwwroot/ except for web.config. You can probably get away with just deleting node_modules, but because the behavior was unexpected I wanted to clean out everything.
Then I went into my Node project directory on my local machine, and went into the node_module/msnodesql directory and deleted everything but package.json and lib directory. In the lib directory, I created separate directories for the binary for my dev machine(64 bit .8) and azure, called 64 and 32 respectively.
I then modified, sqlserver.native.js as follows
try {
module.exports = require('./32/sqlserver.node'); //Azure version
}
catch (e) {
try {
module.exports = require('./64/sqlserver.node'); //My local machine
}
catch (e) {
try {
module.exports = require('../build/Release/sqlserver.node');
}
catch (e) {
console.error('Native sqlserver module not found. Did you remember to run node-gyp configure build?');
throw e;
}
}
}
The big point to make here is that, we try to load all available versions to accommodate for every possibility of deployment I might have, but give priority to the Azure server. On my local dev machine, we failed to load the node from /32 since it's the wrong format, and we fall back to /64.
I bet if I put a little bit of effort into this, I could easily trim what gets deleted down to the bare minimum, but after wasting hours upon hours resolving this, I had enough.
The reason this is failing is because it is trying to build the native module when you deploy. We don't support building native modules in Windows Azure Websites. You can however deploy the binary and then it will work but you would need to not have it in your package.json. Follow this post for more details: http://blogs.msdn.com/b/sqlphp/archive/2012/06/08/introducing-the-microsoft-driver-for-node-js-for-sql-server.aspx

Resources