

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# HealthOmics 工作流程定義中的任務輸出
<a name="workflows-task-outputs"></a>

您可以在工作流程定義中指定任務輸出。根據預設，HealthOmics 會在工作流程完成時捨棄所有中繼任務檔案。若要匯出中繼檔案，請將其定義為輸出。

如果您使用呼叫快取，HealthOmics 會將任務輸出儲存到快取，包括您定義為輸出的任何中繼檔案。

下列主題包含每個工作流程定義語言的任務定義範例。

**Topics**
+ [WDL 的任務輸出](#workflow-task-outputs-wdl)
+ [Nextflow 的任務輸出](#workflow-task-outputs-nextflow)
+ [CWL 的任務輸出](#workflow-task-outputs-cwl)

## WDL 的任務輸出
<a name="workflow-task-outputs-wdl"></a>

對於以 WDL 撰寫的工作流程定義，請在最上層工作流程**outputs**區段中定義輸出。

HealthOmics

**Topics**
+ [STDOUT 的任務輸出](#task-outputs-wdl-stdout)
+ [STDERR 的任務輸出](#task-outputs-wdl-stderr)
+ [任務輸出至檔案](#task-outputs-wdl-file)
+ [檔案陣列的任務輸出](#task-outputs-wdl-files)

### STDOUT 的任務輸出
<a name="task-outputs-wdl-stdout"></a>

此範例會建立名為 的任務`SayHello`，將 STDOUT 內容回應至任務輸出檔案。WDL **stdout**函數會擷取檔案 中的 STDOUT 內容 （在此範例中為 **Hello World！** 輸入字串）**stdout\$1file**。

由於 HealthOmics 會為所有 STDOUT 內容建立日誌，因此輸出也會出現在 CloudWatch Logs 中，以及任務的其他 STDERR 記錄資訊。

```
version 1.0
 workflow HelloWorld {
    input {
        String message = "Hello, World!"
        String ubuntu_container = "123456789012.dkr.ecr.us-east-1.amazonaws.com/dockerhub/library/ubuntu:20.04"
    }

    call SayHello {
        input:
            message = message,
            container = ubuntu_container
    }

    output {
        File stdout_file = SayHello.stdout_file
    }
}

task SayHello {
    input {
        String message
        String container
    }

    command <<<
        echo "~{message}" 
        echo "Current date: $(date)"
        echo "This message was printed to STDOUT"
    >>>

    runtime {
        docker: container
        cpu: 1
        memory: "2 GB"
    }

    output {
        File stdout_file = stdout()
    }
}
```

### STDERR 的任務輸出
<a name="task-outputs-wdl-stderr"></a>

此範例會建立名為 的任務`SayHello`，將 STDERR 內容回應至任務輸出檔案。WDL **stderr**函數會擷取檔案 中的 STDERR 內容 （在此範例中為 **Hello World！** 輸入字串）**stderr\$1file**。

由於 HealthOmics 會為所有 STDERR 內容建立日誌，因此輸出會出現在 CloudWatch Logs 中，以及任務的其他 STDERR 記錄資訊。

```
version 1.0
 workflow HelloWorld {
    input {
        String message = "Hello, World!"
        String ubuntu_container = "123456789012.dkr.ecr.us-east-1.amazonaws.com/dockerhub/library/ubuntu:20.04"
    }

    call SayHello {
        input:
            message = message,
            container = ubuntu_container
    }

    output {
        File stderr_file = SayHello.stderr_file
    }
}

task SayHello {
    input {
        String message
        String container
    }

    command <<<
        echo "~{message}" >&2
        echo "Current date: $(date)" >&2
        echo "This message was printed to STDERR" >&2
    >>>

    runtime {
        docker: container
        cpu: 1
        memory: "2 GB"
    }

    output {
        File stderr_file = stderr()
    }
}
```

### 任務輸出至檔案
<a name="task-outputs-wdl-file"></a>

在此範例中，SayHello 任務會建立兩個檔案 (message.txt 和 info.txt)，並明確將這些檔案宣告為具名輸出 (message\$1file 和 info\$1file)。

```
version 1.0
workflow HelloWorld {
    input {
        String message = "Hello, World!"
        String ubuntu_container = "123456789012.dkr.ecr.us-east-1.amazonaws.com/dockerhub/library/ubuntu:20.04"
    }

    call SayHello {
        input:
            message = message,
            container = ubuntu_container
    }

    output {
        File message_file = SayHello.message_file
        File info_file = SayHello.info_file
    }
}

task SayHello {
    input {
        String message
        String container
    }

    command <<<
        # Create message file
        echo "~{message}" > message.txt
        
        # Create info file with date and additional information
        echo "Current date: $(date)" > info.txt
        echo "This message was saved to a file" >> info.txt
    >>>

    runtime {
        docker: container
        cpu: 1
        memory: "2 GB"
    }

    output {
        File message_file = "message.txt"
        File info_file = "info.txt"
    } 
}
```

### 檔案陣列的任務輸出
<a name="task-outputs-wdl-files"></a>

在此範例中，`GenerateGreetings`任務會產生一組檔案做為任務輸出。任務會為輸入陣列 的每個成員動態產生一個問候語檔案`names`。由於檔案名稱在執行時間之前是未知的，因此輸出定義會使用 WDL glob() 函數來輸出符合模式 的所有檔案`*_greeting.txt`。

```
version 1.0
 workflow HelloArray {
    input {
        Array[String] names = ["World", "Friend", "Developer"]
        String ubuntu_container = "123456789012.dkr.ecr.us-east-1.amazonaws.com/dockerhub/library/ubuntu:20.04"
    }

    call GenerateGreetings {
        input:
            names = names,
            container = ubuntu_container
    }

    output {
        Array[File] greeting_files = GenerateGreetings.greeting_files
    }
}

task GenerateGreetings {
    input {
        Array[String] names
        String container
    }

    command  <<<
        # Create a greeting file for each name
        for name in ~{sep=" " names}; do
            echo "Hello, $name!" > ${name}_greeting.txt
        done
    >>>

    runtime {
        docker: container
        cpu: 1
        memory: "2 GB"
    }

    output {
        Array[File] greeting_files = glob("*_greeting.txt")
    }       
 }
```

## Nextflow 的任務輸出
<a name="workflow-task-outputs-nextflow"></a>

對於以 Nextflow 編寫的工作流程定義，請定義 **publishDir** 指令，將任務內容匯出到您的輸出 Amazon S3 儲存貯體。將 **publishDir** 值設定為 `/mnt/workflow/pubdir`。

若要讓 HealthOmics 將檔案匯出至 Amazon S3，檔案必須位於此目錄中。

如果任務產生一組輸出檔案，做為後續任務的輸入，建議您將這些檔案分組在 目錄中，並將該目錄發出為任務輸出。列舉每個個別檔案可能會導致基礎檔案系統中的 I/O 瓶頸。例如：

```
process my_task {
      ...
      // recommended
      output "output-folder/", emit: output
      
      // not recommended
      // output "output-folder/**", emit: output
      ...
  }
```

## CWL 的任務輸出
<a name="workflow-task-outputs-cwl"></a>

對於以 CWL 編寫的工作流程定義，您可以使用任務指定`CommandLineTool`任務輸出。下列各節顯示定義不同輸出類型的`CommandLineTool`任務範例。

**Topics**
+ [STDOUT 的任務輸出](#task-outputs-cwl-stdout)
+ [STDERR 的任務輸出](#task-outputs-cwl-stderr)
+ [任務輸出至檔案](#task-outputs-cwl-file)
+ [檔案陣列的任務輸出](#task-outputs-cwl-files)

### STDOUT 的任務輸出
<a name="task-outputs-cwl-stdout"></a>

此範例會建立將 STDOUT 內容回應至名為 的文字輸出檔案`CommandLineTool`的任務**output.txt**。例如，如果您提供下列輸入，則產生的任務輸出在 **output.txt** 檔案中為 **Hello World！**。

```
{
    "message": "Hello World!"
}
```

`outputs` 指令指定輸出名稱為 ，**example\$1out**其類型為 `stdout`。若要讓下游任務消耗此任務的輸出，它會將輸出稱為 `example_out`。

由於 HealthOmics 會為所有 STDERR 和 STDOUT 內容建立日誌，因此輸出也會出現在 CloudWatch Logs 中，以及任務的其他 STDERR 日誌記錄資訊。

```
cwlVersion: v1.2
class: CommandLineTool
baseCommand: echo
stdout: output.txt
inputs:
  message:
    type: string
    inputBinding:
      position: 1
outputs:
  example_out:
    type: stdout

requirements:
    DockerRequirement:
        dockerPull: 123456789012.dkr.ecr.us-east-1.amazonaws.com/dockerhub/library/ubuntu:20.04
    ResourceRequirement:
        ramMin: 2048
        coresMin: 1
```

### STDERR 的任務輸出
<a name="task-outputs-cwl-stderr"></a>

此範例會建立將 STDERR 內容回應至名為 的文字輸出檔案`CommandLineTool`的任務**stderr.txt**。任務會修改 ，`baseCommand`讓 `echo`寫入 STDERR （而非 STDOUT)。

`outputs` 指令指定輸出名稱為 ，**stderr\$1out**其類型為 `stderr`。

由於 HealthOmics 會為所有 STDERR 和 STDOUT 內容建立日誌，因此輸出會出現在 CloudWatch Logs 中，以及任務的其他 STDERR 日誌記錄資訊。

```
cwlVersion: v1.2
class: CommandLineTool
baseCommand: [bash, -c]
stderr: stderr.txt
inputs:
  message:
    type: string
    inputBinding:
      position: 1
      shellQuote: true
      valueFrom: "echo $(self) >&2"
outputs:
  stderr_out:
    type: stderr

requirements:
    DockerRequirement:
        dockerPull: 123456789012.dkr.ecr.us-east-1.amazonaws.com/dockerhub/library/ubuntu:20.04
    ResourceRequirement:
        ramMin: 2048
        coresMin: 1
```

### 任務輸出至檔案
<a name="task-outputs-cwl-file"></a>

此範例會建立從輸入檔案建立壓縮 tar 封存`CommandLineTool`的任務。您提供封存的名稱做為輸入參數 (archive\$1name)。

**outputs** 指令指定`archive_file`輸出類型為 `File`，並使用輸入參數的參考`archive_name`繫結至輸出檔案。

```
cwlVersion: v1.2
class: CommandLineTool
baseCommand: [tar, cfz]
inputs:
  archive_name:
    type: string
    inputBinding:
      position: 1
  input_files:
    type: File[]
    inputBinding:
      position: 2
      
outputs:
  archive_file:
    type: File
    outputBinding:
      glob: "$(inputs.archive_name)"

requirements:
    DockerRequirement:
        dockerPull: 123456789012.dkr.ecr.us-east-1.amazonaws.com/dockerhub/library/ubuntu:20.04
    ResourceRequirement:
        ramMin: 2048
        coresMin: 1
```

### 檔案陣列的任務輸出
<a name="task-outputs-cwl-files"></a>

在此範例中，`CommandLineTool`任務會使用 `touch`命令建立檔案陣列。命令會使用`files-to-create`輸入參數中的字串來命名檔案。命令會輸出一組檔案。陣列包含工作目錄中符合 `glob` 模式的任何檔案。此範例使用符合所有檔案的萬用字元模式 ("\$1")。

```
cwlVersion: v1.2
class: CommandLineTool
baseCommand: touch
inputs:
  files-to-create:
    type:
      type: array
      items: string
    inputBinding:
      position: 1
outputs:
  output-files:
    type:
      type: array
      items: File
    outputBinding:
      glob: "*"

requirements:
    DockerRequirement:
        dockerPull: 123456789012.dkr.ecr.us-east-1.amazonaws.com/dockerhub/library/ubuntu:20.04
    ResourceRequirement:
        ramMin: 2048
        coresMin: 1
```