簡體   English   中英

有沒有辦法檢查 npm package 是否需要發布,然后只發布?

[英]Is there a way to check if an npm package needs a publish and only do a publish then?

我正在創建一個包含多個項目的單一代碼庫,並且每個項目都可以發布。

為了創建一個簡化的持續集成過程,我希望我的構建代理運行一個命令來發布所有需要發布的項目。 顯然,這不起作用,因為如果發布將在先前發布的版本上發布,則發布失敗,這會導致命令失敗並且所有后續命令都不會執行。 像這樣的東西:

"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 將不會發布。

有沒有我可以執行的命令在嘗試發布之前檢查是否需要發布?

我已經看到了這個答案: https://askubuntu.com/questions/334994/which-one-is-better-using-or-to-execute-multiple-commands-in-one-line/539293#539293

理想情況下,盡管我認為在嘗試發布之前確定發布是否可行可能會更干凈。

可以將 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));
  });

希望這對將來的某人有所幫助-可能又是我。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM