我在为npm repo发布和git工作流设置工作流程时遇到了一些困难。我已经实现了如下解决方案,我对此不满意。
开发者 - >准备推送到git - > npm版本(我有一个用更新日志更新README.md的脚本 - 使用不支持更改日志的sinopia) - >提交和推送 - >接受并合并 - > git ci pipeline - >构建,测试并发布到npm repo。
我所知道的是,如果开发人员忘记对repo进行版本控制,那么管道就会失败。我可以在我的git管道中创建一个临时区域,它将包含更新的README并将repo版本作为git CI的一部分。但由于几个原因,这感觉不对。主要是我宁愿不通过动态更改源文件来污染GIT。
所以,总结一下。有没有更好的办法?理想情况下,我希望在GIT中接受更改时对版本进行版本控制。但我不确定如何。顺便说一句,我们正在使用gitlab。
答案 0 :(得分:0)
const fs = require('fs');
const path = require('path');
let execSync = require('child_process').execSync;
let streamToString = (stream, callback) => {
let str = '';
stream.on('data', function(chunk) {
str += chunk;
});
stream.on('end', function() {
callback(str);
});
};
const run = cmd => {
return execSync(cmd, function(error, stdout) {
streamToString(stdout, (data) => {
console.log('Data ---- ', data);
return data;
});
});
};
const packagejson = fs.readFileSync(
path.join(__dirname, '..', 'package.json'), 'utf8');
run("cp package.json package.json.bkp");
const json = JSON.parse(packagejson);
// Update package.json
let semver = json.version.split('.');
semver[2] = Number(semver[2]) + 1;
let replacer = /,/gi;
json.version = semver.toString().replace(replacer, '.');
let changelog = {};
changelog.version = json.version;
changelog.author = run('npm config get init.author.name');
fs.writeFileSync(path.join(__dirname, '..', 'package.json'), JSON.stringify(json, null, 2));
if (changelog.author.byteLength <= 1) {
throw Error('init.author.name is a required npm configuration attribute......');
}
run('cp README.md README.bkp');
const readme = fs.readFileSync(
path.join(__dirname, '..', 'README.md'), 'utf8');
let header = readme.split('-----------');
console.log('Header ......... ', header);
fs.writeFileSync(
path.join(__dirname, '..', 'README.md'), header[0] + '-----------' +
'\r\nVersion ' + changelog.version + '\r\n' + 'Changed By ' + changelog.author + '\r\n' +
'Change Date ' + new Date(), 'utf8'
);
run('git add package.json');
run('git add README.md');