6

How could I add a script to my package.json file that would allow me to dynamically use a local file instead of a package version based on an environment variable?

"dependencies": {
  "dynamic-dependency": "$(process.env.NODE_ENV !== 'dev' ? '^1.0.7' : 'file:../local-path-to-package')"
}
JulienRioux
  • 2,853
  • 2
  • 24
  • 37

1 Answers1

3

You can't do this in package.json, which is non-executable JSON file. The JSON variant used in package.json doesn't even support comments :). The purpose of package.json is to specify which dependencies are installed into node_modules, and that's it. With those dependencies installed, they can be used by Node at runtime, which locates them using the module resolution algorithm:

If the module identifier passed to require() is not a core module, and does not begin with '/', '../', or './', then Node.js starts at the parent directory of the current module, and adds /node_modules, and attempts to load the module from that location. Node.js will not append node_modules to a path already ending in node_modules.

So you can't use NPM/package.json for this. But, I see that you tagged your question with React, so if you are using Webpack, you can solve this issue in your Webpack config. This can be done with resolve.alias:

const path = require('path');

module.exports = {
  //...
  resolve: {
    alias: {
      'dynamic-dependency': process.env.NODE_ENV !== 'dev' ? 'dynamic-dependency' : path.resolve(__dirname, '../local-path-to-package'),
    },
  },
};

I have not used other JS bundlers, but I would have to think Parcel/Rollup etc support this kind of configuration as well.

Dmitry Minkovsky
  • 36,185
  • 26
  • 116
  • 160