Home > Back-end >  How should I load package.json for a CLI app installed globally?
How should I load package.json for a CLI app installed globally?

Time:12-13

I created a cli application which reads its version number from package.json with this bit of code

const packageJson = JSON.parse(fs.readFileSync(path.resolve('./package.json'), 'utf8'))

This works fine if I run the app with yarn start or a similar command while development But after the package is installed with npm install --global app-name the user should use the declare executable from any path on the system. So if I want to run it say in /Users/myUser/Desktop I get an error like this

Error: ENOENT: no such file or directory, open '/Users/myUser/Desktop/package.json'

So what's a good protocol of loading this package.json within my CLI or is there a better way for approaching this?

CodePudding user response:

is there a better way for approaching this?

Yes - you should store the version number in the actual package itself somewhere. This way it will always be available/accessible and there's no risk of the package.json version and the installed version becoming out of sync. For example, if someone adds your package to a project and then runs yarn install, but later uses git pull to get an up-to-date version of their local files which happens to include a version bump for your package, there is a window where the package.json has a different version number to the installed version.

CodePudding user response:

Use __dirname because it always refers to the path of the file that contains this variable, whereas ./ gives you the working directory, such as process.cwd().

const packageJson = JSON.parse(fs.readFileSync(
  path.join(__dirname, 'package.json'), 'utf8')
)
  • Related