You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
@mondy I don't think variadics play nice with specifying multiple build targets.
For example, if your mage file had func Foo(arg1, arg2 string) and func Bar(), then you can do mage foo value1 value2 bar, which would call both Foo("value1", "value2") and Bar(). But if instead your Foo was defined as func Foo(args ...string), then mage foo value1 value2 bar would call Foo("value1", "value2", "bar").
I feel like this ambiguity in behavior would cause a lot of confusion.
@mondy I don't think variadics play nice with specifying multiple build targets.
For example, if your mage file had func Foo(arg1, arg2 string) and func Bar(), then you can do mage foo value1 value2 bar, which would call both Foo("value1", "value2") and Bar(). But if instead your Foo was defined as func Foo(args ...string), then mage foo value1 value2 bar would call Foo("value1", "value2", "bar").
I feel like this ambiguity in behavior would cause a lot of confusion.
Just randomly browsing issues and wanted to throw an idea in on this. What you could do is allow variadic targets to be separated with with -- and use a heuristic to throw "ambiguous argument" errors in the case where an argument to a variadic shares the name with a valid target unless there is a terminal --.
mage run my things
# execute target "run" with args ["my", "things"]
mage run my stuff
Ambiguous argument to "run": "stuff" is also a target name, please use `--` to terminate the arguments to target "run"
mage run my -- stuff
# execute target "run" with args ["my"]
# execute target "stuff" with args []
mage run my stuff --
# execute target "run" with args ["my", "stuff"]
Reacted by Dan Brakeley, Calle Helmertz and younggglcy
@mondy I don't think variadics play nice with specifying multiple build targets.
IMHO, that is why variadic arguments typically have to be the last argument in a function. We can translate this that a target with variadic arguments can only be called if it is the last target. Or combine with the suggestion from @flowchartsman and add separators that are only needed when needing to fix ambiguity.
Reacted by Mateusz Łoskot, Nelo-T. Wallus and younggglcy
Okay. It seems I jumped the gun in my enthousiasm. :) It adds the support to mg.F, but it seems that doesn't automatically translate in variadic support for targets. Sorry for claiming missing documentation for a feature that is not there!
//go:build magepackage main
// "github.com/magefile/mage/sh"// Runs go mod download and then installs the binary.funcBuild(foo...string) error {
fori:=0; i<len(foo); i++ {
println(foo[i])
}
returnnil
}
Activity
natefinch commentedon Mar 14, 2021
Variadics aren't currently supported.... But in theory they could be. Right now you'd have to do something like
mage run "foo bar baz"And then do a strings.Split() by hand in the code.
mondy commentedon Mar 15, 2021
Thank you for your reply.
I will try this.
I hope variadic to be supported.
danbrakeley commentedon May 16, 2021
@mondy I don't think variadics play nice with specifying multiple build targets.
For example, if your mage file had
func Foo(arg1, arg2 string)andfunc Bar(), then you can domage foo value1 value2 bar, which would call bothFoo("value1", "value2")andBar(). But if instead your Foo was defined asfunc Foo(args ...string), thenmage foo value1 value2 barwould callFoo("value1", "value2", "bar").I feel like this ambiguity in behavior would cause a lot of confusion.
avarabyeu commentedon Sep 16, 2022
Still, the feature is quite useful. Consider wrapping some docker/compose call:
it could be an option to make unknown args/targets available over context, for instance:
flowchartsman commentedon Dec 27, 2022
Just randomly browsing issues and wanted to throw an idea in on this. What you could do is allow variadic targets to be separated with with
--and use a heuristic to throw "ambiguous argument" errors in the case where an argument to a variadic shares the name with a valid target unless there is a terminal--.So, for example, given targets
The behavior would be as follows:
spockz commentedon May 10, 2023
IMHO, that is why variadic arguments typically have to be the last argument in a function. We can translate this that a target with variadic arguments can only be called if it is the last target. Or combine with the suggestion from @flowchartsman and add separators that are only needed when needing to fix ambiguity.
thorntonrose commentedon Oct 4, 2023
I think it would be nice if Mage offered a flag for key/value pairs, like this:
The key/value pairs could be accessed via an implicit variable or a function, like this:
Or this:
The -p flag, or something similar, is used by many build tools.
spockz commentedon Oct 4, 2023
I saw #402 adds variadic support, although the documentation seems missing. I'll try the feature for our use case.
perj commentedon Oct 4, 2023
Sorry about the missing documentation. Could you point me to it so I can amend it?
spockz commentedon Oct 4, 2023
Okay. It seems I jumped the gun in my enthousiasm. :) It adds the support to mg.F, but it seems that doesn't automatically translate in variadic support for targets. Sorry for claiming missing documentation for a feature that is not there!
Running
mage(1.15) gives me:mloskot commentedon Nov 17, 2023
Would this idea address support for optional arguments too?