[英]npm publish and git repo workflow
我在為npm repo publish和git工作流程設置工作流方面有些掙扎。 我已經實現了以下解決方案,但對此我並不滿意。
開發人員->准備推送到git-> npm版本(我有一個腳本用changelog更新README.md –使用不支持changelog的sinopia)->提交並推送->接受並合並- -> git ci管道->構建,測試並發布到npm repo。
我的意思是,如果開發人員忘記對倉庫進行版本控制,那么管道就會失敗。 我可能可以在git管道中創建一個暫存區域,該暫存區域將包含更新的自述文件和版本庫,作為git CI的一部分。 但這有幾個原因,這是不對的。 主要是我不想通過動態更改源文件來污染GIT。
因此,總結一下。 有沒有更好的辦法? 理想情況下,當更改准備好可以在GIT中接受時,我想對存儲庫進行版本控制。 但我不確定如何。 順便說一句,我們正在使用gitlab。
您可以使用pre-commit掛鈎自動更新文件的版本(假設文件為package.json
)。
pre-commit掛鈎將在提交更改之前執行,因此您可以通過shell腳本獲取當前版本,然后使用增量版本替換當前版本。 然后git commit還將使用新版本提交package.json
。
假設package.json
文件的格式如下(版本位於第三行):
{
"name": "Hello World",
"version": 0.0.1,
版本格式為major.minor.patch
。 次要版本和修補程序版本的最大值是9(您可以指定其他值)。 shell腳本自動增加版本號如下:
#!/bin/sh
if [ -n "$(git status --porcelain)" ]; then
echo "there has uncommited changes";
else
{
echo "no changes to commit!";
exit
}
fi
line=$(sed '3!d' package.json)
IFS=: read -r var1 var2 <<< "$line"
v=$(echo "$var2" | tr -d '"')
version=$(echo "$v" | tr -d ',')
IFS=. read -r major minor patch <<< "$version"
if [ $patch != 9 ]
then
patch=$((patch+1))
elif [ $minor != 9 ]
then
{
minor=$((minor+1))
patch=0
}
else
{
major=$((major+1))
minor=0
patch=0
}
fi
newversion=$major"."$minor"."$patch
echo "The new version is $newversion"
placestr=$(echo $var1: \"$newversion\",)
sed -i "s/${line}/${placestr}/" package.json
git add package.json
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');
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.