diff --git a/docs/shared/guides/define-environment-variables.md b/docs/shared/guides/define-environment-variables.md index 7f9f33e117774..e2dfd9125e5d7 100644 --- a/docs/shared/guides/define-environment-variables.md +++ b/docs/shared/guides/define-environment-variables.md @@ -11,18 +11,22 @@ By default, Nx will load any environment variables you place in the following fi 1. `apps/my-app/.env.[target-name].[configuration-name]` 2. `apps/my-app/.[target-name].[configuration-name].env` -3. `apps/my-app/.env.[target-name]` -4. `apps/my-app/.[target-name].env` -5. `apps/my-app/.env.local` -6. `apps/my-app/.local.env` -7. `apps/my-app/.env` -8. `.env.[target-name].[configuration-name]` -9. `.[target-name].[configuration-name].env` -10. `.env.[target-name]` -11. `.[target-name].env` -12. `.local.env` -13. `.env.local` -14. `.env` +3. `apps/my-app/.env.[configuration-name]` +4. `apps/my-app/.[configuration-name].env` +5. `apps/my-app/.env.[target-name]` +6. `apps/my-app/.[target-name].env` +7. `apps/my-app/.env.local` +8. `apps/my-app/.local.env` +9. `apps/my-app/.env` +10. `.env.[target-name].[configuration-name]` +11. `.[target-name].[configuration-name].env` +12. `.env.[configuration-name]` +13. `.[configuration-name].env` +14. `.env.[target-name]` +15. `.[target-name].env` +16. `.local.env` +17. `.env.local` +18. `.env` {% callout type="warning" title="Order is important" %} Nx will move through the above list, ignoring files it can't find, and loading environment variables diff --git a/e2e/nx-run/src/run.test.ts b/e2e/nx-run/src/run.test.ts index a5228b9854d0e..792d482c26f68 100644 --- a/e2e/nx-run/src/run.test.ts +++ b/e2e/nx-run/src/run.test.ts @@ -189,6 +189,7 @@ describe('Nx Running Tests', () => { const myapp = uniq('app'); const target = uniq('script'); const expectedOutput = uniq('myEchoedString'); + const expectedEnvOutput = uniq('myEnvString'); runCLI(`generate @nx/web:app ${myapp}`); updateFile( @@ -196,12 +197,30 @@ describe('Nx Running Tests', () => { JSON.stringify({ name: myapp, scripts: { - [target]: `echo ${expectedOutput}`, + [target]: `echo ${expectedOutput} $ENV_VAR`, + }, + nx: { + targets: { + [target]: { + configurations: { + production: {}, + }, + }, + }, }, }) ); + updateFile( + `apps/${myapp}/.env.production`, + `ENV_VAR=${expectedEnvOutput}` + ); + expect(runCLI(`${target} ${myapp}`)).toContain(expectedOutput); + expect(runCLI(`${target} ${myapp}`)).not.toContain(expectedEnvOutput); + expect(runCLI(`${target} ${myapp} --configuration production`)).toContain( + expectedEnvOutput + ); }, 10000); it('should run targets inferred from plugin-specified project files', () => { diff --git a/packages/nx/src/tasks-runner/forked-process-task-runner.ts b/packages/nx/src/tasks-runner/forked-process-task-runner.ts index e989c11412143..aad6361f42176 100644 --- a/packages/nx/src/tasks-runner/forked-process-task-runner.ts +++ b/packages/nx/src/tasks-runner/forked-process-task-runner.ts @@ -424,10 +424,16 @@ export class ForkedProcessTaskRunner { ...parseEnv(`.${task.target.target}.env`), ...parseEnv(`.env.${task.target.target}`), ...(task.target.configuration - ? parseEnv(`.${task.target.target}.${task.target.configuration}.env`) - : {}), - ...(task.target.configuration - ? parseEnv(`.env.${task.target.target}.${task.target.configuration}`) + ? { + ...parseEnv(`.${task.target.configuration}.env`), + ...parseEnv( + `.${task.target.target}.${task.target.configuration}.env` + ), + ...parseEnv(`.env.${task.target.configuration}`), + ...parseEnv( + `.env.${task.target.target}.${task.target.configuration}` + ), + } : {}), ...parseEnv(`${task.projectRoot}/.env`), ...parseEnv(`${task.projectRoot}/.local.env`), @@ -435,14 +441,20 @@ export class ForkedProcessTaskRunner { ...parseEnv(`${task.projectRoot}/.${task.target.target}.env`), ...parseEnv(`${task.projectRoot}/.env.${task.target.target}`), ...(task.target.configuration - ? parseEnv( - `${task.projectRoot}/.${task.target.target}.${task.target.configuration}.env` - ) - : {}), - ...(task.target.configuration - ? parseEnv( - `${task.projectRoot}/.env.${task.target.target}.${task.target.configuration}` - ) + ? { + ...parseEnv( + `${task.projectRoot}/.${task.target.configuration}.env` + ), + ...parseEnv( + `${task.projectRoot}/.${task.target.target}.${task.target.configuration}.env` + ), + ...parseEnv( + `${task.projectRoot}/.env.${task.target.configuration}` + ), + ...parseEnv( + `${task.projectRoot}/.env.${task.target.target}.${task.target.configuration}` + ), + } : {}), }; } else {