diff --git a/go.mod b/go.mod index d6a3838f55..7f95803098 100644 --- a/go.mod +++ b/go.mod @@ -33,7 +33,7 @@ require ( golang.org/x/sync v0.19.0 golang.org/x/term v0.39.0 mvdan.cc/sh/moreinterp v0.0.0-20260120230322-19def062a997 - mvdan.cc/sh/v3 v3.12.0 + mvdan.cc/sh/v3 v3.12.1-0.20260124232039-e74afc18e65b ) require ( diff --git a/go.sum b/go.sum index dc51bad314..3f1ad12af4 100644 --- a/go.sum +++ b/go.sum @@ -320,5 +320,5 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= mvdan.cc/sh/moreinterp v0.0.0-20260120230322-19def062a997 h1:3bbJwtPFh98dJ6lxRdR3eLHTH1CmR3BcU6TriIMiXjE= mvdan.cc/sh/moreinterp v0.0.0-20260120230322-19def062a997/go.mod h1:Qy/zdaMDxq9sT72Gi43K3gsV+TtTohyDO3f1cyBVwuo= -mvdan.cc/sh/v3 v3.12.0 h1:ejKUR7ONP5bb+UGHGEG/k9V5+pRVIyD+LsZz7o8KHrI= -mvdan.cc/sh/v3 v3.12.0/go.mod h1:Se6Cj17eYSn+sNooLZiEUnNNmNxg0imoYlTu4CyaGyg= +mvdan.cc/sh/v3 v3.12.1-0.20260124232039-e74afc18e65b h1:PUPnLxbDzRO9kg/03l7TZk7+ywTv7FxmOhDHOtOdOtk= +mvdan.cc/sh/v3 v3.12.1-0.20260124232039-e74afc18e65b/go.mod h1:mencVHx2sy9XZG5wJbCA9nRUOE3zvMtoRXOmXMxH7sc= diff --git a/website/.vitepress/config.ts b/website/.vitepress/config.ts index c61dd38ee9..16bc266dc2 100644 --- a/website/.vitepress/config.ts +++ b/website/.vitepress/config.ts @@ -60,15 +60,10 @@ export default defineConfig({ // Open Graph ['meta', { property: 'og:type', content: 'website' }], ['meta', { property: 'og:site_name', content: taskName }], - ['meta', { property: 'og:title', content: taskName }], - ['meta', { property: 'og:description', content: taskDescription }], ['meta', { property: 'og:image', content: ogImage }], - ['meta', { property: 'og:url', content: ogUrl }], // Twitter Card ['meta', { name: 'twitter:card', content: 'summary_large_image' }], ['meta', { name: 'twitter:site', content: '@taskfiledev' }], - ['meta', { name: 'twitter:title', content: taskName }], - ['meta', { name: 'twitter:description', content: taskDescription }], ['meta', { name: 'twitter:image', content: ogImage }], [ 'meta', @@ -96,6 +91,15 @@ export default defineConfig({ .replace(/index$/, '')}` head.push(['link', { rel: 'canonical', href: canonicalUrl }]) + // Dynamic Open Graph and Twitter meta tags + const pageTitle = pageData.frontmatter.title || pageData.title || taskName + const pageDescription = pageData.frontmatter.description || pageData.description || taskDescription + head.push(['meta', { property: 'og:title', content: `${pageTitle} | Task` }]) + head.push(['meta', { property: 'og:description', content: pageDescription }]) + head.push(['meta', { property: 'og:url', content: canonicalUrl }]) + head.push(['meta', { name: 'twitter:title', content: `${pageTitle} | Task` }]) + head.push(['meta', { name: 'twitter:description', content: pageDescription }]) + // Noindex pour 404 if (pageData.relativePath === '404.md') { head.push(['meta', { name: 'robots', content: 'noindex, nofollow' }]) @@ -200,6 +204,16 @@ export default defineConfig({ sidebar: { '/blog/': [ + { + text: '2026', + collapsed: false, + items: [ + { + text: 'New `if:` Control and Variable Prompt', + link: '/blog/if-and-variable-prompt' + } + ] + }, { text: '2025', collapsed: false, diff --git a/website/src/blog/if-and-variable-prompt.md b/website/src/blog/if-and-variable-prompt.md new file mode 100644 index 0000000000..ea45d0578f --- /dev/null +++ b/website/src/blog/if-and-variable-prompt.md @@ -0,0 +1,126 @@ +--- +title: New `if:` Control and Variable Prompt +description: Introduction of the `if:` control and required variable prompts. +author: vmaerten +date: 2026-01-24 +outline: deep +--- + +# New `if:` control and interactivity support + + + +The [v3.47.0][release] release is here, and it brings two exciting new features +to Task. Let's take a closer look at them! + +## The New `if:` Control + +This first feature is simply the second most upvoted issue of all time (!) with +58 :thumbsup:s (!!) at the time of writing. + +It introduces the `if:` control, which allow you to conditionally skip the +execution of certain tasks and proceeding. `if:` can be set on a task-level or +command-level, and can be either a Bash command or a Go template expression. + +Let me show a couple of examples. + +Task-level with Bash expression: + +```yaml +version: '3' + +tasks: + deploy: + if: '[ "$CI" = "true" ]' + cmds: + - echo "Deploying..." + - ./deploy.sh +``` + +Command-level with Go template expression: + +```yaml +version: '3' + +tasks: + conditional: + vars: + ENABLE_FEATURE: "true" + cmds: + - cmd: echo "Feature is enabled" + if: '{{eq .ENABLE_FEATURE "true"}}' + - cmd: echo "Feature is disabled" + if: '{{ne .ENABLE_FEATURE "true"}}' +``` + +For more details, please check out the [documentation][if-docs]. +The [examples][if-examples] from the test suite may be useful too. + +::: info + +We had similar functionality before, but nothing that perfectly fits this use +case. There were [`sources:`][sources] and [`status:`][status], but those were +meant to check if a task was up-to-date, and [`preconditions:`][preconditions], +but this would halt the execution of the task instead of skipping it. + +::: + +## Prompt for Required Variables + +For backward-compatibility reasons, this feature is disabled by default. +To enable it, either pass `--interactive` flag or add `interactive: true` to +your `.taskrc.yml`. + +Once you do that, Task will basically starting prompting you in runtime for any +required variables. In the example below, `NAME` will be prompted at runtime: + +```yaml +version: '3' + +tasks: + # Simple text input prompt + greet: + desc: Greet someone by name + requires: + vars: + - NAME + cmds: + - echo "Hello, {{.NAME}}!" +``` + +If a given variable has an enum, Task will actually show a selection menu so you +can choose the right option instead of typing: + +```yaml +version: '3' + +tasks: + # Enum selection (dropdown menu) + deploy: + desc: Deploy to an environment + requires: + vars: + - name: ENVIRONMENT + enum: [dev, staging, prod] + cmds: + - echo "Deploying to {{.ENVIRONMENT}}..." +``` + +Once again, check out the [documentation][prompt-docs] for more details, and the +[prompt examples][prompt-examples] from the test suite. + +## Feedback + +Let's us know if you have any feedback! You can find us on our +[Discord server][discord]. + +[release]: https://github.com/go-task/task/releases/tag/v3.47.0 +[vmaerten]: https://github.com/vmaerten +[sources]: https://taskfile.dev/docs/guide#by-fingerprinting-locally-generated-files-and-their-sources +[status]: https://taskfile.dev/docs/guide#using-programmatic-checks-to-indicate-a-task-is-up-to-date +[preconditions]: https://taskfile.dev/docs/guide#using-programmatic-checks-to-cancel-the-execution-of-a-task-and-its-dependencies +[if-docs]: https://taskfile.dev/docs/guide#conditional-execution-with-if +[if-examples]: https://github.com/go-task/task/blob/main/testdata/if/Taskfile.yml +[prompt-docs]: https://taskfile.dev/docs/guide#prompting-for-missing-variables-interactively +[prompt-examples]: https://github.com/go-task/task/blob/main/testdata/interactive_vars/Taskfile.yml +[discord]: https://discord.com/invite/6TY36E39UK diff --git a/website/src/blog/index.md b/website/src/blog/index.md index 207233a2b1..b0683fb9c1 100644 --- a/website/src/blog/index.md +++ b/website/src/blog/index.md @@ -3,6 +3,15 @@ title: Blog description: Latest news and updates from the Task team --- + +