使用 --experimental-specifier-resolution=node 时如何让 yargs 自动完成工作

2024-01-05

我的目标是在 Typescript/node.js 中编写一个 CLI,它使用--experimental-specifier-resolution=node,用 yargs 编写,支持自动完成。

为了使这项工作正常进行,我使用这个entry.sh文件,感谢这有帮助所以答案 https://stackoverflow.com/a/68154775/3694288(以及bin: {eddy: "./entry.sh"}package.json 中的选项指向此文件)

#!/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 to the ~/.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 - 还没有 ????

Update

正在研究可重现的示例(WIP)。 回购协议是here https://github.com/21RISK/yargs-autocomplete.

目前最大的区别之一是npm link在两种不同的环境中工作方式不同。它只是在我试图重现的存储库中/usr/local/share/npm-global/bin/实际上已更新。目前正在尝试调查此事。


您可以尝试指定脚本名称 https://github.com/yargs/yargs/pull/1143/files在你的entry.js文件到你的包装脚本的名称。这可能会强制使用它生成完成名称。我还没有尝试过,但是查看 yargs 的源代码,它看起来像$0可以使用更改参数scriptName,这反过来又会影响完成生成函数如何生成完成代码:

In yargs-factor.ts:

  scriptName(scriptName: string): YargsInstance {
    this.customScriptName = true;
    this.$0 = scriptName;
    return this;
  }

In completion.ts:

  generateCompletionScript($0: string, cmd: string): string {
    let script = this.zshShell
      ? templates.completionZshTemplate
      : templates.completionShTemplate;
    const name = this.shim.path.basename($0);

    // add ./ to applications not yet installed as bin.
    if ($0.match(/\.js$/)) $0 = `./${$0}`;

    script = script.replace(/{{app_name}}/g, name);
    script = script.replace(/{{completion_command}}/g, cmd);
    return script.replace(/{{app_path}}/g, $0);
  }

我也不确定如何"bin"配置有效,但可能是因为scriptName您将不再需要包装纸。

确保您使用的 yargs 版本支持此功能。

另外,作为旁注,我考虑建议直接修改生成的完成脚本,但除了黑客行为之外,还可能导致脚本名称在完成过程中无法识别。无论如何,我只是先看看正确的方法。

修改后的版本会是这样的:

