Javascript 有没有办法检查npm包是否需要发布,然后只进行发布?

Javascript 有没有办法检查npm包是否需要发布,然后只进行发布?,javascript,angular,npm,Javascript,Angular,Npm,我正在创建一个包含多个项目的代码库,每个项目都可以发布 为了创建一个流线型的持续集成过程,我希望我的构建代理运行一个命令来发布所有需要发布的项目。显然,这不起作用,因为如果发布将在以前发布的版本上发布,那么发布将失败,这将导致命令失败,并且所有后续命令都不会执行。大概是这样的: "build-package1": "ng build package1", "publish-package1": "npm publish ./dist/package1", "build-package2": "n

我正在创建一个包含多个项目的代码库,每个项目都可以发布

为了创建一个流线型的持续集成过程,我希望我的构建代理运行一个命令来发布所有需要发布的项目。显然,这不起作用,因为如果发布将在以前发布的版本上发布,那么发布将失败,这将导致命令失败,并且所有后续命令都不会执行。大概是这样的:

"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,然后publish all,而package1的package.json文件中没有版本更改,那么命令将失败,package2将不会发布

在尝试发布之前,是否可以使用命令检查是否需要发布

我看到了这个答案:


理想情况下,我认为在尝试发布之前确定发布是否有效可能会更干净。

可以将npm本地安装到项目中,然后使用命令式npm命令检查最新发布的版本,并在使用命令式npm发布命令之前使用节点文件系统检查本地版本

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));
  });