【发布时间】:2022-01-26 11:16:48
【问题描述】:
我的目标是在 Typescript/node.js 中编写一个 CLI,它使用 --experimental-specifier-resolution=node,用 yargs 编写并支持自动完成。
为了完成这项工作,我使用了这个 entry.sh 文件,感谢这个有用的 SO anwswer(并且 package.json 中的 bin: {eddy: "./entry.sh"} 选项指向这个文件)
#!/usr/bin/env bash
full_path=$(realpath $0)
dir_path=$(dirname $full_path)
script_path="$dir_path/dist/src/cli/entry.js"
# Path is made thanks to: https://code-maven.com/bash-shell-relative-path
# Combined with knowledge from: https://stackoverflow.com/questions/68111434/how-to-run-node-js-cli-with-experimental-specifier-resolution-node
/usr/bin/env node --experimental-specifier-resolution=node $script_path "$@"
这很好用,我可以使用 CLI。但是,自动完成不起作用。根据 yargs,我应该能够通过将结果从 ./entry.sh completion 输出到 ~/.bashrc 配置文件来获得自动完成功能。但是,这似乎不起作用。
./entry.sh completion 的输出:
###-begin-entry.js-completions-###
#
# yargs command completion script
#
# Installation: ./dist/src/cli/entry.js completion >> ~/.bashrc
# or ./dist/src/cli/entry.js completion >> ~/.bash_profile on OSX.
#
_entry.js_yargs_completions()
{
local cur_word args type_list
cur_word="${COMP_WORDS[COMP_CWORD]}"
args=("${COMP_WORDS[@]}")
# ask yargs to generate completions.
type_list=$(./dist/src/cli/entry.js --get-yargs-completions "${args[@]}")
COMPREPLY=( $(compgen -W "${type_list}" -- ${cur_word}) )
# if no match was found, fall back to filename completion
if [ ${#COMPREPLY[@]} -eq 0 ]; then
COMPREPLY=()
fi
return 0
}
complete -o default -F _entry.js_yargs_completions entry.js
###-end-entry.js-completions-###
我尝试修改 completion 输出,但我不太了解 bash - 还没有 ????
更新
处理可重现的示例 (WIP)。 回购是here。
目前最大的区别之一是npm link 在两种不同的环境中的工作方式不同。仅在我试图重现 /usr/local/share/npm-global/bin/ 实际更新的存储库中。目前正在尝试对此进行调查。
【问题讨论】:
-
修改启动文件后是否重启了 Bash?
-
顺便说一句,您通常应该在所有包含文件名的变量周围使用双引号。见When to wrap quotes around a shell variable
-
嗨@tripleee - 谢谢你给我这个提示。你在这里想什么变量?
type_list? -
$0和$full_path均未引用。只要它们包含琐碎的文件名,这将起作用,但如果您的路径中有空格等,则会爆炸。 -
能否尝试在补全函数中提供entry.js的完整路径而不是`./dist/src/cli/entry.jsˋ?