Иногда случается, что кто-то не вносит изменения в основную ветку, и они действительно публикуют lerna просто для того, чтобы установить самую новую версию этого пакета и использовать ее в своем проекте.
Чтобы этого не произошло, вы можете использовать скрипт выпуска, чтобы убедиться, что вы:
- Не на разветвлении
- Вкл.
master
- Подтвердиливсе ваши изменения
- Последние удаленные изменения
- Все тесты пройдены
Это должно помешать вам выйти из синхронизации и обеспечить чистоту опубликованных версий.
$ node scripts/prerelease.js && lerna publish
scripts / prerelease.js
const {promisify} = require('util');
const execa = require('execa');
const parse = require('git-url-parse');
const rimraf = promisify(require('rimraf'));
const Listr = require('listr');
const pkg = require('../package');
const tasks = new Listr([
{
task: () =>
execa.stdout('git', ['remote', 'get-url', 'origin']).then((result) => {
const pkgUrlParsed = parse(pkg.repository.url);
const gitUrlParsed = parse(result);
const pkgUrl = pkgUrlParsed.resource + pkgUrlParsed.pathname;
const gitUrl = gitUrlParsed.resource + gitUrlParsed.pathname;
if (pkgUrl !== gitUrl) {
throw new Error(
'Cannot publish from a fork. Please clone source repository directly or ensure that the `package.json` file has a `repository.url` set.'
);
}
}),
title: 'Not publishing from fork'
},
{
task: () =>
execa.stdout('git', ['symbolic-ref', '--short', 'HEAD']).then((result) => {
if (result !== 'master') {
throw new Error('Not on `master` branch. Please switch to `master` branch before publishing.');
}
}),
title: 'On `master` branch'
},
{
task: () =>
execa.stdout('git', ['status', '--porcelain']).then((result) => {
if (result !== '') {
throw new Error('Unclean working tree. Please commit or stash changes first.');
}
}),
title: 'No uncommitted changes'
},
{
task: () =>
execa.stdout('git', ['rev-list', '--count', '--left-only', '@{u}...HEAD']).then((result) => {
if (result !== '0') {
throw new Error('Remote has changes you do not have locally. Please pull changes.');
}
}),
title: 'Have latest remote changes'
},
{
task: () => rimraf('**/node_modules'),
title: 'Removing `node_modules`'
},
{
task: () => execa('yarn'),
title: 'Installing dependencies using yarn'
},
{
task: () => execa('yarn', ['bootstrap']),
title: 'Bootstrap packages together with Lerna'
},
{
enabled: () => pkg.scripts.test !== undefined,
task: () => execa('yarn', ['test']),
title: 'Running tests'
},
{
enabled: () => pkg.scripts.build !== undefined,
task: () => execa('yarn', ['build']),
title: 'Building assets'
}
]);
tasks
.run()
.then(() => console.log('Finished! ?`'))
.catch((error) => {
console.error(error);
process.exit(1);
});