Define Environment Variables
Environment variables are global system variables accessible by all the processes running under the Operating System (OS). Environment variables are useful to store system-wide values such as the directories to search for executable programs (PATH), OS version, Network Information, and custom variables. These env variables are passed at build time and used at the runtime of an app.
Set Environment Variables
By default, Nx will load any environment variables you place in the following files:
apps/my-app/.env.[target-name].[target-configuration-name].local
apps/my-app/.env.[target-name].[target-configuration-name]
apps/my-app/.env.[target-name].local
apps/my-app/.env.[target-name]
apps/my-app/.[target-name].[target-configuration-name].local.env
apps/my-app/.[target-name].[target-configuration-name].env
apps/my-app/.[target-name].local.env
apps/my-app/.[target-name].env
apps/my-app/.env.local
apps/my-app/.local.env
apps/my-app/.env
.env.[target-name].[target-configuration-name].local
.env.[target-name].[target-configuration-name]
.env.[target-name].local
.env.[target-name]
.[target-name].[target-configuration-name].local.env
.[target-name].[target-configuration-name].env
.[target-name].local.env
.[target-name].env
.env.local
.local.env
.env
Nx will move through the above list, ignoring files it can't find, and loading environment variables into the current process for the ones it can find. If it finds a variable that has already been loaded into the process, it will ignore it. It does this for two reasons:
- Developers can't accidentally overwrite important system level variables (like
NODE_ENV
) - Allows developers to create
.env.local
or.local.env
files for their local environment and override any project defaults set in.env
- Allows developers to create target specific
.env.[target-name]
or.[target-name].env
to overwrite environment variables for specific targets. For instance, you could increase the memory use for node processes only for build targets by settingNODE_OPTIONS=--max-old-space-size=4096
in.build.env
For example:
apps/my-app/.env.local
containsNX_PUBLIC_API_URL=http://localhost:3333
apps/my-app/.env
containsNX_PUBLIC_API_URL=https://api.example.com
- Nx will first load the variables from
apps/my-app/.env.local
into the process. When it tries to load the variables fromapps/my-app/.env
, it will notice thatNX_PUBLIC_API_URL
already exists, so it will ignore it.
We recommend nesting your app specific env
files in apps/your-app
, and creating workspace/root level env
files for workspace-specific settings (like the Nx Cloud token).
Environment Variables for Configurations
Nx will only load environment variable files for a particular configuration if that configuration is defined for a task, even if you specify that configuration name from the command line. So if there is no development
configuration defined for the app
's build
task, the following command will use .env.build
instead of .env.build.development
:
โฏ
nx build app --configuration development
In order to have Nx actually use the .env.build.development
environment variables, the development
configuration needs to be set for the task (even if it is empty).
1{
2 "targets": {
3 "build": {
4 // ...
5 "configurations": {
6 "development": {}
7 }
8 }
9 }
10}
11
Point to Custom Env Files
If you want to load variables from env
files other than the ones listed above:
- Use the env-cmd package:
env-cmd -f .qa.env nx serve
- Use dotenvx:
dotenvx run --env-file=.qa.env -- nx serve
- Use the
envFile
option of the run-commands builder and execute your command inside of the builder
Ad-hoc Variables
You can also define environment variables in an ad-hoc manner using support from your OS and shell.
Unix systems
In Unix systems, we need to set the environment variables before calling a command.
Let's say that we want to define an API URL for the application to use:
โฏ
NX_PUBLIC_API_URL=http://localhost:3333 nx build myapp
Windows (cmd.exe)
โฏ
set "NX_PUBLIC_API_URL=http://localhost:3333" && nx build myapp
Windows (Powershell)
โฏ
($env:NX_PUBLIC_API_URL = "http://localhost:3333") -and (nx build myapp)