пятница, 23 июня 2017 г.

NPM auto publish via gulp

В мире JS все как-то несколько криво и не отточено в отличие от Java. Очень хорошо иллюстрирует положение вещей эту картинка
Одна из проблем то что нельзя легко настроить публикацию npm через таску в gulp. Очень долго искал и еле нашел всего в одном месте поэтому публикую решение здесь чтобы распространить решение и не потерять его. Исходное решение - http://blog.entelect.co.za/automatically-publish-to-npm-using-gulp-teamcity, к сожалению исходно решение уже недоступно

Зависимости
npm i npm --save-dev
npm i fs --save-dev

Примерно такие зависимости должны быть установлены
fs@0.0.1-security or file-system@2.2.2
npm@4.1.2

Код
var npm = require('npm');
var fs = require('fs');

gulp.task('npm-publish', function (callback) {
    var uri = ""; //uri to npm, e.g. https://registry.npmjs.org/
    var username = ""; 
    var password = "";
    var email = ""; 
 var dist = ""; //path to dist folder with package.json

    if (!username) {
        var usernameError = new Error("Username is required as an argument --username exampleUsername");
        return callback(usernameError);
    }
    if (!password) {
        var passwordError = new Error("Password is required as an argument --password  examplepassword");
        return callback(passwordError);
    }
    if (!email) {
        var emailError = new Error("Email is required as an argument --email example@email.com");
        return callback(emailError);
    }
    npm.load(null, function (loadError) {
        if (loadError) {
            return callback(loadError);
        }
        var auth = {
            username: username,
            password: password,
            email: email,
            alwaysAuth: true
        };
        var addUserParams = {
            auth: auth
        };
        //adduser and login are the same command
        npm.registry.adduser(uri, addUserParams, function (addUserError, data, raw, res) {
            if (addUserError) {
                return callback(addUserError);
            }
            var metadata = require(dist+"/package.json");
            metadata = JSON.parse(JSON.stringify(metadata));
            npm.commands.pack([dist], function (packError) {
                if (packError) {
                    logout(addUserParams, data.token);
                    return callback(packError);
                }
                var fileName = metadata.name + '-' + metadata.version + '.tgz';
                fileName = fileName.replace("@","").replace("/","-");
                var bodyPath = require.resolve('./' + fileName);
                var body = fs.createReadStream(bodyPath);
                var publishParams = {
                    metadata: metadata,
                    access: 'public',
                    body: body,
                    auth: auth
                };
                npm.registry.publish(uri, publishParams, function (publishError, resp) {
                    if (publishError) {
                        deleteArchive(fileName);
                        logout(addUserParams, data.token);
                        return callback(publishError);
                    }
                    console.log("Publish succesfull: " + JSON.stringify(resp));
                    deleteArchive(fileName);
                    logout(addUserParams, data.token, callback);
                });
            })
        });
    });
    function logout(addUserParams, token, callback) {
        addUserParams.auth.token = token;
        npm.registry.logout(uri, addUserParams, function (logoutError, data, raw, res) {
            if (callback) {
                if (logoutError) {
                    return callback(logoutError);
                }
                return callback();
            }
        });
    }
    function deleteArchive(filePath) {
        gulp.src(filePath).pipe(plugins.rimraf());
    }
});

Комментариев нет:

Отправить комментарий