如何使 npm 包自动发布?

How to make npm packages auto publishing?

我需要使用 TeamCity 组织 NPM 包自动发布。我在一个 git 存储库中有几个 NPM 包。当我推送更改时,我需要检测更改了哪些包,更新它们的版本,使用新版本进行提交和推送并发布新包。有什么工具可以做到这一点吗?

这里是自动发布的代码,你可以在TeamCity中创建任务使用,也可以自己使用。不要忘记 npm 安装所需的包。

const gulp = require('gulp');
const NodeGit = require("nodegit");
const bump = require("gulp-bump");
const semverUtils = require('semver-utils');
const npm = require('npm');
const spork = require('spork');

gulp.task('publish', function (done) {
    const pathToRepo = require("path").resolve("./");
    const args = require('yargs').argv;
    const nextVersion = args.version;

    NodeGit.Repository
        .open(pathToRepo)
        .then(repo => repo.getBranchCommit("master"))

        .then(lastCommit => {
            const repo = lastCommit.repo;
            const sign = NodeGit.Signature.default(repo);

            if (lastCommit.author().email() == sign.email()) {
                console.info('It looks like the last commit was done by CI');
                done();
                process.exit(0)
            }

            const currentVersion = require('./package.json').version;
            const semver = semverUtils.parse(currentVersion);

            if (nextVersion == null) {
                semver.patch++;
            } else {
                semver.patch = nextVersion;
            }

            const version = semverUtils.stringify(semver)

            return gulp.src('./package.json')
                .pipe(bump({ version }))
                .pipe(gulp.dest('./'))
                .on('end', () => {

                    repo
                        .createCommitOnHead(['package.json'], sign, sign, `Update UI lib version to v${version}`)
                        .then(commit => repo.createTag(commit, `v${version}`, ''))
                        .then(() => pushGit())
                        .then(() => console.info('Made commit with changed package.json and made push'), err => console.error(err))
                        .then(() => publishNpm())
                        .then(() => done())
                        .then(() => process.exit(0))
                });
        })
});

function pushGit() {
    console.info('Start commiting to GIT');

    return new Promise((resolve, reject) =>
        spork('git', ['push'], { exit: false })
            .on('exit:code', function (code) {
                if (code === 0) {
                    resolve();
                } else {
                    reject();
                }
            })
    )

}

function publishNpm() {
    console.info('Start publishing to NPM');

    return new Promise((resolve, reject) => {
        npm.load({}, err => {
            err && reject(err);

            npm.publish(err => {
                err && reject(err);
                resolve();
            });
        });
    })
}