Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Failed to replace env in config using Bash & NPM

Tags:

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!

like image 953
Marc Thomas Avatar asked Feb 18 '16 14:02

Marc Thomas


2 Answers

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 
like image 166
Paul Nispel Avatar answered Sep 19 '22 16:09

Paul Nispel


Actually proper solution

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} 

Example build config

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.

Why the other "solutions" are mere workarounds

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}

like image 24
Jezor Avatar answered Sep 20 '22 16:09

Jezor