1

状況

lerna私は40-50のプロジェクトで作成されたmonorepoを持っています。それぞれ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 にプッシュすると、単一の github url が含まれbabelますが、142 個のパッケージがあり、それぞれrepositorypackage.json.

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

142 個のパッケージに対してこの値を手動で設定していないことを願っています。私の40個の小さなパッケージと同じです。

この質問を書いている時点で、手動で 3 ~ 4 分で設定できることを理解しています。ただし、150パッケージのモノレポで同じことをやろうとすると、または将来的にこれは圧倒されます。

問題

package.json40 個のパッケージの各ファイルを手動で開かずに、リポジトリ フィールドを設定/更新するにはどうすればよいですか?

私が試したこと

可能な限りそれぞれを手動で設定しましたが、私がプログラマーであることを考えると、物事はすぐに退屈になり、繰り返されました. それから私は解決策を約1時間ググった. 最後に、次のスクリプトを書きました。

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

これに対処する簡単な方法はありますか?shellgityarnまたはnpmコマンドの種類は?

4

0 に答える 0