inxilpro / node-app-root-path

Determine the root path to your project
MIT License
605 stars 29 forks source link

Path resolution in npm linked modules report module and not root app path. #33

Open MarkGriffiths opened 5 years ago

MarkGriffiths commented 5 years ago

I only noticed this today when changes in globby starting throwing path errors, so might have been there a while and I just didn't notice.

Under node v11, working in an app with the following pattern:

./project/app/
./project/shared-lib-1/
./project/shared-lib-2/

app-root-path is used in each shared lib. When these are installed with npm install, the libs correctly report the app's root path. In development, when the libs are linked with npm link, app-root-path reports the root path of the lib module, not the app.

stoicskyline commented 5 years ago

The cause is using __dirname to resolve the root path.

If a module is linked while being used locally in an app, the __dirname in app-root-path may not overlap with the app's path.

It makes using npm link or yarn link quite a hassle. Is there an easy way to fix this, or perhaps app-root-path is simply not intended to be used in a NPM module?

harryhorton commented 4 years ago

Ran into this issue in an npm module I was developing. It worked great when actually npm/yarn installed, but not when linked. I ended up just creating a workaround option in my package for project root. However, it'd be great if there was a fallback if linked to somehow get the running project's root.

MetaMmodern commented 3 years ago

same issue here( Does not work when creating custom package for npm, it starts referring to the package project directory.

FagnerMartinsBrack commented 3 years ago

I have to share an interesting bug that caused an outage and took me a long time to figure out and is directly related to this issue:

https://medium.com/@fagnerbrack/the-story-of-a-stupid-bug-that-is-impossible-to-reproduce-6863ac526172

Basically:

  1. NPM install on local files creates a symlink.
  2. Zipping removes the symlink.
  3. This can cause a bug with tools like app-root-path that uses _dirname which can only happen in prod and is impossible to reproduce locally.

Exactly like what @jorgechen said.

ByScripts commented 2 years ago

Same problem with pnpm workspaces.

Temporarily, I solved the issue by defining a APP_ROOT_PATH environment var.

"scripts": {
  "dev": "APP_ROOT_PATH=`pwd` my-dev-command"
}
gtbuchanan commented 2 months ago

I've been trying to find a solution for this, but it's not straightforward. The best non-custom workaround for my use case is the INIT_CWD environment variable, but this assumes that you ran a script with npm run (or variant, like pnpm run).