Task now has an [official extension for Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=task.vscode-task) contributed by [@pd93](https://github.com/pd93)! :tada: The extension is maintained in a [new repository](https://github.com/go-task/vscode-task) under the `go-task` organization. We're looking to gather feedback from the community so please give it a go and let us know what you think via a [discussion](https://github.com/go-task/vscode-task/discussions), [issue](https://github.com/go-task/vscode-task/issues) or on our [Discord](https://discord.gg/6TY36E39UK)!
If you call Task with the `--global` (alias `-g`) flag, it will look for your home directory instead of your working directory. In short, Task will look for a Taskfile on either`$HOME/Taskfile.yml`or`$HOME/Taskfile.yaml`paths.
如果您使用 `--global`(别名 `-g`)标志调用 Task,它将查找您的 home 目录而不是您的工作目录。 简而言之,Task 将在`$HOME/Taskfile.yml`或`$HOME/Taskfile.yaml`路径上寻找 Taskfile。
这对于您可以在系统的任何地方运行的自动化很有用!
:::info
When running your global Taskfile with `-g`, tasks will run on `$HOME` by default, and not on your working directory!
As mentioned in the previous section, the `{{.USER_WORKING_DIR}}` special variable can be very handy here to run stuff on the directory you're calling `task -g` from.
When including a Taskfile, you can give the namespace a list of `aliases`. This works in the same way as [task aliases](#task-aliases) and can be used together to create shorter and easier-to-type commands.
Vars declared in the included Taskfile have preference over the variables in the including Taskfile! If you want a variable in an included Taskfile to be overridable, use the [default function](https://go-task.github.io/slim-sprig/defaults.html): `MY_VAR: '{{.MY_VAR | default "my-default-value"}}'`.
:::
## 内部 tasks
Internal tasks are tasks that cannot be called directly by the user. They will not appear in the output when running `task --list|--list-all`. Other tasks may call internal tasks in the usual way. This is useful for creating reusable, function-like tasks that have no useful purpose on the command line.
@@ -339,7 +329,7 @@ tasks:
## Task 目录
By default, tasks will be executed in the directory where the Taskfile is located. But you can easily make the task run in another folder, informing `dir`:
> Dependencies run in parallel, so dependencies of a task should not depend one another. If you want to force tasks to run serially, take a look at the [Calling Another Task](#calling-another-task) section below.
If you want to restrict the running of tasks to explicit platforms, this can be achieved using the `platforms:` key. Tasks can be restricted to a specific OS, architecture or a combination of both. On a mismatch, the task or command will be skipped, and no error will be thrown.
The values allowed as OS or Arch are valid `GOOS` and `GOARCH` values, as defined by the Go language [here](https://github.com/golang/go/blob/master/src/go/build/syslist.go).
允许作为 OS 或 Arch 的值是有效的 `GOOS` 和 `GOARCH` 值,正如 [此处](https://github.com/golang/go/blob/master/src/go/build/syslist.go) 的 Go 语言所定义的那样。
The `build-windows` task below will run only on Windows, and on any architecture:
下面的 `build-windows` task 将仅在 Windows 所有架构上运行:
```yaml
version: '3'
@@ -442,7 +430,7 @@ tasks:
- echo 'Running command on Windows'
```
This can be restricted to a specific architecture as follows:
这可以限制为特定的架构,如下所示:
```yaml
version: '3'
@@ -454,7 +442,7 @@ tasks:
- echo 'Running command on Windows (amd64)'
```
It is also possible to restrict the task to specific architectures:
也可以将 task 限制在特定的架构中:
```yaml
version: '3'
@@ -466,7 +454,7 @@ tasks:
- echo 'Running command on amd64'
```
Multiple platforms can be specified as follows:
可以指定多个平台,如下所示:
```yaml
version: '3'
@@ -478,7 +466,7 @@ tasks:
- echo 'Running command on Windows (amd64) and macOS'
```
Individual commands can also be restricted to specific platforms:
个别命令也可以限制在特定平台上:
```yaml
version: '3'
@@ -536,12 +524,10 @@ tasks:
:::tip
NOTE: If you want to call a task declared in the root Taskfile from within an [included Taskfile](#including-other-taskfiles), add a leading `:` like this: `task: :task-name`.
`sources` and `generates` can be files or file patterns. When given, Task will compare the checksum of the source files to determine if it's necessary to run the task. If not, it will just print a message like `Task "js" is up to date`.
If you prefer this check to be made by the modification timestamp of the files, instead of its checksum (content), just set the `method` property to `timestamp`.
In situations where you need more flexibility the `status` keyword can be used. You can even combine the two. See the documentation for [status](#using-programmatic-checks-to-indicate-a-task-is-up-to-date) for an example.
By default, task stores checksums on a local `.task` directory in the project's directory. Most of the time, you'll want to have this directory on `.gitignore` (or equivalent) so it isn't committed. (If you have a task for code generation that is committed it may make sense to commit the checksum of that task as well, though).
If you want these files to be stored in another directory, you can set a `TASK_TEMP_DIR` environment variable in your machine. It can contain a relative path like `tmp/task` that will be interpreted as relative to the project directory, or an absolute or home path like `/tmp/.task` or `~/.task` (subdirectories will be created for each project).
Each task has only one checksum stored for its `sources`. If you want to distinguish a task by any of its input variables, you can add those variables as part of the task's label, and it will be considered a different task.
This is useful if you want to run a task once for each distinct set of inputs until the sources actually change. For example, if the sources depend on the value of a variable, or you if you want the task to rerun if some arguments change even if the source has not.
:::
:::tip
The method `none` skips any validation and always run the task.
将 method 设置为 `none` 会跳过任何验证并始终运行任务。
:::
:::info
For the `checksum` (default) or `timestamp` method to work, it is only necessary to inform the source files. When the `timestamp` method is used, the last time of the running the task is considered as a generate.
:::
### 使用程序检查来表示任务是最新的。
### 使用程序检查来表示任务是最新的
Alternatively, you can inform a sequence of tests as `status`. If no error is returned (exit status 0), the task is considered up-to-date:
@@ -662,7 +640,7 @@ Note that the `{{.TIMESTAMP}}` variable is a "live" Go `time.Time` struct, and c
有关详细信息,请参阅 [Go Time 文档](https://golang.org/pkg/time/)。
You can use `--force` or `-f` if you want to force a task to run even when up-to-date.
如果你想强制任务运行,即使是最新的,你也可以使用 `--force` 或 `-f`。
Also, `task --status [tasks]...` will exit with a non-zero exit code if any of the tasks are not up-to-date.
@@ -736,7 +714,7 @@ tasks:
If a task executed by multiple `cmds` or multiple `deps` you can control when it is executed using `run`. `run` can also be set at the root of the Taskfile to change the behavior of all the tasks unless explicitly overridden.
Supported values for `run`:
`run` 支持的值:
* `always` (default) always attempt to invoke the task regardless of the number of previous executions
* `once` only invoke this task once regardless of the number of references
@@ -770,7 +748,7 @@ tasks:
## 变量
When doing interpolation of variables, Task will look for the below. They are listed below in order of importance (i.e. most important first):
在进行变量插值时,Task 将查找以下内容。 它们按权重顺序列在下面(即最重要的第一位):
- Variables declared in the task definition
- Variables given while calling a task from another (See [Calling another task](#calling-another-task) above)
@@ -779,7 +757,7 @@ When doing interpolation of variables, Task will look for the below. They are li
- Global variables (those declared in the `vars:` option in the Taskfile)
- Environment variables
Example of sending parameters with environment variables:
A special variable `.TASK` is always available containing the task name.
:::
Since some shells do not support the above syntax to set environment variables (Windows) tasks also accept a similar style when not at the beginning of the command.
```bash
@@ -897,17 +873,15 @@ tasks:
:::info
Due to the nature of how the [Go's own `defer` work](https://go.dev/tour/flowcontrol/13), the deferred commands are executed in the reverse order if you schedule multiple of them.
:::
## Go 的模板引擎
Task parse commands as [Go's template engine](https://golang.org/pkg/text/template/) before executing them. Variables are accessible through dot syntax (`.VARNAME`).
All functions by the Go's [slim-sprig lib](https://go-task.github.io/slim-sprig/) are available. The following example gets the current date in a given format:
Go 的 [slim-sprig 库](https://go-task.github.io/slim-sprig/) 的所有功能都可用。 以下示例按照给定格式获取当前日期:
```yaml
version: '3'
@@ -918,7 +892,7 @@ tasks:
- echo {{now | date "2006-01-02"}}
```
Task also adds the following functions:
Task 还增加了以下功能:
- `OS`: Returns the operating system. Possible values are "windows", "linux", "darwin" (macOS) and "freebsd".
- `ARCH`: return the architecture Task was compiled to: "386", "amd64", "arm" or "s390x".
@@ -957,7 +931,7 @@ tasks:
## 帮助
Running`task --list` (or`task -l`) lists all tasks with a description. The following Taskfile:
It will build your project before starting the release.
Please make sure that you have set GITHUB_TOKEN before starting.
它将在开始发布之前构建您的项目。
请确保您在开始之前已经设置了 GITHUB_TOKEN。
cmds:
- your-release-tool
@@ -1014,15 +988,15 @@ tasks:
- your-build-tool
```
with running`task --summary release`would print the following output:
运行`task --summary release`将打印以下输出:
```
task: release
Release your project to github
发布你的项目到 github
It will build your project before starting the release.
Please make sure that you have set GITHUB_TOKEN before starting.
它将在开始发布之前构建您的项目。
请确保您在开始之前已经设置了 GITHUB_TOKEN。
dependencies:
- build
@@ -1030,13 +1004,13 @@ dependencies:
commands:
- your-release-tool
```
If a summary is missing, the description will be printed. If the task does not have a summary or a description, a warning is printed.
如果缺少摘要,将打印描述。 如果任务没有摘要或描述,则会打印一条警告。
Please note: *showing the summary will not execute the command*.
请注意:*显示摘要不会执行命令*。
## Task 别名
Aliases are alternative names for tasks. They can be used to make it easier and quicker to run tasks with long or hard-to-type names. You can use them on the command line, when [calling sub-tasks](#calling-another-task) in your Taskfile and when [including tasks](#including-other-taskfiles) with aliases from another Taskfile. They can also be used together with [namespace aliases](#namespace-aliases).
Sometimes you may want to override the task name printed on the summary, up-to-date messages to STDOUT, etc. In this case, you can just set `label:`, which can also be interpolated with variables:
@@ -1077,7 +1051,7 @@ tasks:
## 静默模式
Silent mode disables the echoing of commands before Task runs it. For the following Taskfile:
静默模式在 Task 运行命令之前禁用命令回显。 对于以下 Taskfile:
```yaml
version:'3'
@@ -1088,22 +1062,22 @@ tasks:
- echo "Print something"
```
Normally this will be printed:
通常这将打印:
```sh
echo"Print something"
Print something
```
With silent mode on, the below will be printed instead:
开启静默模式后,将打印以下内容:
```sh
Print something
```
There are four ways to enable silent mode:
开启静默模式有四种方式:
*At command level:
*在 cmds 级别:
```yaml
version:'3'
@@ -1115,7 +1089,7 @@ tasks:
silent:true
```
*At task level:
*在 task 级别:
```yaml
version:'3'
@@ -1127,7 +1101,7 @@ tasks:
silent:true
```
*Globally at Taskfile level:
*在 Taskfile 全局级别:
```yaml
version:'3'
@@ -1140,9 +1114,9 @@ tasks:
- echo "Print something"
```
*Or globally with`--silent`or`-s`flag
*或者全局使用`--silent`或`-s`标志
If you want to suppress STDOUT instead, just redirect a command to`/dev/null`:
如果您想改为禁止 STDOUT,只需将命令重定向到`/dev/null`:
```yaml
version:'3'
@@ -1159,7 +1133,7 @@ Dry run mode (`--dry`) compiles and steps through each task, printing the comman
## 忽略错误
You have the option to ignore errors during command execution. Given the following Taskfile:
您可以选择在命令执行期间忽略错误。 给定以下 Taskfile:
```yaml
version:'3'
@@ -1190,13 +1164,13 @@ tasks:
By default, Task just redirects the STDOUT and STDERR of the running commands to the shell in real-time. This is good for having live feedback for logging printed by commands, but the output can become messy if you have multiple commands running simultaneously and printing lots of stuff.
To make this more customizable, there are currently three different output options you can choose:
为了使其更具可定制性,目前您可以选择三种不同的输出选项:
-`interleaved` (default)
-`interleaved` (默认)
-`group`
-`prefixed`
To choose another one, just set it to root in the Taskfile:
要选择另一个,只需在 Taskfile 根目录中设置即可:
```yaml
version:'3'
@@ -1207,7 +1181,7 @@ tasks:
# ...
```
The `group`output will print the entire output of a command once after it finishes, so you will not have live feedback for commands that take a long time to run.
When using the `group` output, you can optionally provide a templated message to print at the start and end of the group. This can be useful for instructing CI systems to group all of the output for a given task, such as with [GitHub Actions' `::group::` command](https://docs.github.com/en/actions/learn-github-actions/workflow-commands-for-github-actions#grouping-log-lines) or [Azure Pipelines](https://docs.microsoft.com/en-us/azure/devops/pipelines/scripts/logging-commands?expand=1&view=azure-devops&tabs=bash#formatting-commands).
@@ -1289,12 +1263,10 @@ $ task default
:::tip
The `output` option can also be specified by the `--output` or `-o` flags.
:::
## 交互式 CLI 应用
When running interactive CLI applications inside Task they can sometimes behave weirdly, especially when the [output mode](#output-syntax) is set to something other than `interleaved` (the default), or when interactive apps are run in parallel with other tasks.
@@ -1345,14 +1317,14 @@ tasks:
:::info
Keep in mind that not all options are available in the [shell interpreter library](https://github.com/mvdan/sh) that Task uses.
:::
## 观察任务
With the flags `--watch` or `-w` task will watch for file changes and run the task again. This requires the `sources` attribute to be given, so task knows which files to watch.
The default watch interval is 5 seconds, but it's possible to change it by either setting `interval: '500ms'` in the root of the Taskfile passing it as an argument like `--interval=500ms`.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.