为什么我在暂存文件上访问 `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
"""
}
当我 运行 以下脚本时,我得到一个 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
"""
}