task icon indicating copy to clipboard operation
task copied to clipboard

Add a "setup:" setting to allow running setup scripts before any command?

Open jooola opened this issue 6 years ago • 16 comments

I'm looking for a tool that can run source venv/bin/activate and run the commands in that same shell. It is not cleanly doable using make, and so I tried Task.

It appears we can't do this using Task. Is there a way to have a workaround or add an option to run all commands in the same shell ?

jooola avatar May 16 '19 19:05 jooola

Hi @jooola,

Can you explain more why you think this'd be useful? Perhaps an example...

andreynering avatar May 18 '19 11:05 andreynering

When developing a Python project within a Virtual environment with all its dependencies, we always need to activate this virtual environment in order to run project tasks like testing, linting, building.

To set up the environment by hand, we run the following commands (where requirements.txt lists all the dependencies):

python3 -m venv venv
source venv/bin/activate
pip -q install --upgrade -r requirements.txt

Since the source command is altering the shell to activate it, we need to stay in it to execute the next commands. So I suggested to allow to run all the commands within the same shell.

The option should also all to run all the dependencies in the same shell.

Sorry for my previous message, I clearly wasn't describing my problem enough.

jooola avatar May 19 '19 12:05 jooola

You can do this today as a multi-line command, but you need to somehow duplicate the setup of venv to each command, e.g. as a template variable, or just copy-paste, which ever is easier.

smyrman avatar May 20 '19 11:05 smyrman

It would be something like this I guess ?

vars:
  VENV: |-
    test -d venv || python3 -m venv venv
    source venv/bin/activate


tasks:
  setup:
    cmds:
      - |
        {{.VENV}}
        pip -q install --upgrade -r requirements.txt

But dependencies inheritance cannot work in this case, that was the point of chaining dependencies. But this work around could work, I'll try it out. Thanks

jooola avatar May 20 '19 11:05 jooola

👍

Remember to also add a set -e on of multi-line commands to ensure they exit on error.

vars:
  VENV: |-
    test -d venv || python3 -m venv venv
    source venv/bin/activate


tasks:
  setup:
    cmds:
    - |
      set -e
      {{.VENV}}
      pip -q install --upgrade -r requirements.txt

smyrman avatar May 20 '19 12:05 smyrman

But dependencies inheritance cannot work in this case, that was the point of chaining dependencies.

No it can't. Dependencies, or any other cmd, can never change the environment in task, which is what would be needed for that to work. The environment now, is evaluated/generated from scratch every-time before a task is run.

At an early stage of task, there was a "set" property, that could set the environment to the output of a command, but it was deprecated with good reason.

smyrman avatar May 20 '19 12:05 smyrman

As @smyrman said, multi-line strings should solve this use case. The downside is that you have to concat the setup stage in each needed command.

Maybe we could add a setup flag to task/global to setup stuff before all commands?

version: '2'

setup:
  - set -e
  - rbenv init

tasks:
  # ...

Sharing state between command calls for a single task would be possible, but it'd be likely confusing.

andreynering avatar May 25 '19 20:05 andreynering

@andreynering https://github.com/direnv/direnv might be considered to achieve this? it actually load the sourced export values into its context. If so, can part of its code incorporated?

stephencheng avatar May 27 '19 11:05 stephencheng

@stephencheng Interesting idea, worth studying the possibility. Thanks for sharing.

andreynering avatar Jun 01 '19 22:06 andreynering

This is ideal but while we're waiting on this feature is there a file like ~/.bashrc that we can put functions in that we would like to be able to access globally from any task?

ProfessorManhattan avatar Aug 05 '21 05:08 ProfessorManhattan

@ProfessorManhattan Interesting idea, but no, we do not support that.

andreynering avatar Sep 05 '21 00:09 andreynering

I really like the idea to allow a configurable list of commands to run before each shell task, set -e being an obvious use case.

ssbarnea avatar May 24 '22 06:05 ssbarnea

Good point Sorin

On Tue, May 24, 2022 at 2:52 AM Sorin Sbarnea @.***> wrote:

I really like the idea to allow a configurable list of commands to run before each shell task, set -e being an obvious use case.

— Reply to this email directly, view it on GitHub https://github.com/go-task/task/issues/204#issuecomment-1135479827, or unsubscribe https://github.com/notifications/unsubscribe-auth/AOJRHXKRV6A5CMUACUJFTIDVLR4CTANCNFSM4HNPTDIA . You are receiving this because you were mentioned.Message ID: @.***>

-- Regards,

Brian Zalewski (412) 345-3338

ProfessorManhattan avatar May 24 '22 16:05 ProfessorManhattan

Idea: just like the setup: proposal above, having a cleanup: setting (needs to think if it's the best name) to run after each task could make sense as well.

andreynering avatar Sep 12 '22 12:09 andreynering

#1115 is a complement to this. Both should probably be implemented together.

andreynering avatar Jun 04 '23 00:06 andreynering

cleanup would be really great. My use case is that I need to do something like this:

tasks:
  foo:
    cmds:
      - echo "do something"
    preconditions:
      - op document get "TLS Cert" --output=./test.crt --force && step certificate needs-renewal --expires-in 48h --bundle test.crt

This leaves a test.crt sitting around - I'll never want that after the task runs, so having some way to clean things like that up at the very end of task execution would be helpful! I'd definitely be able to use setup: as well.

cweagans avatar Jan 10 '24 20:01 cweagans