Provide a value for `flag()` to be set when the value is provided
Discussed in https://github.com/jdx/mise/discussions/4237
Originally posted by zephraph January 26, 2025
2025.1.15 macos-arm64 (2025-01-26)
Okay, so I have a mise task that builds a rust crate. I want a windows option (to tell it to build for windows). When it has that option, I want to run cargo xwin build instead of cargo build. (Note I'm doing cross compilation so run_windows won't work for this case).
~~Here's the monstrosity I have right now~~
[!NOTE] This doesn't actually work, I was misreading the output.
[tasks."build:rust"]
run = """
{% set windows = flag(name='windows', default='') %}
{% if windows == 'true' %}
{% set xwin = 'xwin ' %}
{% else %}
{% set xwin = '' %}
{% endif %}
echo {{ xwin }}
cargo {{ xwin }}build --bin webview -F {{option(name='features', var=true, default='transparent devtools')}}
"""
There's a lot of problems to discuss:
- I'm not using general
shlogic as the docs recommend because the logs only show the first line of output. So if I added anecho 'hello'to the above script the logs would look like this
[build:rust] $ echo hello
I really just want to see the command output (the last line in this case). That's a bit of a separate issue, but still one to note.
- It would seem like `{{ flag(name='windows', default='') | replace(from='true', to='xwin') }} should work if it's returning a string. Doesn't seem to be though.
-
cargo {% if flag(name='windows') %}xwin{% endif %} buildseems like it should work, but that throws an exception b/cflagdoesn't return a boolean -
cargo {% if flag(name='windows') == 'true' %}xwin{% endif %} builddoesn't work either
What I'd like to see
One solution that would be nice is just adding an arg to flag that would be the value if it's true. E.g.
{{ flag(name='windows', value='xwin') }}
Another would be to have flag just return a string. I've looked through the code and it looks like it's return some sort of template string that's more of a key? It's weird, because I can't usually get it to print out (it usually just prints as true or nothing).
e.g.
echo '{{ flag(name='windows') }}'
with --window passed will echo true
without it it will echo nothing (e.g. just run echo '')
Funnily, you can see the template string weirdness when you pass it through the reverse filter
echo '{{ flag(name='windows') | reverse }}'
will print GRA_KSAT_ESIM:swodniw:GRA_KSAT_ESIM. This special type doesn't play well with anything else. If we could at least have something we could do to normalize it into a string we'd have some more options.
Thoughts? Recommendations?