momorepo實踐

monorepo

  1. 什麼是monorepo和multirepo

  2. monorepo有啥優缺點

  3. 基於lerna實踐monorepo

  4. 構建

    • bazel
    • Rollup react
    • Gulp babel
    • MakeFile

Lerna

Lerna is a tool that optimizes the workflow around managing multi-package repositories with git and npm.

常用lerna命令

只介紹一些常用命令。詳細命令請查看lerna的readme文檔

  1. lerna init

    初始化monorepo項目,會新建lerna.json

    //默認是固定模式。
    {
    	"packages":["packages/*"],
    	"version":"0.0.0"
    }
    

    注意:如果想要使用獨立模式。lerna init --independent。則生成的lerna.json中的version字段爲independent而不是0.0.0

  2. lerna version

    發佈工作區中自上次發佈有更改的package。包的版本可以自定義,也可以根據一些條件自動生成。這裏我只介紹根據commit提交信息自動生成package版本,其它可以點擊鏈接查看詳情

    • lerna version --conventional-commits

      按照常規提交規範自動生成package version。

      fix類型提交轉換爲PATCH發行版。feat類型提交轉換爲MINOR發行版。BREAKING CHANGE無論類型如何,提交中的提交都應轉換爲MAJOR發行版。

      提示:不管是獨立還是固定模式,某個包變化。其它package依賴該包在發佈的時候都會更新version。只是兩個模式不同的是major的變化是否統一

      注意: 在commir的footer中以BREAKING CHANGE:開頭就是重大更新

      一般package的格式是major.minor.patch組成。例子:1.0.0

      • 默認模式:固定模式下 Fixed/Locked mode (default)
        • 某個package有重大更新,工作區所有package都會增加一個major版本
      • 獨立模式
    //lerna.json
    {
    	"command":{
        "version":{
       		//lerna version只能在master分支中使用   
          "allowBranch":["master"],
       		//同lerna version -m "chore(release): publish %s"。默認lerna version生成的commit是沒有遵循conventional commit規範的。使用這個可以指定發佈的commitmsg
          "message": "chore(release): publish %s",
          //檢測更改的軟件包時,忽略與glob匹配的文件中的更改
          "ignoreChanges":[
            "*.md",
            "*.txt",
           //一些測試文件、和發佈無關的文件。。。   
          ]
        }
      }  
    }
    
  3. lerna bootstrap

    配合yarn workspace之後,一般使用yarn install代替lerna bootstrap

    // lerna.json
    {
    	"npmClient":"yarn",
    	"useWorkspaces":true
    }
    //根目錄 package.json
    {
    	"workspaces": [
        "packages/*"
      ],
    }
    
  4. lerna exec

    在工作區中運行任意命令,使用--傳遞參數

  5. lerna run

    運行工作區中某個script腳本(只針對具有這個script腳本的包執行),使用--傳遞參數

  6. lerna import

    lerna import path --preserve-commit

    將當前已有的庫添加到工作區裏面。會保留commit信息(包括原始提交人和作者)。不使用--preserve-commit則會導致提交人更改爲當前import的人。

  7. lerna publish

    選擇一個開源許可證

    如果是scope package(@xxx/some-package),則需要在packagepackage.json指定publishConfig.access字段

    //package的package.json文件
    {
    	"publishConfig":{
    		//指定範圍包的訪問權限 不設置public,就付錢升級npm賬號吧。
    		"access":"public",
    		//指定發佈的目錄 可以配合.npmignore
    		"directory":""
    	}
    }
    

    需提前npm login,使用npm whoami判斷是否登錄成功。沒問題使用lerna publish from-package發佈包

Yarn workspace

yarn config list中沒有設置workspaces-experimental則使用以下命令開啓

yarn config set workspaces-experimental true

使用yarn workspace主要是可以將各個package相同的包提升到根目錄中。避免每個package都install一個包。

使用工作區之後,package沒有自己的yarn.lock文件。所有packages共用根目錄的yarn.lock文件

  1. Workspaces in Yarn
  2. WorkSpaces
  3. nohoist in Workspaces

常用命令

  1. 工作區

    1. 給某個package添加包

      • reactreact-dom 作爲 devDependencies 加到 packages/awesome-package/package.json

        yarn workspace awesome-package add react react-dom --dev

    2. 刪除某個package的某個包

      • packages/web-project/package.json 中移除 some-package

        yarn workspace web-project remove some-package --save

    3. 給所有package添加某個包
      yarn workspace add some-package
      lerna add package

    4. 給所有package刪除某個包
      yarn workspace remove some-package

  2. 根目錄

    1. 根目錄添加包

      yarn add some-packeages -W

    2. 根目錄刪除包

      yarn remove some-package -W

lerna配合yarn workspace

  1. 基於lerna和yarn workspace的monorepo工作流

擴展

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章