casey / just

🤖 Just a command runner
https://just.systems
Creative Commons Zero v1.0 Universal
20.08k stars 449 forks source link

Stabilize `[script(…)]` attribute #2260

Open casey opened 1 month ago

casey commented 1 month ago

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

The attribute is currently unstable.

Before stabilization:

linux-china commented 1 month ago

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)
casey commented 1 month ago

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.

casey commented 1 month ago

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.

g9wp commented 1 month ago

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 ""
casey commented 1 month ago

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

g9wp commented 1 month ago

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

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