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

Variables are initialized at start of taskfile and not when I actually need them to be initialized #1604

Closed
berlinguyinca opened this issue Apr 18, 2024 · 1 comment

Comments

@berlinguyinca
Copy link

  • Task version: 3
  • Operating system: Linux
  • Experiments enabled: false

I'm having a very simple issue. I'm trying to build a couple of go lambda functions like

version: '4'
env:
  GOARCH: arm64
  GOOS: linux
  CGO_ENABLED: 0
  OUTPUT_DIR: ./bin/


tasks:

  build:
    vars:
      SOURCES:
        sh: find -type f -name '*.go'
    cmds:
      - for: { var: SOURCES }
        cmd: GOARCH=$GOARCH GOOS=$GOOS CGO_ENABLED=$CGO_ENABLED go build -ldflags="-s -w" -tags lambda.norpc -o $OUTPUT_DIR {{.ITEM}}

  zip:
    vars:
      OBJECTS:
        sh: find {{.OUTPUT_DIR}} -type f
    deps:
      - build
    cmds:
      - for: { var: OBJECTS }
        cmd:
          zip {{.ITEM}}.zip {{.ITEM}}

I would assume this task file would

  1. execute 'build'
    which compiles my go files and stores them in 'bin'
  2. iterate now over all files in 'bin' and zip each of them

sadly this is not what happens, instead what seems to happen is

  1. evaluate all variable definitions (SOURCES and OBJECTS)
  2. sources are populated correctly, since there are file. Objects does not get populate right, since no files exist yet so it's empy
  3. this now causes the zip task to fail, since the array OBJECTS is empty.

how can I force 'tasks' to not populate 'OBJCETCS' until the task is actually execute.

Or if this is not possible, how can I instead compile 50 go files, to 50 zip files, each containing 1 go file, fir the zip file name go-file.zip. Where go-file is the name of the file.

thanks!

@task-bot task-bot added the state: needs triage Waiting to be triaged by a maintainer. label Apr 18, 2024
@vmaerten
Copy link
Collaborator

hi @berlinguyinca,
What you are looking for is Lazy variable, which is not yet available in Task (#1240) .

To solve your issue you can do something like that :

version: '4'
env:
  GOARCH: arm64
  GOOS: linux
  CGO_ENABLED: 0
  OUTPUT_DIR: ./bin/


tasks:

  build:
    vars:
      SOURCES:
        sh: find -type f -name '*.go'
    cmds:
      - for: { var: SOURCES }
        cmd: GOARCH=$GOARCH GOOS=$GOOS CGO_ENABLED=$CGO_ENABLED go build -ldflags="-s -w" -tags lambda.norpc -o $OUTPUT_DIR {{.ITEM}}
      - task: zip
  zip:
    vars:
      OBJECTS:
        sh: find {{.OUTPUT_DIR}} -type f
    cmds:
      - for: { var: OBJECTS }
        cmd:
          zip {{.ITEM}}.zip {{.ITEM}}

If you want to be able to build without zip you can add a new task :

version: '4'
env:
  GOARCH: arm64
  GOOS: linux
  CGO_ENABLED: 0
  OUTPUT_DIR: ./bin/


tasks:

  build:
    vars:
      SOURCES:
        sh: find -type f -name '*.go'
    cmds:
      - for: { var: SOURCES }
        cmd: GOARCH=$GOARCH GOOS=$GOOS CGO_ENABLED=$CGO_ENABLED go build -ldflags="-s -w" -tags lambda.norpc -o $OUTPUT_DIR {{.ITEM}}

  zip:
    vars:
      OBJECTS:
        sh: find {{.OUTPUT_DIR}} -type f
    cmds:
      - for: { var: OBJECTS }
        cmd:
          zip {{.ITEM}}.zip {{.ITEM}}

  build_and_zip:
    cmds:
      - task: build
      - task: zip

@task-bot task-bot removed the state: needs triage Waiting to be triaged by a maintainer. label May 20, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants