为什么我在暂存文件上访问 `isEmpty()` 时得到 `java.nio.file.ProviderMismatchException`

Why do I get a `java.nio.file.ProviderMismatchException` when I access `isEmpty()` on a staged file

当我 运行 以下脚本时,我得到一个 java.nio.file.ProviderMismatchException

process a {
    output:
        file _biosample_id optional true into biosample_id

    script:
    """
    touch _biosample_id
    """
}

process b {
    input:
        file _biosample_id from biosample_id.ifEmpty{file("_biosample_id")}

    script:
    def biosample_id_option = _biosample_id.isEmpty() ? '' : "--biosample_id $(cat _biosample_id)"
    """
    echo $(cat ${_biosample_id})
    """
}

我使用的是 Optional Input 模式的略微修改版本。

关于我为什么得到 java.nio.file.ProviderMismatchException 的任何想法?

在你的 script block, _biosample_id is actually an instance of the nextflow.processor.TaskPath class 中。因此,要检查文件(或目录)是否为空,您只需调用它的 .empty() 方法即可。例如:

script:
def biosample_id_option = _biosample_id.empty() ? '' : "--biosample_id $(< _biosample_id)"

我喜欢您的解决方案 - 我认为它很简洁。而且我认为它应该是健壮的(但我还没有测试过)。尝试将丢失的输入文件暂存到远程 filesystem/object 存储时,推荐的可选输入模式将失败。然而,有一个 solution,它是在你的 $baseDir 中保留一个空文件,并在你的脚本中指向它。例如:

params.inputs = 'prots/*{1,2,3}.fa'
params.filter = "${baseDir}/assets/null/NO_FILE"

prots_ch = Channel.fromPath(params.inputs)
opt_file = file(params.filter)

process foo {
  input:
  file seq from prots_ch
  file opt from opt_file

  script:
  def filter = opt.name != 'NO_FILE' ? "--filter $opt" : ''
  """
  your_commad --input $seq $filter
  """
}