Как узнать версию установленного в данный момент пакета из yarn.lock - PullRequest
4 голосов
/ 28 февраля 2020

Я пишу внутренний инструмент, который сравнивает версию, установленную в проекте, и позволяет передавать только определенную версию. Для этого я должен проверить версию, которая разрешена в файле yarn.lock, как пакет. Файл json имеет диапазон semver, а не специфицированную c версию, и в любом случае он не сообщает вам о зависимости.

Я пытался использовать команду yarn list, но она также печатает диапазон полуавтоматического файла и анализировать его очень сложно (даже с параметром --json). Так что yarn.lock кажется единственным способом. Я знаю, что yarn.lock может иметь отдельные версии одного и того же пакета, и в этом случае мне нужна только версия, которая установлена ​​в. node_nodules (должна быть только одна из них). Я понятия не имею, как разобрать файл блокировки, хотя.

Другой способ, о котором я могу подумать, - это перейти в папку node_modules и проверить версию в package.json пакета.

Ни один из приведенных выше вариантов не выглядит чистым для меня. Есть ли способ узнать разрешенную версию указанного пакета c (при условии, что я знаю имя пакета и знаю, что он установлен) легко и чисто, насколько это возможно?

Обновление :
На самом деле мне нужны все версии установленного пакета (даже если они действительно глубоко в дереве зависимостей).

1 Ответ

1 голос
/ 01 марта 2020

Я обнаружил, что yarn why - лучший способ узнать установленную на данный момент версию пакета (спасибо одному из моих коллег, который указал мне). Вот так выглядит мой тестовый код в JavaScript.

const { spawnSync } = require('child_process');
const packageName = 'micromatch';
const whyBuffer = spawnSync('yarn', ['why', packageName]);
const grepBuffer = spawnSync('grep', ['Found'], { input: whyBuffer.stdout });
const outputArray = grepBuffer.stdout.toString().split('\n');
console.log(outputArray); // ['info \r=> Found "micromatch@3.1.10"',    'info \r=> Found "fast-glob#micromatch@4.0.2"', ''  ]
const parsedOutputArray = outputArray.filter(output => output.length > 0).map((output) => output.split('@')[1].replace('"', ''))
console.log(parsedOutputArray); // [ '3.1.10', '4.0.2' ]
...