2

我在一个 10 人的团队中工作,我们刚刚开始使用 Lerna。但是当我们都在开发新功能并修复现有软件包时,我们发现了一些问题。

有时,有人不会将更改推送到 master 分支,他们会执行 lerna publish,以便他们可以安装该包的最新版本并在他们的项目中使用它。

这给我们所有人带来了麻烦,因为我们没有与包版本同步,并且 lerna 会发现人没有更新的包中的更改并强制他们发布未更改的(由他们)包。你有一些提示如何在尚未发布到 npm 的地方使用 Lerna 包“进行中”吗?现在我们使用命令从本地文件安装它:

 npm install - 保存文件:path_to_npm_package

为什么我觉得这很糟糕?因为这样它不知道 lerna 的符号链接,我应该在我的项目中安装 lerna 包所依赖的所有依赖项。

PS。使用 lerna 包的项目不是其他 lerna 包。

4

1 回答 1

2

有时会发生有人没有将更改推送到 master 分支,而是进行 lerna 发布,以便他们可以安装该软件包的最新版本并在他们的项目中使用它。

为防止这种情况发生,您可以使用发布脚本来确保您:

  1. 不在叉子上
  2. master
  3. 已提交所有更改
  4. 拥有最新的远程更改
  5. 所有测试通过

这应该可以防止您失去同步,并确保发布的版本是干净的。

$ node scripts/prerelease.js && lerna publish

脚本/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);
    });
于 2019-03-31T18:35:30.893 回答