Есть ли способ проверить, нуждается ли публикация в пакете npm, и только тогда делать публикацию? - PullRequest
0 голосов
/ 30 октября 2019

Я создаю единую базу кода, содержащую несколько проектов, и каждый проект может быть опубликован.

Чтобы создать оптимизированный процесс непрерывной интеграции, я хочу, чтобы мой агент сборки выполнил одну команду, которая публикует все необходимые проекты. будут опубликованы. Очевидно, что это не работает, потому что публикация завершается неудачно, если она будет опубликована поверх ранее опубликованной версии, и это приводит к сбою команды, а все последующие команды не выполняются. Примерно так:

"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

В идеале, хотя я думаю, что публикация будет работать, прежде чем пытаться сделать это, возможно, будет чище.

1 Ответ

0 голосов
/ 30 октября 2019

Можно установить 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));
  });

надеюсь, что это поможет кому-то в будущем - возможно, мне снова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...