Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Recompile task after runDeps to reload envs set by deps #1746

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions task.go
Original file line number Diff line number Diff line change
Expand Up @@ -195,6 +195,13 @@ func (e *Executor) RunTask(ctx context.Context, call *ast.Call) error {
if err := e.runDeps(ctx, t); err != nil {
return err
}
if len(t.Deps) > 0 {
// Recompile the task after running dependencies to reload environment variables from dotenv files which may have been set up during the dependency execution
t, err = e.CompiledTask(call)
if err != nil {
return err
}
}
Comment on lines +198 to +204
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This introduces a small performance penalty, and is something that is not needed 99% of the time.

I'm not so sure that it's worth doing for this rare edge case. In this case, it could be better to just run both tasks separately so you ensure that the .env file exists before running the actual task.

task setup && task actual-task

I suppose that your .env should be generated only once, right? I wouldn't expect a .env file to have to be generated on every run.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for your feedback. In a large monorepo like ours, each module has its own Taskfile and setup. Being able to run a single task and have all necessary setups execute via dependencies greatly simplifies our workflow. Without this, we’d need to run separate setup tasks for each module, making management and documentation more complicated.

Additionally, our .env requirements change frequently as the team iterates. Running a lightweight, idempotent setup every time ensures our environment is always up-to-date and stable, reducing errors and confusion in the long run. This approach helps keep the entire project’s operations more efficient and maintainable.


skipFingerprinting := e.ForceAll || (!call.Indirect && e.Force)
if !skipFingerprinting {
Expand Down
Loading