Lerna managent libs (Ⅰ)

Create lerna project for Typescript

Posted by lanbery on October 11, 2021

Create multi Library project for Typescript

Development environment

  • System : Window 10 + Msys2(cygwin)
  • node : 14.17.3
  • npm : 7.21.0
  • mocha : 9.1.2
  • lerna : 4.0.0

Preparation Environment

方便命令直接使用,全局安装lerna & mocha

yarn add mocha --global  
yarn add lerna --global

Create Project

mkdir tslibs-lerna-boilerplate && cd tslibs-lerna-boilerplate
git init 
git branch -M main
echo "# Typescript library boilerplate with Lerna" > README.md
echo node_modules > .gitignore

git add README.md .gitignore

lerna operation

创建lerna 项目及子lib

basedir

lerna create <@lanbery>/common-utils utils  
cd packages/common-utils && mkdir src
cd ../../ && touch tsconfig.project.json

配置lerna useWorkspaces

  • 编辑 package.json 增加workspaces ```language { …, “workspaces”: { “packages”: [ “packages/*” // 还可以增加其他目录 ],

    }

}


* 编辑 lerna.json 增加useWorkspaces
```json
{
  "packages": [
    "packages/*"
  ],
  "version": "independent",
  // - "npmClient":true, 此项不能配置,会导致 lerna bootstrap --hoist 不可用,即使使用官网方案也不行,可能是因为 window + cygmin 缘故吧,没弄明白
  "useWorkspaces": true  // + 
}

添加项目开发依赖

lerna add typescript @types/node

编辑项目tsconfig

touch tsconfig.project.json

{
    "compilerOptions": {
        "module": "commonjs",
        "declaration": true,
        "noImplicitAny": false,
        "removeComments": true,
        "noLib": false,
        "emitDecoratorMetadata": true,
        "experimentalDecorators": true,
        "target":"ES6",
        "sourceMap": true,
        "lib": [
            "ES6"
        ],
    },
    "exclude": [
        "node_modules",
    ]
}

touch packages/common-utils/tsconfig.json

{
    "extends": "../../tsconfig.project.json",
    "compilerOptions": {
        "outDir": "lib",
    },
    "include": [
        "src"
    ]
}

编写pkg 源码

cd packages/common-utils
mkdir -p src/valt/isType
touch src/index.ts
touch src/valt/typeExtend.ts
touch src/valt/isType/index.ts

部分源码

// src/valt/isType/index.ts
import { type } from '../typeExtend'

/**
 * null/undefined - nil
 * @param {*} value
 * @param {string} typeName :  [string,number,boolean,function,object,symbol,date,nil]
 * @returns
 *
 */
export const isType = (value, typeName) => {
    return type(value) === typeName
}


// src/index.ts

// valt
export {type as typeXOf } from './valt/typeExtend'
export  {isType} from './valt/isType'

编辑TSC 脚本

编辑 子包 package.json

{
    ...,
    "scripts":{
        ...,
        "build:tsc":"tsc -c tsconfig.json", // + TSC
        "test":"..."
    }
}

运行 lerna run build:tsc

erna success run Ran npm script 'build:tsc' in 1 package in 3.9s:
lerna success - @lanbery/common-utils