casey / just

🤖 Just a command runner

Home Page:https://just.systems

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Stabilize `[script(…)]` attribute

casey opened this issue · comments

A [script(…)] attribute was added in #2259. See #1479 for discussion.

The attribute is currently unstable.

Before stabilization:

  • Make sure it's tested and has the right semantics.
  • Is script the right name?
  • Consider renaming "shebang recipes" in readme to "script recipes" and consider both shebang recipes and recipes with the script attribute as cases of script recipes.
  • Add a script-interpreter setting and allow an empty [script] attribute.

Is it possible to add ext name support for script annotation:

[script("pluto")]
[extension: 'lua']
foo:
  print(os.getenv("NICK"))

And following code is clean.

[script("pluto", "lua")]
foo:
  print(os.getenv("NICK"))

If you use JavaScript/Types, lots of extension names: js, cjs, mjs, ts, mts.

[script("bun", "ts")]
foo:
  let name: string = "jackie"
  console.log(name)

I think that would probably be confusing, and using an additional attribute for the extension isn't much of a burden. But note that an extension is only required if the interpreter requires one. Most don't, in fact the only interpreters I know if that will fail without the correct extension is cmd.exe and PowerShell.

Also, one more reason for not stabilizing the [script] annotation right away: Since this is a new attribute, while it is unstable it is possible in a backwards compatible way to change the semantics of recipes with that attribute. In #1413 I discussed some shortcomings with shebang recipes, and discussed a lot of somewhat radical ideas for changing the semantics of recipes with a [script] attribute. Ultimately I don't think any of those were great ideas, and I don't have any particular ideas for changing the semantics of recipes with the [script] attribute, but I think it's a good idea to let it stew for a bit in case anyone can come up with some.

commented

I wonder if there's a way to conditionally includes settings or variables to recipt like the cfg_attr in rust.

  SH := "sh"

  [cfg_attr(unix, ```
     set shell := ["bash", "-c"]   // setting 
     SH := bash                    // variable
  ```)]
  [cfg_attr(windows, ```
     set shell := ["cmd", "/c"]
     SH := cmd
  ```)]
  [cfg_attr(cygwin, ```
     set shell := ["bash", "-c"]   // overwrite windows
     SH := cygwin
     CYGWIN := 1
  ```)]
  [cfg_attr(true, ```
     set unstable
     UNSTABLE := 1
  ```)]
  foo:
    echo {{SH}} // print "cygwin" or "bash" or "cmd"
    echo {{CYGWIN}} // print "1" or ""
    echo {{UNSTABLE}} // print "1"
  
  bar:
    echo {{SH}} // print "sh"
    echo {{CYGWIN}} // print ""
    echo {{UNSTABLE}} // print ""

@g9wp This seems unrelated to the [script] attribute.

commented

@g9wp This seems unrelated to the [script] attribute.

This is a more general solution, [script] is just equivalent to [cfg_attr(true, set shell)].