task icon indicating copy to clipboard operation
task copied to clipboard

Support built-in shell commands for an improved Windows support

Open lunny opened this issue 5 years ago • 17 comments

For cross-platform usage, some built-in commands will helpful.

lunny avatar Apr 12 '19 06:04 lunny

Hi @lunny,

So, this is something that was discussed before, and I actually wanted to solve this from the beginning, but it requires a considerable amount of work.

You may want to take a look at https://github.com/mvdan/sh/issues/93 and https://github.com/mvdan/sh/issues/97.

In short, it requires someone to implement these built-ins on the https://github.com/mvdan/sh project to make them work on Windows.

It was also discussed before to just use https://github.com/ericlagergren/go-coreutils, but most of these implementations are done on a main package, and thus require work before being able to be imported on https://github.com/mvdan/sh.

If anyone reading this issue is willing to help, let me know. Just make sure to sync with the author on https://github.com/mvdan/sh/issues/93 before starting anything.

andreynering avatar Apr 13 '19 20:04 andreynering

Just found the issue I was looking for: https://github.com/ericlagergren/go-coreutils/issues/114

andreynering avatar Apr 13 '19 20:04 andreynering

I wonder if this is also useful ? https://github.com/u-root/u-root

You can inject what commands you want via a template approach too: https://github.com/u-root/u-root/blob/master/templates.go

ghost avatar Apr 19 '19 07:04 ghost

Or cant we use the ones from Mage ? as a base ?

ghost avatar Apr 19 '19 07:04 ghost

Hi @gedw99,

I wonder if this is also useful? https://github.com/u-root/u-root

Hmm... interesting project. It definitely have some core tools implemented. Would still require work, though, since these tools are main package (so, not importable).

Or cant we use the ones from Mage?

Mage fallsback to system tools just like Tusk.

andreynering avatar Apr 21 '19 18:04 andreynering

So, it's 2023 now, and there's no news?

bigBron avatar Feb 28 '23 14:02 bigBron

I found, as a workaround for the absolute most trivial use case of reading a file, which I would usually reach to cat for, there is more that works in cmd on Windows and should be pretty cross-distro for UNIX-like systems.

e.g.

vars:
  VARIABLE:
    sh: more "{{.FILE_TO_READ_INTO_VARIABLE}}"

and that seems to populate the variable for Windows, macOS, and Linux (an Alpine instance).

Still would love a more stable API, but this is one case that's common that I wouldn't know another easy solution without hacking together a {{if}} {{else}} template.

nathanblair avatar May 18 '23 00:05 nathanblair

Hey @andreynering, since it's been a while it might be worth a note in the docs?

For example, in Platform specific tasks and commands we could say:

Writing fully cross platform tasks can still be difficult because not all shells work in the same way (e.g. `cp`, `mv`, `mkdir`, etc are different or have different names).

* [Use a specific shell](https://github.com/go-task/task/issues/892#issuecomment-1278217185) in the task script.
* Use [alternative implementations](https://gnuwin32.sourceforge.net/packages/coreutils.htm) of core utils or a specific shell on Windows like [git bash](https://gitforwindows.org/).
* Use [OS specific](https://taskfile.dev/usage/#os-specific-taskfiles) scripts.
* [Contribute](https://github.com/mvdan/sh/issues/93) to Task!

REF: https://github.com/mvdan/sh/issues/93

JohnHardy avatar Sep 18 '23 21:09 JohnHardy

Another approach could be to specify the required shell in the taskfile, so workarounds are more intentional and fail gracefully if the task can't execute. Similar to the shopt or platforms control that already exists.

We could also clean up the {{.SHELL}} workaround that makes the tasks hard to read.

vars:
  SHELL: '{{if eq .OS "Windows_NT"}}powershell{{end}}{{if eq .OS "darwin"}}pwsh{{end}}'

  clean:
    cmds:
      - '{{.SHELL}} rm -r ./builds/'
      - '{{.SHELL}} rm -r ./packs/'

Would, for instance, become:

shell:
    windows: powershell
    darwin: pwsh

  clean:
    cmds:
      - rm -r ./builds/
      - rm -r ./packs/

JohnHardy avatar Sep 18 '23 21:09 JohnHardy

If there's support among us for built-in commands, I can help out. By built-in commands, I mean using something like this, instead of flaky shelling:

  clean:
    cmds:
      - rmdir: ./builds/
      - rm: ./packs/file.go
      - cp: ./packs-backup/file.go ./packs/file.go
      - mv: ./backup/manifest.xml ./site/

leaanthony avatar Sep 24 '23 06:09 leaanthony

I personally like it!

I dare say it would be easy enough to find the most commonly used parameters to avoid it becoming a shell replacement: https://discord.com/channels/974121106208354339/1025054680289660989/threads/1028716829981544559

JohnHardy avatar Sep 24 '23 09:09 JohnHardy