Как манипулировать тем, что возвращает `shell.which ()`? - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть CLI на основе JS / Node, который был изначально разработан для работы в macOS и Linux.Теперь я хочу, чтобы он работал на Windows, но по сложным и фиксированным причинам я должен достичь этого без изменения исходного кода приложения .

Первым шагом было ложьпрограмме о ее process.platform, которая прекрасно работает , связавшись с ее Module (предложенной @estus) и обернув исходный CLI в другой CLI, который затем фактически используется в Windows.

Теперь я наткнулся на некоторый код, который запускает shelljs.which('ruby') и сравнивает результат с определенной строкой (/usr/bin/ruby) и выводит сообщение об ошибке или даже не выполняет программу, если она не совпадает.Я пока не знаю, как это преодолеть.

Как я могу манипулировать тем, что shell.which() возвращает?


Один подход, который я мог бы предпринять, был быманипулировать require('shelljs'), чтобы загрузить свой собственный форк shelljs, который возвращает все, что я хочу (используя override-require, который я уже использовал для замены child_process на cross-spawn, который работает намного лучше наWindows).Но я, конечно же, хочу не поддерживать свой собственный форк shelljs - было бы гораздо практичнее, если бы я мог как-то просто манипулировать shelljs.which.


Я создал супер маленький демонстрационный проект, которыйпохож на CLI, который я использую, и его можно использовать для экспериментов с возможными решениями: https://github.com/janpio/nodejs-cli-wrongruby - fake.js - это то место, где я бы хотел каким-то образом манипулировать shelljs.which.

1 Ответ

0 голосов
/ 14 февраля 2019

С помощью @Berdi в комментариях я понял, что, подобно тому, как я могу связываться с 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 реализация.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...