Я написал инструмент CLI на Node JS и опубликовал его в NPM. Каждый раз, когда он запускается в терминале, мне нужно, чтобы пользователь был уведомлен о новой доступной версии и ее типе (исправление | второстепенный | основной), чтобы он мог обновить ее соответствующим образом. Как я могу реализовать это?
Кроме того, можно ли спросить пользователя, хочет ли он, чтобы пакет обновлялся сам по себе?
A new version of Rapid React is available. Would you like to update it now?(Y\n)
Я бы посоветовал использовать update-notifier, но, как ни странно, это не работает. Поэтому я решил справиться с этой работой сам.
Последнюю версию можно легко проверить с помощью package-json , который извлекает метаданные пакета из реестра npm. В качестве альтернативы можно использовать последнюю версию, которая использует package-json под капотом.
import boxen from 'boxen';
import chalk from 'chalk';
import semver from 'semver';
import pkgJson from 'package-json';
import semverDiff from 'semver-diff';
import { capitalizeFirstLetter } from '../utils';
import { name, version } from '../../package.json';
const checkUpdate = async () => {
const { version: latestVersion } = await pkgJson(name);
// check if local package version is less than the remote version
const updateAvailable = semver.lt(version, latestVersion as string);
if (updateAvailable) {
let updateType = '';
// check the type of version difference which is usually patch, minor, major etc.
let verDiff = semverDiff(version, latestVersion as string);
if (verDiff) {
updateType = capitalizeFirstLetter(verDiff);
}
const msg = {
updateAvailable: `${updateType} update available ${chalk.dim(version)} → ${chalk.green(latestVersion)}`,
runUpdate: `Run ${chalk.cyan(`npm i -g ${name}`)} to update`,
};
// notify the user about the available udpate
console.info(boxen(`${msg.updateAvailable}\n${msg.runUpdate}`, {
margin: 1,
padding: 1,
align: 'center',
}));
}
};
Каждый раз, когда инструмент запускается, пользователь будет видеть такое уведомление, если доступно обновление.