00:00
那接下来大家可能就会想到,我既然这里已经生成了这样的一个编译的结果,那如果我要是把我的原文件做了修改,现在又要去做编译的时候,那如何生成同样的一个东西吗?那正常来讲的话。如果我们去做前端的编译工作,或者说大家如果用过前端框架的话,或者是大家用这个webpag做过这个前端的编译打包的话,呃,就会知道我们每次其实是应该把之前的清空,然后去重新发布的,对吧?所以说这一部分内容我们也应该把它加进来,好好,那我们这样啊,还是我们就直接打开这个文件去处理吧,Scripts。好,呃,那么我们怎么样去做清空处理呢?肯定是在我们编译之前就得清空,对吧,我们在这里就做一个清空。
01:02
呃呃,我们先把先把这个目录先定义好,Compel的pass。我们还是把当前的目录。拼接上一个我们的生成编译结果的这个目录,Compel的目录,好。呃,那么接下来我们要做的就是用这个FS extra,我们直接去remove remove,这个应该也是同步的,对吧,同步移除compel的。
02:03
Dear pass。好,我们把这一个,把这这一部分内容加进去,那大家可以看到加进这个移除的内容。呃呃,当然这个就是如果我们直接把这个目录删掉的话,之后这不是删里边的内容,是直接把整个目录都删掉了,对吧?所以我们还要再用一个insure Di thinkk,这个是干什么的?就是确保我们这个目录存在,如果不存在的话就新建,所以我们这里就是下面再加一句叫做FS.inure。应该是叫DR还是plus DR是吧?英数DRS。Compared。那这样的话大家可以看到,呃,就是我们已经实现了,就是把在编译每次编译之前,把我们上次的编译结果先清空,然后接下来再去做对应的编译操作,最后再把编译的结果输出到我们的编译目录下面。
03:17
啊,这就是整个的这个流程,当然大家如果细心的话,可以看到上面我们的这一个compel的这个文件夹在下面也用到了,对吧,那我们上面已经定义了之后,我们这里就不用再重复写一遍了,我们这里。呃,这里就可以直接用compel的pass了,对吧。好,呃,这就是我们现在的这个脚本的样子,好,那么我们现在还是来执行一下吧,我们先看一下compel的下面是有这个文件的,对吧?好,我们现在直接去执行我们的脚本script。Compel。
04:08
这编译还是会稍微的有一点花时间啊,大家可以看到,因为我们删掉的那句pencill dialoggue,所以现在就是很简单的这么一句输出对吧,然后我们去看一下现在是不是我们直接到这个目录下面去啊,Compel,然后现在还是有这个文件的,我们看一下它生成的时间。啊,就是刚才对吧,14:36,这个应该就是我们刚刚生成的这个东西,所以呃,大家可以看到,这就是相对来讲比较完整的一个编译流程,就是先要删除清空我们的编译上次编译结果,然后去做编译,编译完了之后把我们的结果再输出到做处理之后,输出到指定的目录下面去,好这是这一部分内容。
05:02
呃,然后呢,大家可以看到啊,就是我们刚才已经看到这个是完全没有问题的,整个都是正常的,那接下来我们还要去说,大家已经看到正常来讲,我们这个编译已经没有任何问题了,对吧?但是还有一些东西,如果作为规范化的自动化脚本的处理的话,我们还没有考虑,比如说如果我们有错误的话,那会怎么样呢?我们先来看一看我们这里的这个。是不是有可能有错误啊,要现在我们是没问题的,那要有错误的话,我们得去改原文件了,看点啊,不是这个。我们是要到contracts下边那看点,So,对吧,好,我们随便改一个地方吧。
06:00
比方说我这里把关键字直接少了一个字符,有可能就是很多同学就是在这个复制的时候,经常就会上前面的那个prama就少一点对吧,有可能是最后面有可能少一点,那这样的话,我们保存退出的时候编译正常来讲肯定是会报错的,对吧。那我们看一下它的报错信息是什么样的,Comp的点JS。诶,大家看这个好像都什么都什么都没输出对吧。是,是我写错了吗?看一下现在有没有编译结果,Compel compel,诶大家看到这个就好像是我把compel的下面的这个。
07:11
里边的这次文件已经删掉了,但是没有生成新的文件,所以说大家看这个过程当中其实是出了问题的,但是好像我们都没有抓到对吧。呃,那我在课件里边给大家举的例子是,就是是我们改一个这个函数的名称,大家可以看一下啊,因为我之前在试别的一些情况的时候,它至少还是有一个错误信息的输出的,只不过是可读性比较差,但这一次大家可以看到这个状况更糟糕一点,我们改了那个constructor constructor的这个名称之后,他连信息都不输出,那我们完全不知道发生了什么事情。好,那我们还是到。Contract里边去把它更改一下,我们先把这个改回来吧。
08:04
呃,我本身给的例子是改一个这个function的这个关键词啊,好,我们看一下script comp点,好我们看一下现在它会有什么样的结果。哦,这个确实很奇怪,我们可能是做了,我们没有打印它的输出结果对吧,所以大家就会发现,我们既然完全没有打赢他的结果的话,他现在一旦要出错,直接就什么都不输出了。啊,那大家其实能想到就是如果你要是什么都不输出的话,这肯定不行,那我即使是前面有那个正常变异的时候,上面有这么大串的输出,那我现在也还是留着它吧,我我把它加回来看一下。这里对吧。我们还是加回那个consult log吧,直观的想法肯定是觉得我们把它consult.log一下,应该他能给我们一点信息,Result好。
09:17
那好大家看,呃,这个多少还是还是有一些这个错误提示的,对吧。它提示到了这个,诶怎么是pass。No sir。我们这个执行的时候,这个得得注意,因为我们默认的这个执行位置应该是在外部。Comp点看一下。
10:01
好,大家可以看到这一次报错了,编译报错对吧?呃,他好像是有一个输出的,然后是给了一个errors,然后说这是一个pass error就是解析的时候出了错,然后说想要这个分号,但是got一个什么什么东西,这个好像其实也就是不是很清晰对吧?因为我们这个错比较简单,所以大家可能看后面这一串的时候,呃,勉勉强强,如果大家知道改了哪里的话,还是能看到它问题出在哪里的,但这个可读性真的是非常的差。那大家就应该想到你正常来讲的话,应该像我们上面这样有一个正常的这个错误信息,然后说你是没有发现文件,还是没有发现目录,对吧,这是系统的这个错误,Throw出来的一个错误,大家可以看看到这是pass这边的一个错误,所以这种模式才是我们常见的一种模式,就上面是错误信息,呃,首先是有这个错误的发生位置,然后下边是错误信息,下面还有调用站,这是我们习惯的这种错误的表达方式,所以我们在这里发现这个编译脚本肯定还是有可以进一步去完善的空间。
11:22
Scripts,好,我们看一下这个东西到底可以用什么方式去处理呢?那大家肯定就可以想象的到,就是既然你那个里边是有这个错误嘛,那如果有错误的时候,我应该把里边的错误直接抛出来,而不是直接。打印我们当时的那个result,因为这个错误肯定是result里边的一部分。我们如果直观的这样去,刚才大家看到如果直观的这样去打印的话,大家可以看到这个errors这里只是一个,这是一个数组,对吧?就它里边的信息,我们能看到的东西很少,其实我们应该完整的把result里面的error抛出来。
12:16
呃,那我们可以在这里去加一步,对吧?我们怎么去做呢?呃,看一下我们这里的这个课件里面的做法啊,就是直接去判断我们的这个result.error有没有,Errors有没有,它本身应该是一个数组,假如它是空的话,那说明我们这一个编译是正常的,没有报错,那我们就不需要去做,就是throw我们的这个错误了,但如果说有这个error,而且它的lengths大家可以看到,就是lengths不为零,对吧?那么接下来我们就要去就是throw一个errorr出来啊,这就是note里边的这个errorr处理啊,所以我们就把它的第一位的这个东西出来,If,我们这里是compelled。
13:09
Result点应该是叫as对吧。Iris。呃,应该是,我们要判断它是不是一个数组,对吧?array.is great。好。而且他的Les。是存在的,不,不为零,那么我们这里就throw一个。A有一个A版出来,那我们要throw的A,其实就是它compel的result。
14:07
点errors里,Errors里边的第一个元素,我们把它落出来就可以了,我们看一下这个error,这个没有大写吧,啊,就是小写的对吧,所以我们直接把它throw出来,现在我们看一下这样的一个状态是什么样的,然后我又开了这个中文啊。好,我们现在看一下编译结果是什么样子了。然后大家可以看到现在这个就是我们大家好像比较熟悉的一种输出的结果了,对吧?啊,前面这个是我们那个pencil dilog打印出来的结果,大家看非常的简单,什么东西都没有,那后边呢,就是真正我们抛出的这个aron,大家可以看到已经报出来,这是sock在执行的时候报的一个错,然后下面它执行的这个函数体都列在了这里,然后下面是描述,Reference error compared result is not DeFine not DeFine。
15:10
好吧。看一下刚才我们这个定义的好像有问题啊。哦,是comp result啊,写错了啊,我们本来是想看这个真正的编译信息的结果。有错误提示,确实是好,我们直接就可以定位它到底出了什么问题,应该没有别的了吧,再来编译一下看看。哎,这个位置没有抛出来的。我们的那个error,诶是这个写的。
16:00
哦,如果他的LS,所以就没有抛是吧?对大家看的很细啊A,好,我们再来执新一下。大家看现在的这个报错信息就非常的详细了,对吧,同样上面是我们前面那个输出的那个结果,这个非常的简短。看不清楚,然后下面这是我们的出错的位置,大家看A的这个信息是pass error,然后当然了它同样也是expect一个分号,但是got了一个一个括号,那具体是什么原因?呃,哪个位置呢?大家可以看到它指示的是这个位置啊。指示的是这个位置,但事实上我们知道就是是前面这个方式这里,但是这是编译器的问题,它可能没有把这个准确定位定位好,但是我们至少已经可以看得出来,就是这一句的毛病,对吧,然后下面的内容呢,这就是调用站,这是大家非常熟悉的这种这种方式了,好,那么大家如果要是觉得。
17:10
觉得这个一一次的这个更改可能还不太不太确定它是不是好使的话,我们再更改那个前面那个地方啊,我们把constructor这个改一下。好,再试一下。嗯,好。呃,我们看到这里它同样报了一个pass error,然后呃,他只是是指到这里,因为他会认为这个函数本身这里是有定义有问题的,对吧?所以constructor这里出了问题,大家可以看到这个就非常的详细了,呃,当然我们如果哦又点了一下啊,如果我们已经有了这样的一个抛出错误的话,现在我们的这个consolo就真正可以删掉了,对吧?那我们平常编译正常的结果我们也保存了,编译错误也抛出了,那这个pencilllo就完全没有必要了,我们把它删掉,好,那大家可以看到现在这个我们的脚本其实才是一个比较完善的一个编译脚本。
18:17
这里边包括了什么呢?大家看一下最终版的这个编译脚本啊,包括了,呃,我们是想编译之后要把东西要存储起来的,所以我们一开始的做法是一个cleanup,就是先把它清掉。之后就是我们正常的这个编译啊,这里这个回车位置打错了啊。呃,大家大家看课件的时候是不是也是错的,那如果是错,大家小心一点,这这一行啊,就是我们前面这是注释,这是开始编译,这个编译大家都很熟悉了,就是把文件读出来,然后用sock.compel去把它编译出来,那注意编译出来的错误我们要做一个处理,我们去把它throw出来。然后之后呢,要把它存到我们的文件系统里面去,所以我们会用到就是便利一下我们这里的所有的文件名,然后把它生成对应的文件名,就是我们的name.jason生成一个Jason文件。
19:17
然后把我们编译出来的真正的那个对象放到Jason文件里面去,啊,这就是我们整个这个流程。好,那大家现在就把它完整的实现一下,然后我们自己跑一跑这个编译脚本,大家可以看看,呃,就是我们有了这个编译脚本之后,再去做这个编译和输出的这个提取就非常的容易了,对吧?之后我们直接在这里把原文件放到这个contracts下面啊,当然大家会发现我们这里还有一个地方有问题,就是这里是hard code,对吧。编译,每次编译的时候就是编译这个文件名,所以大家可以想到这个也是有改进空间的,我们似乎不应该指定只编译这个东西,像现在这个的话,那我们每次要编译不同的脚本的时候,其实是得改这个文件名的啊,所以大家知道这一点就可以。
我来说两句