Как я могу получить точную последнюю версию npm от относительной версии? - PullRequest
1 голос
/ 08 ноября 2019

Я хочу получить последнюю выпущенную версию npm, которая соответствует относительной семантической версии.

Например, я хотел бы запустить что-то вроде:

npm -v 6.12.x

затем верните точную последнюю версию, которая соответствует:

=> 6.12.1

Я изучил некоторые документы и доступные команды или думаю, что это возможно с npm, но я не видел ничего, что работает без установки другойглобальная зависимость.

1 Ответ

0 голосов
/ 10 ноября 2019

Краткий ответ: npm не предоставляет встроенную функцию для точного удовлетворения ваших требований.

Однако npm предоставляет команду npm-view . Документация гласит следующее:

Если указан диапазон версий, то данные будут распечатываться для каждой соответствующей версии пакета. Это покажет, какая версия jsdom была необходима для каждой соответствующей версии yui3:

npm view yui3@'>0.5.4' dependencies.jsdom.

Два приведенных ниже решения демонстрируют, как вывод команды npm viewможно анализировать / манипулировать в соответствии с вашими требованиями (без необходимости устанавливать другую глобальную зависимость).


Решение A: * Только для платформ Nix (Linux / MacOS ...)

Следовательно, можно выполнить ваши требования с помощью некоторых дополнительных утилит Bash для анализа выходных данных. .

Попробуйте выполнить следующую составную команду:

npm view npm@'6.12.x' version | tail -n 1 | cut -d "'" -f2

Объяснение

Ниже приводится объяснение составных частей в вышеупомянутой составной команде:

  1. npm view npm@'6.12.x' version

    Эта часть использует команду npm view для возврата всех версий в данном диапазоне, т. Е. 6.12.x.

    Автономный запуск этих компонентов выведет на консоль следующую информацию:

    npm@6.12.0 '6.12.0'
    npm@6.12.1 '6.12.1'
    
  2. | tail -n 1

    Ранеепоказанный результат затем передается по каналу tail с использованием параметра -n 1, так что печатается только последняя строка.

    Запуск:

    npm view npm@'6.12.x' version | tail -n 1
    

    печать:

    npm@6.12.1 '6.12.1'

  3. | cut -d "'" -f2

    Ранее шоЗатем результат передается в cut с использованием опции -d и указанием одинарной кавычки в качестве разделителя. Партия -f2 затем выбирает второй элемент.

    Выполнение полной составной команды:

    npm view npm@'6.12.x' version | tail -n 1 | cut -d "'" -f2
    

    выводит желаемый результат:

    6.12.1

Полуразделы тильды (~) и каретки (^).

Вы также можете указать диапазоны тильды или каретки с помощью вышеупомянутой составной команды.

Примеры:

  • Задание диапазона тильды:

    npm view npm@'~4.0.0' version | tail -n 1 | cut -d "'" -f2
                  ^^^^^^
    

    отпечатков:

    4.0.5

  • Указание диапазона каретки:

    npm view npm@'^4.0.0' version | tail -n 1 | cut -d "'" -f2
                  ^^^^^^
    

    отпечатков:

    4.6.1


Решение B: Кроссплатформенная (Windows / Linux / macOS ...)

Если вы используете Windows или хотите кроссплатформенностьРешением (т. е. успешно работающим в Windows, Linux и macOS ...) вам нужно будет использовать nodejs для выполнения ваших требований.

Рассмотрите возможность выполнения следующей составной команды:

node -e "var res = require('child_process').execSync('npm view npm@"\"6.12.x\"" version', {encoding: 'utf-8'}).split('\n').filter(Boolean); if (res.length) { if (res.length === 1) { res = res[0]; } else { res = res.pop().split(' ')[1]; } console.log(res.replace(/[']/g, '')); }"

Да, я согласен, это несколько словесноПо сравнению с Решение A :)

Пояснение

Ниже приводится объяснение составных частей в вышеупомянутой составной команде:

  1. node -e "..."

    Мы вызываем node, а параметр командной строки nodejs -e используется для оценки заданного встроенного JavaScript.

  2. var res = require('child_process').execSync('npm view npm@"\"6.12.x\"" version', {encoding: 'utf-8'})

    Эта часть данного скрипта node.js (JavaScript) выполняет ту же команду npm view, что и в Решение A , т.е. npm view npm@"\"6.12.x\"" version, с использованием execSync () .

  3. .split('\n').filter(Boolean);

    Результат команды npm view преобразуется из строки в массив с использованием метода строки split() - по сути, каждая строка результата разделяется символом новой строки \n, так что каждая строкавывода становится элементом в массиве.

    Часть .filter(Boolean) удаляет пустые элементы из массива, созданные дополнительным трейлом. g пустых строк, которые печатает команда npm view.

  4. if (res.length) { if (res.length === 1) { res = res[0]; } else { res = res.pop().split(' ')[1]; } ... }

    Здесь мы используем некоторые условные if..else операторы, чтобы гарантировать получение нужного элемента из массива.

  5. console.log(res.replace(/[']/g, ''));

    Наконец, мы записываем результат в консоль и используем метод replace() для удаления одинарных кавычек ('), которые заключают в себе значение semver.

Диапазоны тильды (~) и каретки (^).

Согласно Решение A , вы также можете указать диапазоны тильды или каретки с помощью вышеупомянутой составной команды.

Примеры:

  • Указание диапазона тильды:

    node -e "var res = require('child_process').execSync('npm view npm@"\"~4.0.0\"" version', {encoding: 'utf-8'}).split('\n').filter(Boolean); if (res.length) { if (res.length === 1) { res = res[0]; } else { res = res.pop().split(' ')[1]; } console.log(res.replace(/[']/g, '')); }"
                                                                          ^^^^^^
    

    Отпечатки:

    4.0.5

  • Указание диапазона каретки:

    node -e "var res = require('child_process').execSync('npm view npm@"\"^4.0.0\"" version', {encoding: 'utf-8'}).split('\n').filter(Boolean); if (res.length) { if (res.length === 1) { res = res[0]; } else { res = res.pop().split(' ')[1]; } console.log(res.replace(/[']/g, '')); }"
                                                                          ^^^^^^
    

    Отпечатки:

    4.6.1

...