Развиваемся с Лерной - PullRequest
       9

Развиваемся с Лерной

0 голосов
/ 26 октября 2018

Я работаю в команде из 10 человек, и мы только начали использовать Lerna.Но мы обнаружили некоторые проблемы, когда все мы разрабатываем новые функции, а также исправляем существующие пакеты.

Иногда случается, что кто-то не вносит изменения в основную ветку, и они действительно публикуют lerna просто для того, чтобы установить самую новую версию этого пакета и использовать ее в своем проекте.

И этосоздает проблемы для всех нас, потому что мы не синхронизируемся с версиями пакетов, и lerna находит изменения в пакетах, которые человек не обновил, и вынуждает их публиковать неизмененные (ими) пакеты.У вас есть совет, как использовать пакет Lerna «в процессе», когда он еще не был опубликован в npm?Сейчас мы устанавливаем его из нашего локального файла с помощью команды:

npm install - сохранить файл: path_to_npm_package

Почему я обнаружил, что это плохо?Потому что таким образом он не знает о символической ссылке lerna, и я должен установить в своем проекте все зависимости, от которых зависит этот пакет lerna.

PS.Проекты, использующие пакеты lerna, не являются другими пакетами lerna.

1 Ответ

0 голосов
/ 31 марта 2019

Иногда случается, что кто-то не вносит изменения в основную ветку, и они действительно публикуют lerna просто для того, чтобы установить самую новую версию этого пакета и использовать ее в своем проекте.

Чтобы этого не произошло, вы можете использовать скрипт выпуска, чтобы убедиться, что вы:

  1. Не на разветвлении
  2. Вкл. master
  3. Подтвердиливсе ваши изменения
  4. Последние удаленные изменения
  5. Все тесты пройдены

Это должно помешать вам выйти из синхронизации и обеспечить чистоту опубликованных версий.

$ 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);
    });
...