Explicit environment variable is not honoured when calling another task #593
Copy link
Copy link
Closed
Labels
area: envChanges related to environment variables.Changes related to environment variables.
Description
- Task version:
3.3.0 - Operating System:
Windows 10 (git bash)
Taskfile
version: '3'
vars:
VAR_GLOBAL: IM_VAR_GLOBAL
env:
ENV_GLOBAL: IM_ENV_GLOBAL
tasks:
env_caller:
cmds:
- { task: env_subtask, env: { ENV_CALLER_ARG: IM_ENV_CALLER_ARG }, vars: { VAR_CALLER_ARG: IM_VAR_CALLER_ARG }}
env: { ENV_CALLER: IM_ENV_CALLER }
vars: { VAR_CALLER: IM_VAR_CALLER }
env_subtask:
cmds:
- echo ENV_GLOBAL=$ENV_GLOBAL
- echo ENV_CALLER=$ENV_CALLER
- echo ENV_CALLER_ARG=$ENV_CALLER_ARG
- echo VAR_GLOBAL={{.VAR_GLOBAL}}
- echo VAR_CALLER={{.VAR_CALLER}}
- echo VAR_CALLER_ARG={{.VAR_CALLER_ARG}}Output
$ ./task env_caller
ENV_GLOBAL=IM_ENV_GLOBAL
ENV_CALLER=
ENV_CALLER_ARG=
VAR_GLOBAL=IM_VAR_GLOBAL
VAR_CALLER=
VAR_CALLER_ARG=IM_VAR_CALLER_ARG
I expect that ENV_CALLER_ARG should be valid in env_subtask. Am I missing something?
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
area: envChanges related to environment variables.Changes related to environment variables.
Type
Fields
No fields configured for feature.
Activity
aminya commentedon Nov 14, 2021
I hit a similar situation. Although I specify CC and CXX, it still uses the global environment variable.
clang is printed instead of GCC
This is also related to #185
kerma commentedon Dec 4, 2021
There are couple of different issues here. @chris-garrett your env_caller
envandvarsvalues are only applicable for shell commands called within that command block. If you call another task with-task: env_subtaskyou can only pass vars to it. env block is ignored.@aminya you're mixing up vars and env syntax. Both commands work here:
chris-garrett commentedon Dec 5, 2021
@kerma welcome to the collabs list!
Can you explain why this is? Is this actually the behaviour that is desired?
Without this we are forced to convert ENVs to VARs and carry them around until you convert back to ENV when you need it. It's very clumsy on large projects.
kerma commentedon Dec 6, 2021
@chris-garrett I'm new to the project, so cannot tell the historical reasons, but atm it's how it's implemented.
There is another issue slightly related to this: #585.
To me it feels like task is missing a well documented context which is creating the confusion. To be honest I think it may be something I'd look into. Having a simple context and inheritance rules for dir, env and vars would probably make life easier for everyone. However it would be a major change and would need a new taskfile version.
dustinlharrison commentedon Jul 19, 2023
@kerma and @chris-garrett I "discovered" the same behaviour as well, and the behaviour is documented:
After much pain, testing and searching, I did finally realize that a shell command was being handled different than a task command from the
taskAPI reference:This was surprising since the schema suggests that it applies to all uses of env within the current task declaration. Whether this is intended, a bug or a feature request, I think there is a very strong case for it to work, and if not, then
envshould be removed from the target declaration and only be supported by individualcmddeclarations.I think making it work for both task invocation and shell invocation encourages reusability of tasks and 12 factor apps.
@andreynering I think this issue was opened before the labelling system was developed, can you consider applying the appropriate labels since I don't have permission?
treybrisbane commentedon Jul 12, 2024
This bit me as well, today. 😢
Is it difficult to fix?
If it's not practical/desirable to have the env vars implicitly apply to sub-task calls, could/should we instead perhaps give sub-task calls a dedicated
envblock to allow passing env vars explicitly?E.g.
This would fit nicely with sub-task calls' existing
varblock, and at least give us some way of passing env vars to sub-tasks.trim21 commentedon Jul 12, 2024
yes, I think we should add a
envoption to task call.uded commentedon Feb 20, 2025
I would love to upvote this one. Would make my Taskfile structure much less complex...
trulede commentedon Jan 18, 2026
In Task vars and envars are different things. Vars are used to exchange values between tasks (calls, includes, deps etc) and build command expression with template expansion based on those vars. Envars are used to inject values into the command environment for values that cannot be provided by a command expression.
Internally, vars and envars are represented by the same type, and that sometimes tempts people with interesting ideas ...
But actually, the existing mechanism is quite capable. Passing envars to a called task can be done with
dotenvfiles.To set envars for a Task, you have (at least) these options:
.REFto reference vars which is sometimes useful.This taskfile demonstrates most of those methods: