I'm trying to use a private NPM module in my application, and need to set appropriate NPM access tokens so that third-party tools (Heroku and CI) can access, and install the module.
I have the following line set in my ~/.bash_profile
:
export NPM_TOKEN="XXXXX-XXXXX-XXXXX-XXXXX"
and then in the /path/to/app/.npmrc
I have
//registry.npmjs.org/:_authToken=${NPM_TOKEN}
However, whenever I open my terminal, I get the following error on startup:
Error: Failed to replace env in config: ${NPM_TOKEN} at /Users/marcthomas/.nvm/versions/node/v4.2.1/lib/node_modules/npm/lib/config/core.js:429:13 at String.replace (native) at envReplace (/Users/marcthomas/.nvm/versions/node/v4.2.1/lib/node_modules/npm/lib/config/core.js:424:12) at parseField (/Users/marcthomas/.nvm/versions/node/v4.2.1/lib/node_modules/npm/lib/config/core.js:400:7) at /Users/marcthomas/.nvm/versions/node/v4.2.1/lib/node_modules/npm/lib/config/core.js:338:17 at Array.forEach (native) at Conf.add (/Users/marcthomas/.nvm/versions/node/v4.2.1/lib/node_modules/npm/lib/config/core.js:337:23) at ConfigChain.addString (/Users/marcthomas/.nvm/versions/node/v4.2.1/lib/node_modules/npm/node_modules/config-chain/index.js:244:8) at Conf.<anonymous> (/Users/marcthomas/.nvm/versions/node/v4.2.1/lib/node_modules/npm/lib/config/core.js:325:10) at /Users/marcthomas/.nvm/versions/node/v4.2.1/lib/node_modules/npm/node_modules/graceful-fs/graceful-fs.js:76:16 /Users/marcthomas/.nvm/versions/node/v4.2.1/lib/node_modules/npm/lib/npm.js:29 throw new Error('npm.load() required') ^ Error: npm.load() required at Object.npm.config.get (/Users/marcthomas/.nvm/versions/node/v4.2.1/lib/node_modules/npm/lib/npm.js:29:11) at exit (/Users/marcthomas/.nvm/versions/node/v4.2.1/lib/node_modules/npm/lib/utils/error-handler.js:58:40) at process.errorHandler (/Users/marcthomas/.nvm/versions/node/v4.2.1/lib/node_modules/npm/lib/utils/error-handler.js:385:3) at emitOne (events.js:77:13) at process.emit (events.js:169:7) at process._fatalException (node.js:221:26) nvm is not compatible with the npm config "prefix" option: currently set to "" Run `nvm use --delete-prefix v4.2.1 --silent` to unset it.
However, running echo $NPM_TOKEN
returns the correct token, so the variable definitely exists.
If I run source ~/.bash_profile
the error disappears, and I can install as normal.
Any help appreciated as I'm bashing my head against a wall at this problem!
The fix for me was moving export NPM_TOKEN="XXXXX-XXXXX-XXXXX-XXXXX"
before my nvm stuff in .bash_profile
from
export NVM_DIR=~/.nvm source ~/.nvm/nvm.sh export NPM_TOKEN="XXXXX-XXXXX-XXXXX-XXXXX"
to
export NPM_TOKEN="XXXXX-XXXXX-XXXXX-XXXXX" export NVM_DIR=~/.nvm source ~/.nvm/nvm.sh
Update your CI deployment configuration:
npm config set '//registry.npmjs.org/:_authToken' "${NPM_TOKEN}" npm publish
Remove this line from the .npmrc
file:
//registry.npmjs.org/:_authToken=${NPM_TOKEN}
You can see this solution used in practice in one of my GitHub repositories: https://github.com/Jezorko/lambda-simulator/blob/master/.travis.yml
The encrypted environment variable is an NPM token.
I've seen answers here and under this question that recommend simply removing the variable setting line or .npmrc
file entirely.
Thing is, the .npmrc
file might not be ignored by your VCS system and modifying it might lead to accidental pushes to your project's repository. Additionally, the file may contain other important settings.
The problem here is that .npmrc
does not allow defaults when setting up environment variables. For example, if the following syntax was allowed, the issue would be non-existent:
//registry.npmjs.org/:_authToken=${NPM_TOKEN:-undefined}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With