与Lerna一起发展

时间:2018-10-26 07:17:15

标签: reactjs lerna

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

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

这给我们所有人带来了麻烦,因为我们没有与软件包版本同步,并且lerna在未更新的软件包中找到了人没有更新的更改,并强迫它们发布(未更改的)软件包。 您是否有一些技巧在尚未发布到npm的地方使用Lerna软件包“进行中”? 现在,我们使用命令从本地文件安装它:

  

npm install-保存文件:path_to_npm_package

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

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

1 个答案:

答案 0 :(得分:1)

  

有时会发生某人没有将更改推送到master分支,而他们会进行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);
    });