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

dirname of current Taskfile #215

Closed
fj opened this issue Jun 16, 2019 · 22 comments · Fixed by #857
Closed

dirname of current Taskfile #215

fj opened this issue Jun 16, 2019 · 22 comments · Fixed by #857

Comments

@fj
Copy link

fj commented Jun 16, 2019

I often want to use the directory of where the Taskfile is located as an input to other commands (not the current working directory), but it seems like sprig really locks down access to the filesystem.

Is this possible to do with Task as a first-class idea?

For example, something like:

tasks:
  show-current-dir:
    desc: "show where Task is executing from"
    cmds:
      - echo {{ .TASKFILE_LOCATION }}

Note that this isn't the same as just using $PWD or -d because the working directory might be different; Task should probably provide this as a first-class feature if it doesn't already.

@andreynering andreynering added type: feature A new feature or functionality. good first issue Issues that are good for first-time contributors to pick up. labels Jun 18, 2019
@andreynering
Copy link
Member

Hi @fj,

You should actually be fine using pwd if you haven't specified another dir: or your haven't cded in the command.

Otherwise, yeah, I think it makes sense to a have variable with the Taskfile location.

@smyrman
Copy link
Contributor

smyrman commented Jun 18, 2019

Actually, could be handy for when Taskfiles are imported as well.

@smyrman
Copy link
Contributor

smyrman commented Jun 18, 2019

Example use-case:

root/Taskfile.yaml:

version: "2.X"
includes:
  sub: sub/Tasks.yaml
tasks:
  default:
    cmds:
    - sub:test

root/sub/Tasks.yaml:

version: "2.X"
tasks:
  test:
    dir: "{{.TASKFILE_DIR}}"
    cmds:
    - ./bin/executable

root/sub/bin/executable

#!/bin/sh
echo "Hello World"

@beevelop
Copy link

beevelop commented Apr 8, 2020

Just stumbled upon this exact issue. I guess a workaround for now is manually setting the dir to the respective folder. The negative side-effect: The Taskfile in the subfolder can no longer be used independently.

@max-sixty
Copy link

max-sixty commented Feb 17, 2021

Is there a way of getting the current working directory when a taskfile in another dir is invoked with -t?

e.g. a variable that would return /home/foo here:

$ pwd

/home/foo

$ task -t /home/foo/bar/Taskfile-baz.yml

# assuming task is `echo {{ .PWD }}`

/home/foo/bar

# how could we get /home/foo ?

@felixlohmeier
Copy link

@beevelop:

Just stumbled upon this exact issue. I guess a workaround for now is manually setting the dir to the respective folder.

If directory name and task name are identical, then the following works for included Taskfiles:

dir: '{{splitList ":" .TASK | first}}' # results in the task namespace

The negative side-effect: The Taskfile in the subfolder can no longer be used independently.

To handle this, I use the following default task in the included Taskfile:

  default: # enable standalone execution (running `task` in project directory)
    cmds:
      - DIR="${PWD##*/}:main" && cd .. && task "$DIR"

@SEAPUNK
Copy link

SEAPUNK commented Mar 28, 2021

I'm curious as to why this isn't the default behavior. If I had a setup like

# Taskfile.yml
version: '3'
includes:
  db: ./db

# db/Taskfile.yml
version: '3'
tasks:
  something: do_something_with ./file.sql

I would expect to be able to do both task db:something and cd db; task something and have them both work. Why doesn't pwd get set per-taskfile? Why do I have to work around this manually?

@andreynering
Copy link
Member

@SEAPUNK It seems to be that you just forgot to specify the dir of the Taskfile:

includes:
  db:
    taskfile: ./db
    dir: ./db

To the others: I know that this issue has been opened for a long time (I have been having less than enough time to maintain this), but I'll try to give this some priority.

@SEAPUNK
Copy link

SEAPUNK commented Mar 28, 2021

@andreynering no, that's what I mean - why should I have to do that? It doesn't feel very intuitive to me (especially considering the quote from the usage page: "By default, tasks will be executed in the directory where the Taskfile is located."), and I end up having to manually set the dir for every taskfile that I import.

@fj
Copy link
Author

fj commented Mar 28, 2021 via email

@andreynering
Copy link
Member

@fj Thanks for the words! 😉


@SEAPUNK There's some historical reasons for why it works as is today. Originally, including other taskfiles was a simpler feature, and it was impossible to make it directory aware. When it was added (the ability to set a "dir" for a taskfile import), it was made in a backward compatible way.

Changing it now would break many taskfiles in the wild, because I do know many store common taskfiles in a given directory (I've seen a few .taskfiles/ and similar in the wild) without waiting for these tasks to really run on this folder, but on root.

@SEAPUNK
Copy link

SEAPUNK commented Mar 29, 2021

@andreynering gotcha, thanks for the explanation. I thought this wasn't something that showed up in the docs, but it looks like I skipped over it.

@rwxd
Copy link

rwxd commented Sep 9, 2021

Is there a way of getting the current working directory when a taskfile in another dir is invoked with -t?

e.g. a variable that would return /home/foo here:

$ pwd

/home/foo

$ task -t /home/foo/bar/Taskfile-baz.yml

# assuming task is `echo {{ .PWD }}`

/home/foo/bar

# how could we get /home/foo ?

Hi @max-sixty, have you found a solution to the problem?

@max-sixty
Copy link

Hi @max-sixty, have you found a solution to the problem?

I found another way of doing what I needed, sorry not to be helpful.

@tylermmorton
Copy link
Contributor

Hi, is it OK to close this issue with the provided workarounds?

@neerfri
Copy link

neerfri commented Feb 14, 2022

@tylermmorton I think the need for a variable that allows getting the directory of the Taskfile is still open and relevant despite the workarounds

@ssbarnea
Copy link
Contributor

Anything involving PWD would not count as safe, IMHO.

@andreynering Sorry to nag you about this but is there any chance to close this before this bug reaches the 2nd year anniversary? At least if there is a valid workaround we should document it, especially as the need to have such a variable is quite common.

I personally do not care about the effective taskfile location as at this moment I do not use inclusion but I do need a "project_dir" variable, one that would not change even if I call task from a subdirectory.

@ghostsquad
Copy link
Contributor

I agree, task should be able to report directory in which the Taskfile it's operating on is located, though this brings into question, should it always be the parent Taskfile directory, and never the directory of the Taskfiles that are in include?

@andreynering
Copy link
Member

@ghostsquad I believe we could have two variables: ROOT_TASKFILE, CURRENT_TASKFILE or something similar.

Sorry for taking so long to work on this, we just have too many opened issues to triage.

This seems to be easy and requested enough that will just put at the top of my priority list.

But if in the meantime, if someone else would like to contribute with this, just let me know.

@ssbarnea
Copy link
Contributor

ssbarnea commented Aug 4, 2022

I was thinking about .PROJECT_DIR and .TASKFILE_DIR, with the mention that the last one implies "current taskfile dir" but I am sure I could live with any variable names, still try to avoid confusing user with a variable name ending in file (TASKFILE) if that is a directory ;)

@andreynering
Copy link
Member

andreynering commented Aug 4, 2022

Ah, of course, I missed the _DIR suffix, we certainly need it.

My point was about having two variables.

👍 for PROJECT_DIR (alternatively ROOT_DIR) and TASKFILE_DIR

@andreynering
Copy link
Member

This was just implemented as part of #857. I plan to do a release still today.

@pd93 pd93 removed the type: feature A new feature or functionality. label Dec 16, 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