我正在创建一个包含多个项目的代码库,并且每个项目都可以发布。
要创建精简的连续集成过程,我希望构建代理运行一个命令来发布所有需要发布的项目。显然,这是行不通的,因为如果发布会在先前发布的版本上进行发布,则发布会失败,这将导致命令失败,并且随后的所有命令都不会执行。像这样:
"build-package1": "ng build package1",
"publish-package1": "npm publish ./dist/package1",
"build-package2": "ng build package2",
"publish-package2": "npm publish ./dist/package2",
"build-all": "npm run build-package1 && npm run build-package2",
"publish-all": "npm run publish-package1 && npm run publish-package2"
因此,在这种情况下,如果我运行build-all,然后发布全部,而package1的package.json文件中没有版本更改,则该命令将失败并且package2将不会发布。
有没有我可以执行的命令,可以在尝试发布之前检查是否需要发布?
理想情况下,尽管我认为在尝试进行发布之前先确定发布是否可行,
答案 0 :(得分:0)
可以在本地将npm安装到项目中,然后使用命令式npm命令检查最新发布的版本,并使用节点文件系统检查命令中的本地版本,然后使用命令式npm publish命令
import * as fs from 'fs';
import * as npm from 'npm';
function getLocalPackageData(path): Promise<IPackageData> {
return new Promise((resolve, reject) => {
fs.readFile(path + '/package.json', (err, data) => {
if (err) reject(err);
const pData = JSON.parse(data as unknown as string);
resolve({ version: pData.version, name: pData.name });
});
});
}
function getPublishedPackageData(packageName: string) {
npm.commands.show([packageName], function (err, result) {
if (err) reject(err);
const latestVersion = Object.keys(result)[0];
resolve({ version: latestVersion, name: result[latestVersion].name });
});
}
function needsPublish(latestPackageSegments: IPackageVersionSegments, localPackageSegments: IPackageVersionSegments): boolean {
const majorGreater = localPackageSegments.major > latestPackageSegments.major;
const majorEqual = localPackageSegments.major === latestPackageSegments.major;
const minorGreater = localPackageSegments.minor > latestPackageSegments.minor;
const minorEqual = localPackageSegments.minor === latestPackageSegments.minor;
const bugFixGreater = localPackageSegments.bug > latestPackageSegments.bug;
return majorGreater ||
(majorEqual && (minorGreater || bugFixGreater)) ||
(majorEqual && minorEqual && bugFixGreater);
}
您可以从那里检查发布的本地内容并执行以下操作:
npm.commands.publish(projectPathsToUpdate, (error, res) => {
if (error) {
throw error;
}
console.log('================= published: =================');
packagesToUpdate.forEach(p => console.log(p.name + ' updated to ' + p.version));
});
希望这对以后的某个人有帮助-可能对我有帮助。