在monorepo的package.json上配置存储库字段

时间:2018-10-22 04:41:44

标签: node.js git shell yarnpkg lerna

情况

我有一个lerna创建的monorepo,包含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,它将只有一个github url,但是我看到babel有142个软件包,其中每个软件包在repository中都有一个自定义package.json字段。

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

我希望他们不要为142个软件包手动设置此值。我的40个小包裹也一样。

我知道我在撰写此问题时可以在3-4分钟内手动设置它们。但是,当我尝试在150包monorepo或以后使用相同的方法时,这将变得不知所措。

问题

如何在不手动打开40个软件包的每个package.json文件的情况下设置/更新存储库字段?

我尝试过的

手动设置每个值,但是考虑到我是程序员,事情很快就变得无聊和重复。然后我用谷歌搜索了大约一个小时的解决方案。最后,我编写了以下脚本,

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

有一种简单的方法可以解决这个问题吗?使用任何类型的shellgityarnnpm命令吗?

0 个答案:

没有答案