美文网首页
(转载)lerna 学习

(转载)lerna 学习

作者: 7b7d23d16ab5 | 来源:发表于2020-04-27 15:28 被阅读0次

    lerna学习(二)

    安装

        lerna的安装类似于webpack,需要全局安装作为一个命令来使用,可以选择使用npx直接使用,不过为了方便,还是全局安装方便一些。
    
    
    yarn global add lerna
    
    

    初始化

    mkdir myLerna
    cd myLerna
    lerna init --independent
    
    
        lerna的初始化分为fix模式以及independent模式两种,默认是fix模式,或者叫做锁定模式,项目内所有的package共用版本号。不过我认为这种情况其实很少,大部分人应该都是使用独立模式,每个package拥有自己的版本号。
    
    

    创建package

    cd packages
    mkdir package-1
    cd package-1
    yarn init -y
    cd ..
    mkdir package-2
    cd package-2
    yarn init -y
    
    
        这里要注意,如果你没有创建任何package,你是不能使用lerna add命令安装依赖包的,因为默认lerna会为每个package安装依赖。
    
    

    安装各种依赖

        在开发之前,肯定是需要先安装各种eslint、prettier、commit-lint等等规范化库的,我们为啥要把一堆package放到一个仓库?其中一个原因不就是为了直接复用一套规范文件么。
    
        所以各种lint文件肯定是安装到项目全局的,这时如果使用lerna的安装命令:
    
    
    lerna add eslint --dev
    
    
        就会发现一个问题,每个package都被单独安装了eslint,这明显是不合适的,既然是同一个项目,安装多次同一个模块算个什么事?
    
        然后我们发现,lerna有提到如果你想只安装一次,那么可以把这些依赖写到每个package的package.json中,然后回到根目录运行:
    
    
    lerna bootstrap --hoist
    
    
         bootstrap是learna一键为所有package安装依赖的命令,如果加上了--hoist参数,那么就是告诉lerna,把所有依赖全部安装到根目录中,然后分别在各自的文件夹中创建软连接指向对应的模块实际路径。
    
        从解决问题的眼光来看,确实解决了重复安装的问题,不过所有模块都装到根目录混杂在一起,这让强迫症心里很不舒服,我们希望的其实是只有lint这些公共库提取出来,其他的他们自己的依赖放到他们自己的文件夹中。
    
        在参考了[Babel](<https://github.com/babel/babel>)仓库的做法后,明白了。因为node自身在查找模块的时候有向父级目录查询的操作,所以其实软连接什么的并不需要,甚至都不需要lerna,我们直接
    
    
    yarn add -D eslint
    
    
        这样便直接将eslint安装到了根目录中,由于层级高,所以子目录都会受到lint规则的约束。同样,为此安装好husky等等基本库,完成仓库的初始化。(可以参考我的另一篇[文章](<https://www.notion.so/aj0k3r/57b80f3f75b741e3a54546c20ae5e8e7>))
    
    

    安装依赖包

        安装依赖包有很多种方式,虽然可以进入对应的文件夹中直接使用yarn安装,不过为了项目统一,还是推荐使用lerna的命令来安装依赖
    
    
    • 给所有package安装某个第三方依赖:

      lerna add module-A
      
      
    • 给package-A安装第三方依赖:

      lerna add module-A packages/package-A
      
      

      ps:这里可以使用正则,比如官方举例的:

      lerna add module-1 packages/prefix-*
      
      
    • package-A依赖package-B:

      lerna add package-B --scope=package-A
      
      
    • 所有package都依赖package-C:

      lerna add package-C
      
      

      PS. lerna处理package互相依赖时采用的是软连接的模式,所以不用担心重复安装的问题。

      快速新建package

            lerna提供了一个命令来快速新建package,避免了重复机械的操作
      
      
      lerna create package-D --dependencie=["package-A","lodash"]
      
      

      这样可以快速新建一个package并且申明他依赖的内部package或者外部包

    值得注意的命令

    • lerna run xxx

        按照官方说法,是为所有的package执行xxx这个script,听起来有点唬人,所以我测试了一下。
      
        首先,这里的命令,不是指根目录的package.json里面的script,lerna根本不会去管根目录里面的script。
      
        当你运行 lerna run xxx时,他会依次遍历每个package目录的package.json,如果有同名的script就执行,没有的就跳过,每个目录对应的xxx script执行的内容也可以完全不一样,互不干扰。
      
      
    • lerna exec — xxx

        与run命令对应的另一个命令就是exec命令,不过不同的是exec命令接受的是bash命令而不是script名称,他会为每个package执行对应的bash操作,不会跳过
      
      

    第二篇结束......

    参考链接:

    相关文章

      网友评论

          本文标题:(转载)lerna 学习

          本文链接:https://www.haomeiwen.com/subject/uyaywhtx.html