javascript - 如何操纵 `shell.which()` 返回的内容?

标签 javascript node.js command-line-interface

我有一个基于 JS/Node 的 CLI,最初是为在 macOS 和 Linux 上运行而开发的。我现在想让它在 Windows 上运行,但由于复杂和固定的原因,我必须在不更改应用程序源代码的情况下实现此目的

第一步是 lie to the program about its process.platform ,效果很好 by messing with its Module (由@estus 建议)并将原始 CLI 包装在另一个 CLI 中,然后实际在 Windows 上使用。

现在我偶然发现了一些运行 shelljs.which('ruby') 并将结果与​​特定字符串 (/usr/bin/ruby) 进行比较的代码,并且当不匹配时输出错误消息甚至使程序失败。我还不知道如何克服它。

如何操作 shell.which() 返回的内容?


可以采用的一种方法是操纵 require('shelljs') 加载我自己的 shelljs 分支,它返回任何内容我想要(通过使用 override-require ,我已经用它来替换 child_processcross-spawn ,这在 Windows 上效果更好)。但我当然想避免维护我自己的 shelljs 分支 - 如果我能以某种方式操纵 shelljs.which 会更实用。


我创建了一个类似于我正在使用的 CLI 的超小型演示项目,可用于试验可能的解决方案:https://github.com/janpio/nodejs-cli-wrongruby - fake.js 将是我想以某种方式操纵 shelljs.which 的地方。

最佳答案

在评论中@Berdi 的帮助下,我发现了这一点,类似于我的方法 mess with process.platform ,我也可以乱用 shelljs.which 方法:

// Manipulate shelljs.which('ruby')
const shelljs = require('shelljs')
var original_which = shelljs.which
var new_which = function(cmd) {
    if(cmd == 'ruby') {
        return "/usr/bin/ruby"
    }
    return original_which.call(this, cmd)
}
shelljs.which = new_which

require("./index.js");

(假设原始 CLI 位于 ./index.js 中)

这里所有调用 shelljs.which 的参数 ruby 都用 /usr/bin/ruby 响应,所有其他请求被发送到实际的 shelljs.which 实现。

关于javascript - 如何操纵 `shell.which()` 返回的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54694962/

相关文章:

django - CodeDeploy 运行过时的 appspec 文件?

video - 使用 ffmpeg 在视频上绘图

javascript - 为什么代码中的 catch 语句没有捕获 async 函数中的错误?

node.js - 我应该如何对 Mongoose 中每个相关文档进行文档计数?

node.js - DynamoDB 异常 - 提供的 AttributeValue 设置了不止一种数据类型

javascript - 输入字段上的 Angular 条件只读/禁用

c++ - 如何在 silverlight 应用程序中引用 C++/CLI 项目

javascript - 按钮点击不会触发

javascript - 在这行 javascript 中波浪号在做什么?

javascript - Three.js:初始渲染后更新作为 RawShaderMaterial 统一传递的纹理