_entry.sh_yargs_completions()
{
    local cur_word args type_list

    cur_word="${COMP_WORDS[COMP_CWORD]}"
    args=("${COMP_WORDS[@]}")

    # ask yargs to generate completions.
    type_list=$(/path/to/entry.sh --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.sh_yargs_completions entry.sh

另请注意:如果脚本名称需要根据其调用者的名称是动态的,您可以通过环境变量使其可识别,因此在entry.sh你可以这样声明它:

export ENTRY_JS_SCRIPT_NAME=entry.sh
node ...

然后在某个地方entry.js,您可以通过以下方式访问变量名称:

process.env.ENTRY_JS_SCRIPT_NAME

也许甚至只是指定$0 or ${0##*/}任何有效的方法:

export ENTRY_JS_SCRIPT_NAME=$0
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 --experimental-specifier-resolution=node 时如何让 yargs 自动完成工作 的相关文章

随机推荐

  • 替代 Y 组合器定义

    我最近花了一些时间研究 Y 组合器 我发现它通常定义 或多或少 如下 这是在 C 中 但选择的语言并不重要 public delegate TResult SelfApplicable
  • Android TextureView OpenGLRenderer: GL_INVALID_OPERATION

    我有两个具有TextureView 的片段来显示相机预览或播放视频 使用应用程序一段时间后 玩玩屏幕 我在 logcat 中收到此错误 OpenGLRenderer GL INVALID OPERATION 我从我的碎片中释放一切 所有成员
  • 如何在两个项目之间共享存储库和服务类

    我正在开发 2 个项目 一个 Web 应用程序 Spring MVC 和一个独立的后端服务应用程序 Spring boot 它们大量交互 我对两者都使用 hibernate 并且它们都是使用 Netbeans IDE 进行编码的 我的 问题
  • Twitter 卡片验证器在开发时出现错误

    我在验证开发中的 Twitter 卡时遇到问题 我已将路由器的公共 IP 配置为指向我的内部 LAN IP 端口http 119 21 79 135 3000 鉴于元标签已就位
  • 如何使用 Orika 映射 java.time.LocalDate 字段?

    发生这种情况是因为 LocalDate 不是JavaBean https en wikipedia org wiki JavaBeans 它没有零参数构造函数 要解决此问题 您需要创建一个 LocalDateConverter public
  • UITextFields 中联系信息的快捷方式或自动填充

    当我在 iOS 中的 Safari 中打开一个要求输入姓名和地址的表单时 我会在键盘区域中找到快捷方式 例如 这是当焦点位于名字字段时的键盘 我可以点击 罗伯特 而不是输入名字 姓氏 电话 电子邮件 邮政编码字段也会发生类似的情况 我可以在
  • 更新到 Angular 8 后,Material-UI 下拉菜单在 IE11 中导致错误

    打开材质菜单时 使用材质 8 的 Angular 8 应用程序在 IE11 上抛出以下错误 Unable to get property opacity of undefined or null reference 它与 Angular 7
  • 计算表面包含 4 个点的球体中心 (C#)

    我正在使用名为 MIConvexHull 的 3D Voronoi 库 它计算 3D 空间中一系列点的 3D Voronoi 图 然而 它没有提供有关 Voronoi 图结构的高级信息 报告的边只是一系列坐标对 然后必须计算其外心 现在 该
  • 使用 Azure 函数处理 Azure Datalake 存储文件

    我定期在 Azure Datalake 存储上的特定文件夹中获取文件 文件一到达 我想使用 Azure 函数进一步处理它 那可能吗 UPDATE With 多协议接入 https learn microsoft com en us azur
  • 当变量设置为新对象时,VBA 对象是否会被销毁?

    我还没有找到这个问题的具体答案 所以希望有人能为我解答 据我了解 VBA 垃圾收集器使用引用计数来确定是否不再需要某个对象 并显式解除与变量的关联 从而减少引用计数 Set objectVariable Nothing 这是我现在正在处理的
  • 简化 CNF 公式,同时保留某些变量的所有解决方案

    有关的 CNF 简化 https stackoverflow com questions 23461191 cnf simplification 事实上 我认为这个问题的提交者可能是在追求我想要的东西 有许多工具可用于简化 或求解前 预处理
  • Boost.Log 配置文件

    我正在向旧的 C 程序添加日志记录 经过一番研究后 我决定使用升压日志 http www boost org doc libs 1 56 0 libs log doc html index html 该文档充满了创建接收器和过滤器的示例 但
  • Arduino 上的中断会中断其他中断吗?

    我有一个Arduino Uno http arduino cc en Main ArduinoBoardUno 很棒的小设备 它有两个中断 让我们称呼他们吧0 and 1 我将一个处理程序附加到中断 0 并将另一个处理程序附加到中断 1 使
  • 如何将lucene文件从2.2升级到4.3.1

    我在 lucene V 2 2 中有大量索引数据 并且我已将 lucene jar 升级到 4 3 1 新版本支持升级2 2文件 如果是 我该怎么做 Lucene 保证索引向后兼容以前的主要版本 这意味着 Lucene 4 X 应该能够读取
  • 如何将 CSS 动画导出为动画 PNG、gif 或 WEBP *具有透明度*?

    Press 运行代码片段 下面可以看到我想要保存的动画加载微调器 我想用透明度替换所有绿色 另外 我希望动画能够完美循环 我尝试使用OBS录制屏幕截图视频 然后上传到https ezgif com video to gif https ez
  • Bootstrap对齐不同高度的列

    我希望能够将未知数量的列与未知的高度对齐 由于我不知道会有多少列 因此使用多行来分割列对我来说并不理想 我几乎可以通过使用列表项来达到我想要的结果 我不喜欢使用列表项的一件事是 一旦页面达到调整大小点 我就会在右侧留下额外的空间 顶部的一组
  • edge-sql.js 如何设置connectionString?

    var edge require edge var getProduct edge func sql function select from Products where ProductId myProductId getProduct
  • pandas 将多列索引应用于数据框

    情况是我有一些文件 其中包含具有多个字段的各种股票的 time series 数据 每个文件包含 time open high low close volume 目标是将所有内容放入表单的一个数据框中 field open high sec
  • cmake 在命令行上创建 Visual Studio 解决方案

    我使用的是cmake 2 6 4 WinXP专业版 在 Visual studio 2008 VC Express 版本上编译 我可以使用 cmake GUI 创建解决方案文件 但是 我不想使用 cmake GUI 因为我总是更喜欢命令行
  • 使用 --experimental-specifier-resolution=node 时如何让 yargs 自动完成工作

    我的目标是在 Typescript node js 中编写一个 CLI 它使用 experimental specifier resolution node 用 yargs 编写 支持自动完成 为了使这项工作正常进行 我使用这个entry