Могу ли я найти одноранговые зависимости пакета на www.npmjs.com - PullRequest
1 голос
/ 06 июня 2019

У меня есть проект, в котором через NPM установлено около 50 пакетов. После нескольких месяцев пренебрежения мне нужно обновить большинство пакетов, что привело к нескольким несовпадающим зависимостям одноранговых узлов. Чтобы найти правильную комбинацию версий пакета, я хочу увидеть одноранговые зависимости всех версий определенного пакета.

Где на www.npmjs.com я могу найти зависимости между равноправными пакетами?

На странице пакета показаны "зависимости" и "иждивенцы", но я считаю, что это обычные зависимости, а не "равноправные зависимости".

1 Ответ

1 голос
/ 06 июня 2019

Веб-сайт www.npmjs.com не предоставляет информации о равноправных узлах . Однако эти метаданные находятся в конечной точке реестра npm: https://registry.npmjs.org/.

Через вашу командную строку вы можете получить к ней доступ, используя команду npm view. Например:

npm view <pkg_name> peerDependencies

Примечание: Вам необходимо заменить часть <pkg_name> реальным именем пакета.

Вышеупомянутая команда выведет список peerDependencies для последней версии данного пакета.


Я хочу видеть равноправные зависимости всех версий определенного пакета .

Для этого вы можете:

  1. Запустите следующую команду, чтобы получить все версии для данного пакета

    npm view babel-loader versions --json
    

    Примечание Здесь мы проверяем babel-loader , но это может быть любое допустимое имя пакета

    Будет напечатано:

    [
      "4.0.0",
      "4.1.0",
      "4.2.0",
      "4.3.0",
      "5.0.0",
      ...
    ]
    
  2. Затем выполните следующую команду, чтобы получить одноранговые зависимости для каждой из ранее перечисленных версий:

    npm view babel-loader@4.0.0 peerDependencies --json
                         ^^^^^^
    

    печать:

    {
      "babel-core": "^4.0.0",
      "webpack": "^1.4.5"
    }
    

    Повторите еще раз - аналогично предыдущему, но измените суффикс @<version>, т.е. @4.1.0 в приведенном ниже примере.

    npm view babel-loader@4.1.0 peerDependencies --json
                         ^^^^^^
    

    Это печатает:

    {
      "babel-core": "^4.7.0",
      "webpack": "^1.4.5"
    }
    

    и так далее ...


Автоматизировать задачу:

Возможно, вы захотите автоматизировать описанные выше шаги, создав скрипт node.js следующим образом. При этом используется метод nodejs execSync() для выделения необходимых команд npm, однако вы можете изменить его на использование метода exec(), если хотите, чтобы он выполнялся асинхронно:

script.js

const fs = require('fs');
const sh = require('child_process').execSync;

const PKG_NAME = 'babel-loader'; // <-- Change the package name.

const destFilePath = PKG_NAME.replace(/\//g, '_') + '-peer-deps.json';

const versions = JSON.parse(sh('npm view ' + PKG_NAME + ' versions --json').toString());

const data = versions.map(function(semver) {
  const pkgVersion = PKG_NAME + '@' + semver;
  console.log('> Fetching peerDependencies info for: ' + pkgVersion);

  const peerDeps = sh('npm view ' + pkgVersion +
      ' peerDependencies --json').toString().replace(/[\r\n]/, '');

  return {
    name: pkgVersion,
    peerDependencies: peerDeps ? JSON.parse(peerDeps) : null
  }
});

fs.writeFileSync(destFilePath, JSON.stringify(data, null, 2));

console.log('\nDone !');

Затем запустите следующую команду, чтобы вызвать скрипт node.js:

node ./path/to/script.js

Примечание: При необходимости вам потребуется переопределить деталь ./path/to/.

Учитывая значение babel-loader, назначенное в настоящее время переменной PKG_NAME в script.js, вы увидите что-то вроде следующего, зарегистрированного на вашей консоли:

> Fetching peerDependencies info for: babel-loader@4.0.0
> Fetching peerDependencies info for: babel-loader@4.1.0
> Fetching peerDependencies info for: babel-loader@4.2.0
...

По завершении он записывает на диск файл .json с именем babel-loader-peer-deps.json, который включает следующее содержимое:

столпотворение-погрузчик-одноранговой deps.json

[
  {
    "name": "babel-loader@4.0.0",
    "peerDependencies": {
      "babel-core": "^4.0.0",
      "webpack": "^1.4.5"
    }
  },
  {
    "name": "babel-loader@4.1.0",
    "peerDependencies": {
      "babel-core": "^4.7.0",
      "webpack": "^1.4.5"
    }
  },
  {
    "name": "babel-loader@4.2.0",
    "peerDependencies": {
      "babel-core": "^4.7.0",
      "webpack": "^1.4.5"
    }
  },
  ...
]

РЕДАКТИРОВАТЬ: Сокращение количества запросов https GET

Если вы хотите сократить количество запросов https GET до одного, тогда я предлагаю использовать встроенную в nodejs https.get() для извлечения данных JSON из конечной точки https://registry.npmjs.org/.

Этот пример ниже будет намного быстрее.

получить-одноранговой deps.js

const fs = require('fs');
const path = require('path');
const https = require('https');

const pkgName = process.argv[2];
const myName = path.basename(__filename);

// Check the package name has been provided
if (!pkgName) {
  console.log('\x1b[40;37m%s\x1b[0m \x1b[40;31m%s\x1b[0m', myName,
      'ERR!', 'Missing package name argument');
  process.exit(1);
}

const fileName = pkgName.replace(/\//g, '_') + '-peer-deps.json';
const destFilePath = path.join(path.dirname(__filename), fileName);
const endPoint = 'https://registry.npmjs.org/' + encodeURIComponent(pkgName);

// Request JSON from npm registry endpoint.
https.get(endPoint, function(resuest) {
  console.log('> Fetching peerDependencies info for: %s...', pkgName);
  var response = '';

  resuest.on('data', function(chunk) {
    response += chunk;
  });

  resuest.on('end', function() {
    processJsonResponse(response);
  });

}).on('error', function(err) {
  console.error(err);
});

/**
 * Processes the JSON response to extract the necessary metadata and saves
 * resultant JSOn to disk.
 * @param {String} data - The JSON response from the npm registry.
 */
function processJsonResponse(data) {
  const versions = JSON.parse(data).versions;
  const semvers = Object.keys(versions);

  const peerDepsInfo = semvers.map(function(semver) {
    const current = versions[semver];
    return {
      name: current.name + '@' + current.version,
      peerDependencies: current.peerDependencies || null
    };
  });

  fs.writeFile(destFilePath, JSON.stringify(peerDepsInfo, null, 2), function(err) {
    if(err) {
      return console.log(err);
    }
    console.log('> Done. Saved result to:\n  %s', destFilePath);
  });
}

Использование:

Затем запустите следующую команду через инструмент командной строки, чтобы вызвать get-peer-deps.js:

node ./path/to/get-peer-deps.js babel-loader
                                ^^^^^^^^^^^^

Примечание: При вызове get-peer-deps.js необходимо указать имя пакета в качестве аргумента. В приведенном выше примере мы передаем babel-loader. Это может быть заменено любым допустимым именем пакета, которое вы предпочитаете. Например, в следующем примере мы передаем @angular/forms:

node ./path/to/get-peer-deps.js @angular/forms
                                ^^^^^^^^^^^^^^

Полученный файл .json будет отформатирован, как описано выше, и будет сохранен в том же каталоге, где находится get-peer-deps.js.

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