go-task / task

A task runner / simpler Make alternative written in Go
https://taskfile.dev
MIT License
11.37k stars 613 forks source link

dotenv file path not using var from command line #658

Open mkyc opened 2 years ago

mkyc commented 2 years ago

Taskfile.yml:

version: '3'

vars:
  ACCOUNT: test

dotenv: [ ".env.{{.ACCOUNT}}" ]

tasks:
  print:
    cmds:
      - echo $TEST_VAR

.env.test:

TEST_VAR=lilili

.env.other:

TEST_VAR=lalala
~ task print                                
task: [print] echo $TEST_VAR
lilili
~task print ACCOUNT=other
task: [print] echo $TEST_VAR
lilili

should be lalala.

I guess dotenv is evaluated before command line args.

matthijsdewit111 commented 4 months ago

Hope this will be fixed soon, but right now I found 2 possible workarounds.

The first one is that you can define the dotenv: part on task level, and this works as expected. The drawback is however that you need to duplicate it throughout the taskfile in each task that needs then environment variables. For example:

version: '3'

vars:
  ACCOUNT: test

tasks:
  print:
    dotenv: [ ".env.{{.ACCOUNT}}" ]
    cmds:
      - echo $TEST_VAR

The other method is the use the strange fact that using variables seems to work ok with in the env: and sh: part. You can read and parse the .env file manually here. Which is very ugly/verbose, but that you only need to do it once in the taskfile. For example:

version: '3'

vars:
  ACCOUNT: test

env:
  TEST_VAR:
    sh: cat .env.{{.ACCOUNT}} | grep -i "TEST_VAR=" | sed -e "s/TEST_VAR=//"

tasks:
  print:
    cmds:
      - echo $TEST_VAR

(This will also print a warning: cat: .env.: No such file or directory, but it still works. Pretty sure the command gets evaluated twice, once on general setup, and once again for the setup of the task.)