00:00
欢迎大家继续观看上硅谷格斗技术视频,这节课我们继续讲解格斗中的依赖冲突及其解决方案。首先我们看一下什么是依赖冲突。所谓依赖冲突,是指的在编译过程中,如果存在某个依赖的多个版本,那构建系统到底是采用哪个版本的依赖进行构建的问题。比如这里有一个product a,它依赖了product b和product c,而product b它依赖了1.4.2版本的log破解,Product c它依赖到2.2.4这个版本的log破解。在项目的编译阶段,B和C它分别依赖不同的版本的log附近其实是没有问题的。但是在项目的最终打包阶段。啊,只能有一个版本的logo,佛街被打到最终的架包或者外包中,这时候就会有冲突了,那grid是怎么解决这种问题的呢?来,我们看一下grid默认的解决方案,首先我们这里引入一个har的call。这样一个依赖。
01:01
然后我们在这里做一个刷新,让他下载这个依赖。这时候har car已经被下载下来了,你会发现harber car这个依赖,它在又依赖了。一个沙拉佛街,这个沙拉佛街是1.6.1这个版本的。那如果此时我并不知道,或者说我并没有注意到,我又自己手动了引入了一个另一个版本的沙拉佛街,比如说我这里引入的是1.4.0这个版本的沙拉破金。这样他就会和har car所依赖的。1.6.1版本的沙拉佛金有冲突了。那idle默认是怎么解决这种依赖的冲突的?我们来看一下。你会发现grid采用的是新版本的。啊,1.6.1版本的沙拉佛经,包括咱们自己引入的1.4.0版本的log佛街,啊沙拉佛街,它也被改成了1.6.1版本。OK啊,也就是说C它默认采用的是啊,新版本的加班。
02:03
因为格斗认为新版本的家包一般都是向下兼容的。所以这也是咱们在实际开发中解决加班冲突的一种解决方案。咱们建议大家采用grid默认的这种方式就可以了。当然。ID也为我们提供了一系列其他的依赖冲突的解决方法。比如。我们可以通过rude排除一个依赖也可以啊。不允许依赖进行传递,也可以强制使用某个版本号。来,咱们也给大家看一下。比如说,我们可以通过lude排除某个依赖。然后在这里来一个小括号,然后这来一个小括号,然后这来一个。B包。如果我要想排除某个指令的依赖的话。我只需要通过rude,然后通过域名参数的方式给map传值就可以了。
03:01
比如说,我想排除har car所依赖的。这个沙拉佛街的时候,那你就可以啊,指定通过指定它的组名的方式。组名,咱们这里应该是org点。沙拉佛机就这个。OK啊,来。这样咱们就把哈布林克所依赖的这个沙拉破街给他排除了,来,我们刷新你再看。刷新之后,此时你会发现啊。版本号换成了咱们自己引入的1.4.0这个版本了啊,如果我们想使用的话,我们必须自己再手动引入一下,同时哈勃的克所依赖的那个沙拉佛间已经被排除了。没有问题。当然咱们在排除过程中,除了可以啊,通过组名的方式进行排除,我们也可以啊,通过模块名的方式来,通过模块名就是这里换成。或者说通过name值的方式换成model,注意,它和咱们引入依赖的那个name本质是一样的,只不过它这里不叫name,它这里叫model。
04:09
来通过这个依赖的名字,这样也是可以的,此时我们刷新,你会发现它和刚才的效果是一样的。没有问题。当然,你也可以采用这两者结合的方式。就是通过组名和模块名。结合的方式来确定一下。OK啊,来我们刷新。你会发现这种方式也是可以的。这是解决价班冲突的第二种解决方案,就是通过rude关键字来排除某个版本的依赖。啊,排除之后,如果我们还想使用其他版本的对应加包的依赖,我们需要手动引入一下。还有第三种解决方案就是啊,不允许进行依赖传递。
05:01
这个。说白了就是在这里。我不让harberin car支持这种依赖的传递,比如原来它是支持的,我现在给他设置一下。设置transit,把它设置为啊,False,此时我们在这里刷新。你会发现har cos所依赖的其他驾宝就不再进行传递了。啊。OK啊,这样咱们需要什么加班的时候自己在这里引路就可以了,当然啊,咱们不建议使用这种方式。这是解决下班冲突的第三种解决方案。还有第四种解决方案,就是咱们强制使用某个固定的版本。比如。我现在就想使用1.4.0这个版本的。那你可以这样整。来,我们给它做一个还原,原来是这样的。
06:01
刷新。他默雷采用的是1.6.1新版本的。那如果我现在就想强制使用1.4.0这个新版本的,我可以加两个感叹号,两个感叹号就是强制使用这个版本。诶,你会发现这时候沙拉佛就变成1.4.0了,这里啊也变成1.4.0了。这就是啊,强制使用某个版本号。当然,强制使用某个版本号,除了这种写法之外,还有一种写法。来就是这种。咱们在B包里边儿给他提供一个version。然后通过strictly。强制啊,使用某个版本号。啊,这种方式跟刚才那种两个感叹号的方式本质是一样的,都是强制使用1.4.0这个版本的。就是在版本这里通过一个strictly,然后指定具体的一个版本。让他强制使用某个版本的依赖。
07:02
这是解决加班冲突的第四种解决方案。总之咱们这里一共有四种解决方案。咱们还是建议。就是idle默认采用的使用新版本的那种加班的方式就可以了。当然最后咱们这里也给大家拓展了一个,如果我们想查看一下。我们项目里边到底有哪些价包冲突了,诶你可以通过这种方式。来复制。然后我们把这个给它去掉。如果我们不配置这个的话,GLE它默认采用的是新版本的,他也不会报错。啊,那如果我们想遇到加班冲突的时候,让他报错,你就把这个配上就可以了。嗯,来,此时我们再来刷新。
08:00
你会发现在项目构建过程中啊,他就或者说你执行这些。这个grid build指令的时候,它就会报错,它就会提示conflicts就是冲突了,加班冲突是1.4.0和1.6.1,这两个版本冲突了,哪个价包呢?是沙拉佛街这个包包。OK啊,这是这个,然后我们再给大家拓展一个。就是有的时候大家看其他文档的时候也会发现,有的时候咱们在引入一个加班的时候,有可能他这里写的不是具体的版本,写的是一个加。加号其实就表示啊,采用的是最新版本的,此时我们再来看。刷新。你看这时候它既不是采用的1.4.0的,也不是采用的哈林的car所依赖的1.6.1的,而是采用啊。2.0这个版本的这个版本实际上就是啊麦中心仓库最新版本。
09:02
你说他怎么得到这个最新版本,是哪个版本呢?哎,他实际上会便利这里所有的仓库。当然,咱们这里目前只有一个,如果我们这里还有其他仓库,它会便利所有的仓库,然后从所有仓库里边找到那个最新版本的沙拉佛金,然后使用最新版本的。加号就表示最新版本的,这个最新版本的你也可以把这个加号换成latest的点。Integration。来刷新,这样也是可以的。我们来看一下,这是latest这样写。刷新。没有问题。无论是写成加号,还是写成latest integration,这都称之为动态版本声明。
10:00
咱们一般都不建议使用。不建议这么用。因为。这个版本号它是变动的。如果你的项目在啊。项目开发阶段,可能你这样写,它那个版本号有可能是1.6.0的。他这个项目是能运行的,可是等你项目开发好了之后,有可能。在这些仓库里边,最新版本已经变成了3.s版本了,那有可能这个价包和你的项目其他价包就会产生冲突。就导致你的项目运行不起来。所以咱们也在实际开发中不建议。啊,这种动态版本声明,而建议大家把版本号给他写死。或者说采用格斗。默认的这种。版本架包冲突的这种解决方案,使用新版本的架包就可以了。这是中的依赖冲突以及对应的解决方案。
我来说两句