Yarn Workspaces does not Honor .npmrc Location Precedence: Implications and Possible Solutions
Sebastian Weber
Posted on October 4, 2019
Yarn Workspaces has a bug that does not respect the location precedence of .npmrc / .yarnrc files to configure registry settings if you run a yarn command in a selected workspace. Consider the following situation:
- A .npmrc file located at home folder specifies a registry entry to use a private npm registry.
- A .npmrc file located at a project root specifies a registry entry to target a public npm registry like this
registry=https://registry.npmjs.org
.
In my current project, I have such a situation. The default situation is that projects need a registry setup to use the internal Artifactory. One project requires a setup to target the public npm registry. The problem of this project is that adding a dependency to a specific yarn workspaces package with the following command uses the wrong registry setup (the setup of ~/.npmrc
instead of .npmrc
file located at project root):
$ yarn workspace package-a add @rooks/use-previous
The problem is that wrong URLs are put into the yarn.lock
file (targeting the private registry).
However, if you add a dependency globally with the -W
flag, then the .npmrc
precedence is honored:
$ yarn add @rooks/use-previous -W
This bug seems to exist for a very long time.
The following workarounds are possible:
- Use the
--registry
flag
$ yarn workspace package-a add @rooks/use-previous --registry 'https://registry.yarnpkg.com'
- Manually add the dependency to the
package.json
of package-a and runyarn install
from the root folder of the project. - Copy
~/.npmrc
to every project root folder that need this registry setup and delete~/.npmrc
. If you have private settings (e.g., your user credentials) in the file, pay attention that you do not push the file to VCS (add it to.gitignore
). - Don't use yarn workspaces. E.g., use Lerna with npm.
Posted on October 4, 2019
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.