npm / npm/cli

[BUG] Cannot work on FAT32 USB drive

Open
#4,558 2 comments 6 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Enhancement Release 8.x
Dominant language
JavaScript
Stars
10.1k
Forks
4.7k
Avg merge
2d 2h
Merged PRs (30d)
19

Description

Is there an existing issue for this?
  • I have searched the existing issues
This issue exists in the latest npm version
  • I am using the latest npm
Current Behavior

I have started a react-native project. But instead of keeping files on hard drive I wanted to keep everything on a USB drive. I have formated it to FAT32. And so problem starts.

npm install by default creates symlinks to binaries in node_modules/.bin/, but FAT32 does not support symlinks. So running npm install fails. Searching/googling around the internet the only thing I have found is to add --no-bin-links argument. Unfortunatelly that does not solve anything. Yes npm install works, but everything after that fails. Running npx react-native for example ends with error that command cannot be found. Which is to be expected - there is no node_modules/.bin/ because of --no-bin-links.

I decided to look around the code of npm for solutions. I have found that there is a special case made for Windows to create shims (shell, powershell, cmd files) instead of symlinks (look node_modules/bin-links/lib/link-bins.js line 4. And also I found that I can cheat this isWindows check using env variable __TESTING_BIN_LINKS_PLATFORM__ (look node_modules/bin-links/lib line 1).

And so for now I have added export __TESTING_BIN_LINKS_PLATFORM__=win32 to my env and this way I have tricked npm into creating shell scripts instead of symlinks, and it works perfectly. I can npm install onto FAT32 USB drive. I can run npx <commands> no problem.

But that is a hack/workaround, not a proper solution.

Expected Behavior

I would suggest to add new argument to npm install command. Something along the lines --prefer-bin-shims that would then make npm create shell scripts instead of symlinks on Linux systems. The code for making those shell scripts is already there, and it works perfectly on my setup. The only thing missing is a command line option.

Steps To Reproduce
  1. Format USB drive to FAT32
  2. Copy some react-native project into USB drive
  3. Run npm install
  4. Fail... Cannot create symlinks
  5. Run npm install --no-bin-links
  6. Success, but...
  7. Run npx react-native
  8. Fail... Command not found
Environment
  • npm: 8.5.4
  • Node.js: 17.7.1
  • OS Name: Arch Linux
  • System Model Name: -
  • npm config:
; "user" config from /home/szatan/.npmrc

cache = "/tmp/szatan/npm"
prefix = "/tmp/szatan/.npm"

; node bin location = /usr/bin/node
; cwd = /home/szatan
; HOME = /home/szatan
; Run `npm config ls -l` to show all defaults.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with node_modules/bin-links/lib/link-bins.js and the surrounding bin-links code, especially the platform check and TESTING_BIN_LINKS_PLATFORM workaround. Trace how npm install creates binaries when --no-bin-links is used. Done means a documented install option can create shell, PowerShell, or cmd shims on non-Windows systems so npx commands work on FAT32, with the reported reproduction no longer failing.

Written by the indexing model from the issue text.

Assessment

Tech stack
javascript, nodejs
Domain
cli, tooling
Issue type
Feature
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.