Настройте поле хранилища на package.json на monorepo - PullRequest
0 голосов
/ 22 октября 2018

Ситуация

У меня есть монорепо, созданное с lerna с 40-50 проектами.Каждый из них имеет package.json, как это.

{
  "name": "@base-repo/add-class-methods",
  "version": "1.0.0",
  "main": "index.js",
  "license": "MIT"
}

Структура папок выглядит следующим образом:

packages
├── absolute-url
│   ├── index.js
│   └── package.json
├── add-class-methods
│   ├── index.js
│   └── package.json
├── check-set-relative
│   ├── index.js
│   └── package.json
├── crypto
│   ├── index.js
│   └── package.json

Если я нажму на github, у него будет один URL-адрес github, однакоЯ видел, что babel имеет 142 пакета, в каждом из которых есть пользовательское поле repository в package.json.

"repository": "https://github.com/babel/babel/tree/master/packages/babel-types"

Я надеюсь, что они не устанавливают это значение вручную для 142 пакетов.То же самое с моими 40 маленькими пакетами.

Я понимаю, что могу вручную установить их за 3-4 минуты к тому времени, когда я пишу этот вопрос.Однако это может привести к перегрузке, когда я попытаюсь сделать то же самое с монорепо-пакетом 150 или в будущем.

Проблема

Как установить / обновить поле репозитория, не открывая каждый файл package.jsonвручную на 40 упаковок?

То, что я пробовал

Вручную установите каждый из них по возможности, но все быстро стало скучно и повторяется, учитывая, что я программист.Затем я погуглил решение в течение часа.Наконец я написал следующий скрипт:

const glob = require('glob');
const fs = require('fs');
const path = require('path');

const gitUrl = 'https://github.com/user';
const author = `Mr. Github User <user@example.com> (${gitUrl})`;
const basePath = '/utility-scripts/tree/master';
const baseRepo = gitUrl + basePath;

glob('packages/*/package.json', (err, files) => {
  for (const filePath of files) {
    const [parent, pkg] = filePath.split('/');
    const newData = {
      author,
      license: 'MIT',
      repository: `${baseRepo}/${parent}/${pkg}`,
    };
    const data = Object.assign(
      {},
      JSON.parse(fs.readFileSync(path.resolve(filePath), 'utf-8')),
      newData,
    );
    fs.writeFileSync(path.resolve(filePath), JSON.stringify(data, true, 2));
  }
});

Есть ли простой способ справиться с этим?С любой командой shell, git, yarn или npm?

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