Веб-сайт www.npmjs.com не предоставляет информации о равноправных узлах . Однако эти метаданные находятся в конечной точке реестра npm: https://registry.npmjs.org/
.
Через вашу командную строку вы можете получить к ней доступ, используя команду npm view
. Например:
npm view <pkg_name> peerDependencies
Примечание: Вам необходимо заменить часть <pkg_name>
реальным именем пакета.
Вышеупомянутая команда выведет список peerDependencies
для последней версии данного пакета.
Я хочу видеть равноправные зависимости всех версий определенного пакета .
Для этого вы можете:
Запустите следующую команду, чтобы получить все версии для данного пакета
npm view babel-loader versions --json
Примечание Здесь мы проверяем babel-loader , но это может быть любое допустимое имя пакета
Будет напечатано:
[
"4.0.0",
"4.1.0",
"4.2.0",
"4.3.0",
"5.0.0",
...
]
Затем выполните следующую команду, чтобы получить одноранговые зависимости для каждой из ранее перечисленных версий:
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
.