同学们打开一个半年前的 note 项目想跑起来,结果 n p m install 就 报错一片。看着满屏的警告和过时的依赖,是不是头都大了?别急,今天教你一个安全又高效的三步升级法。首先是第一步,侦查。在项目根目录运行 n p m outdated 或者亚尔 outdated, 这个命令会帮你列出所有需要更新的依赖,哪些是补丁版本更新,哪些是小版本,哪些又是跨大版本的升级,让你对项目依赖状况一目了然,做到心中有数。接下来第二步试探。先从简单的开始,用 n p m update 命令更新那些补丁和小版本的依赖, 这些通常比较安全。更新完立刻运行项目测试,确保基本功能没问题。如果有多个依赖需要升级,建议按组建功能分组,比如先升级工具类,再升级 e y 组建。每次升级后都要测试, 避免一次性升级太多导致问题难以定位。然后是第三步攻坚。对于像从 webpack 四升级到五 这样的跨大版本核心依赖,千万不能直接更新。这时候一定要去查阅官方的迁移指南,里面会详细说明 breaking changes 和需要调整的配置。最好创建一个专门的特性分支,在隔离环境中进行升级和测试,确认没问题后再合并到主分支,这样即使出问题也不会影响主项目。 记住,依赖升级不是一场好赌,而是一次有序的侦查和推进。保持项目依赖的新鲜度,不仅能获得新特性, 还能减少安全隐患,让开发心情更舒畅。关注我,未来我会拆解更多让项目延年益寿的工程实践,你们平时都是怎么处理老项目依赖问题的?评论区,一起交流经验吧!
粉丝263获赞328

昨天我说了,我要做一个自己的产品啊,然后咱们很多的热心粉丝啊,都说要去参与,要给我免费写服务端,呃,特别感谢啊,我真的是特别感谢,包括很多一些私信的小伙伴, 但是我觉得还是决定自己先用弄 ds 去写,因为这个事情呢,呃,可能不是一天两天对吧?呃,需要一个长时间的投入,所以我也不希望就说去耽误大家的时间,如果说付费的话,我现在付不起,对吧?所以也是非常感谢。哎, 我这个项目呢啊,首先知道一个是将来自己的一个官网啊站点,呃,还有另外一个是自己这个应用的一个站点。呃,那么应用的站点呢?我采用的技术战是这个 nats 就 nuxt 啊,因为他是一个服务端渲染的,对吧?这个 pk 这段的项目我觉得挺适合的,然后再加上艾力美的 ui 啊,就是前端这一块其实就 ok 了,然后服务端的话就用那个路的,可能用会用到 qa 吧啊,加买四口啊,基本上就是这么一个基础站 啊。现在前台部分我已经开始干了,前台应该要不了太久,对我来说可能最比较困难就是服务在内部分啊,再次的谢谢大家,我会努力,哈哈哈。

n m 前端的 lood g s 版本管理工具,它在该大 up 上面已经获得六十七 k 的一个斯达数了。然后我们来看下它的简单使用,比如说我们有多个 load 版本的时候,我们可以通过句子去切换使用我们相应的版本,比如说这里十六和十四的一个切换,它的安装也非常简单,在这里有一个已经安装的脚本,然后我们下载下来 就可以通过去执行这个脚本上进行我们一键安装, 通过这个脚本一键安装成功之后,这里要求我们去重新打开我们的终端,重开终端之后,我们可以通过 nv 杠 m 去查看我们相应的一个安装版本, 然后我们来通过 nvm 去安装一个 low 版本吧,比如说我们去安装幺六点幺五点一这个版本,我们可以通过 install 直接进行安装,这里可以看到我们当前的版本就安装好了,然后我们来看 看一下我们当前的漏斗,然后是 npm 版本。再者我们也可以去安装一下其他的版本,比如说我们安装一个一二点一八的三版本,执行这个命令去安装指定版本的时候,他会默认切换到当前版本,比如说我们这个时候再去看一下,我现在就是一二点一八这个版本,如果说我们要切换到之前使用的 一六的那个版本,我们可以使用这条命令,这是他的一个简写。那我们这时候再来看一下我们相应的一个录的版本, 这时候就是我们之前的一个版本了,整体来说还是比较简单的,通过 install 去实现我们的一个版本安装以及我们用的去切换相应的版本,如果说想要去卸载某一个版本的话,我们可以通过 on install 整体,比如说我们去卸载一二这个版本, 这里就会看到他成功卸载完了。我们也可以通过 ls 去查看我们当前安装的哪些版本,可以看到 mm 工具就可以实现我们的 gs 版本关闭了。现在我们项目有些环境需要我们低版本或者和高版本的话,我们可以随意的进行切换了。

好,今天来讲一下使用 type script 从零开始实现自己的 open file, 也就是一个简单的 ai agent, 我 们会慢慢实现,过程中从简单到难,就一步一步地去了解它的底层的一个原理。呃,首先呢,我们 起个名字吧,叫强可露,然后进入数值化这个项目,用编辑器打开它。 好, 先先改一下,我们是用 type c 来写的话, 然后这边改一下 model start, 我 们创建一个音 v 文件,然后 创建一个 index 点 t s 文件。 好,其实它底层第一步肯定是需要去请求一个大模型的 a p i 的, 我们就使用这个 open open ai 的 一个接口, 可以打开这个这个 n p m 的 这个 open ai 这边的一个包,我们根据它的规范先安装一下,装一下,然后 其实我们就使用 这个这个 s d k 就 可以了。它的 api 其实大家也可以去看一下,就是其实也是一个 h t p 的 一个接口,这个这次我就先不详细看,反正先把这个代码复制过来吧。 嗯,它这个有 type script script 的 一个报错,我们把这个 node 的 这个 type 的 依赖装一下先。 好,它是从音频中读取了一个 k, 其实我们,嗯,我们因为我这边大模型是用的智普的,所以说我这边还还需要去改一个 url, 对这个,然后其实就会有两个,一个 k, 一个 l l, 如果说你是用的那个 open ai 的 这个 k, 那 其实就改个 k 就 好了,我们在这个音频的环境变量中去, 我这边是已经搞好了这个 k, 到时候我录完视频之后会删掉,所以说这边也无所谓,不过你们就是要注意这个 k 就是 不能,不能泄露出去,这个 k 的 话,其实我是在 智普的这边,我我我有购买一个 callinplay, 所以 说我这边这边点这个添加新的 api, k 也可以添加。我这边是已经添加了这次测试的 k, 这边复制一下就可以了。 然后,嗯,可以看他到智普的一个文档,其实他是说是与这个 open ai 的 api 兼容的,比如说我们直接用它的个这边的这个 sdk 就 可以了, 不过它这边文档只有一个 python 的 一个版本,不过没有关系。嗯,弄个 js 版本,我们直接看它这边的文档就可以了。好,回到这边,然后我们这边要修改一下这边的 开始 是吧?对,要加载这个音频的文件, 我们现在可以去先修改一下这个 system, 告诉他用 i have four assistant。 要 用中文吧,英文不太好。你的名字是 讲课喽,然后你是一个 have for ai ai agent, 然后这行就不要了,我们先 content, 这边先 cd。 你 好啊,来测试一下。对,这个就很简单,就是说我们就直接开始就调了一下它的这个黑片的接口,这边它的这个质补的模型是应该是这样没有补是吧? 看一下啊,它这边的模型对,应该是这个最新的一个模型。好,我们这个也是已经,我们测试一下。 你好,我是江可乐,很高兴见到你,请问有什么需要帮助的吗?可以看到其实大冒险的接口已经去 请求成功了。那我们现在第一步的话就是需要把这个 content 需要通过那个命令行去输入,就是接收它。那现在 ai 这么方便,我们就用 code code 来帮我们,帮我们去实现它,不过我们先先那个啥呢? 先 get, 先抽象了一下 get, 然后在这边。嗯,把那个 model 设 给它挪一下,然后 好抽象一下。我们现在让让他先提出第一个曲指,就是这边文本 x 这边, 然后十七和十二号,十二号 改为改为让用户输入 修改完成。它是挺,我们直接看看它的代码,它是添加了一个 middle line, middle line user input, 几乎里面的问题。 user input, 然后最后 closed, 好, 测试一下。 你好, 没问题。这个,这个第一步已经可以了,是吧?嗯,很高兴为您服务。请问有什么可以帮助的问题的吗?然后我们先做一个简单的提交吧。 嗯, it 啊,我们 我们这个信息延短一点, 先提交一下 它是输入了什么 get commit and error input。 不 行不行不行, 这个 commit 信息就只能 只能一行,不要有什么 其他的作者信息。 get commit and and user input。 好 好好,简单一点。 下一步我们就是现在的问题,就是说他,他这边就是说我们问了一个问题之后,他直接就 回答了一个问题,然后也就把这个命令给关闭了。但是我们是需要有一个循环,就是说一直不停的去问他问题嘛,对吧?那我们其实是需要一个 well 处的一个东西的。 嗯,我需要需要一个循环不断的, 然后再回答, 看一下它是怎么改的。 我要处用 the input, 用 the input 简说明了问题啊,它,它加了一行,那如果是退出的话,它就直接退出了,没问题。这个用 the input 我 们试试哈。 你好, a p u 有 点慢,一加一等于几? 再加一,这个时候它应该是没有上下文的,所以说这一步应该它回答不出来 看, 为什么呢?这个是我们下一步就需要解决的,我们现在先退出测试一下,没问题。嗯,再给它 command 一下,就是说我们看一下它这次的改动,其实也不大 at 好, 然后我们告诉他问题啊,就是说这个 u v input 是 呃循环中缺缺少上下文,让它解决一下 u v input 在 循 缺少上下文解决一下。 它应该是会创建一个数组,然后不停的推送进去 messages message 输出, 嗯,看一下它的改动啊,它是这边开始出事化了一个 message 的 一个输出,然后 这个是我们的那个 system 的 一个 promote 这个词,然后请觉得一开始的话会把这个每一次的这个 u 的 input 都 嗯输入到这个数字中,然后这边请求的话就是把这个,它这个是支持这个这样的写法。对, 它的接口是本来就支持传送这个 message 这么一个子段没什么问题,然后等到它的一个返回,返回的结果之后,它会把这个结果也 这个结果是个 string, 对 吧?对,也推推进这个数组,意思是就是说每次循环都会带上历史所有的 对话的一个消息。嗯,这个其实就是目前的一个带上下文的这么的一个解决方案。其实 color code, 或者说是 open color 其实底层都是这么来去做的。对,就是说,嗯,你如果说对话的越来越多,那你每次请求的那个 token 也会越来越快,因为他每次的 token 请求都会把所有的上下文信息,就是说你所有的历史记录的对话的一些消息都带上发给达摩型,因为达摩型其实是一个 可以把它看成是一个纯函数,就是说他并没有上下文的,所以说这个上下文是你每次请求都要提交过去的,我们现在测试一下 知识而已。 一加一等于几? 再加一。嗯, 可以看到它已经记,就是说有了上下文了,结果也正确了。那我们下一步呢,就是需要 ai engine, 肯定是可以去执行 就是一些命令的嘛,这个是肯定的,就比如说我现在要问他,我要我要列出就帮我列出 当前目录的文件,他肯定是不会帮你去执行这个命令的,因为这个 ai 帧呢,还没有这么个功能,是需要我们下一步去做的。他应该是现在只会给你返回一个,你可以输入某个操作, 是吧?就这么个意思,我先退出吧。嗯,看一下这次的改动啊,也不大 at。 那 我们下一步呢,就是需要去 让他可以执行命令。我问一下他吧,我想要添加 执行命令的功能,请帮我修改 script 这个词,我需要,需要做到 让大模型返回两种确定的返回吧, 第一个就是,嗯,我们就比如说是 amend 冒号开头表示执行某个 bash 命令。第二个是 t s t。 嗯,这是返回的结果。 看一下啊, 它自动给你把这个逻辑加上了 code, code 还是很厉害的。 看一下它的那个提示词是怎么怎么加的。英文,你可以去执行 bash, command and return results to users you must respond in one of these two from it。 或者你说你必须以里底下的两种形式去 响应,第一个是 command 开头的,没有你 to 执行一个 command。 第二个是 txt, 是 你可以,你要正你返回正常的那个文本的响应的时候,就 t txt 开头的,还给了他一个,给了 ai 一个例子, command, 然后 txt or command txt, 然后我们再看一下它对于代码这边的改动啊, 这边删了,删 前面的 message 是 一样的返回,返回了这个外层还是一个循环,然后这边返回了一个 根据这个开头的这个 command 去进行了一个判断,如果说它是以 command 开头的,它就去用这个对 child process 这个紫禁城去执行这个背时命令,然后结果的话会也存到这个。 对,我先把这个存到上下文中,然后这个是他返回的一个结果,然后再把这个执行的结果命令执行的结果也推进这个上下文中, 然后如果错误的话也是一样的,也是有把这个执行错误的推推进这个上下文中,然后如果说是嗯 txt 的 话,就 把这个把这个什么呢格式化一下打印出来,然后把这个嗯 ai 返回的结果也推介上三。文中最后的话是没有指定类型的,就是当做默认的吧,当做默认的执行, 嗯,其实现在是有一个问题的,嗯,就是说当他要执行多个命令,就是说, 嗯,如果说是它要执行多多次那个 command 的 话,它其实里面内存是应该有个循环的,就是说直到, 就是说如果说它返回的第一次是返回的 command, 第二个第二次也是返回的 command 的 话,应该也是有一个循环去处理它的,然后直到检测到以 txt 开头的,就是说它这个内存循环会结束。我现在我们可以先测试一下。 呃,列出当前目录 执行命令,请输入您的问题。哎,它是执行了啊,但是它,嗯,但是有个问题,有个问题,这边 这边执行的结果,对,这边执行的结果是需要再次请求,那个就是是需要再次把这个请求的结果发送给 ai 的, 就是里面应该是有个内,就是这边 这边,这边应该是内部也有个循环的,要不然,嗯,这边仅仅打印了一个执行结果,但是你没有把这个结果告诉 ai, 我 们给他说一下, 嗯, command 执执行完成之后应该要把 结果再发给,发给大模型这里,这里应该是个 是个内部的循环,就是直到检测到 没有 command 的 命令才跳出此内部循环。 改完了哈,再来看一下 这个时候外部的那个 user input 的 一个循环嘛,内部的话就是,嗯,当他的好,对,没毛病,没毛病,让他指指尖一塌,然后这边 复制了这个 message, 然后这一步再去请求。 哎,等一下,第一次啊,这个是第一次请求的,然后内部再去请求了这个大拇指的接口,把它 message 加上,然后这边 再覆盖之前的这个变量,就是说这个,对,这个就是持续会有这个 command。 如果说是,嗯, 这个 tom 的 直线完成之后会到下边这边,下面这边的话 没什么问题,就会是最终的,就是最终的响应的一个 ai 的 一个结果,响应的一个 ai 结果,然后再是外部的一个 有点 import。 好, 这么看起来好像没什么问题,我们试验一下啊。 列出当前目录的 文件, 这次是执行命令的输入,我们等一下,这边就是这边的话就是说他会把再发起第二次请求,把这个输入的结果再给到 ai, 然后 ai 再给你回复, 回复这这些啊,当前目录包含一下文件文件夹,这是一个 node js 项目,需要我帮您查看具体某个文件的内容吗?请输入您的问题,朋友们是不是?是不是? 是不是?是不是?可以了,没什么问题。那我们现在呃,看一下这个改动, 这次改动就是 这么多,我们这次 再测试一下,他就是这边测试一下这个内部循环的一个一个,一个一个逻辑,就是说刚刚是,刚刚是只有一个命令嘛?我们问他一个可以执行多个命令的问题,就是说我们 怎么讲呢?想一下, 算了,我们先退出吧,但是想不到我们今天先不得 commit 一下 at command execution loop, 没毛病。好,我们现在我想到了,刚刚,我想到了啊,想到一个它可以执行多个命令的。 帮我就是说我,我现在按下 star 就是 一个新的,一个空的一个上下文嘛。所以说我们搞它帮我查看当前项目 并补充 get ignore。 对, 因为我现当前的 get ignore 可以看到只忽略这个 note models, 其实呃,规范的那个 note 截图项目应该会有很多的。呃, get in the norm 就是 我让它去补充这么个,而且它我输入了这么一个体制词呢,它应该会,肯定会有多。嗯,多次的执行命令命令的一个 机会嘛,肯定是第一次他会列出当前的文件,然后把当前文件的结果给到达摩星,然后达摩星再让他去执行一个修改文件的一个命令。好,我们试试 好,第一次命令他是执行了这个,然后我们这边啊,这边这边的执行结果他应该会发给大模型嘛,然后大模型返回的第二第二个执行命令是, 呃,啥啊?会,这个命令是读取了这个 get ignore, 读取了那个 package 的 jason, 然后第三个命令是 是直接修改了这个 get ignore, 然后第四个, 然后会把这个输出再给到大模型,然后这边会最后最后是没有命令,没有命令就会跳出这个循环嘛?然后 说是已经成功补充了这个文件,原内容是仅包含 note models, 新内容是不拉不拉不拉不拉不拉。一堆。 提醒你,音频文件中已存在项目,现已被正确忽略。对,我之前是没有忽略这个音频文件的,而他现在可以看到啊。卧槽,那我这个音频好像,呃,好像是已经 加到了这个 get 的 这个历史中了吗?哎,不管,这个不重要。同同学,你们以后注意就说这个音频肯定是不能进到这个 get 的, 一个肯定是不能进到 get 的 提交中嘛。对,他这边已经忽略了, 这边忽略了好,这么来看是没有什么问题的。其实我我前几天去看那个 opencloud 底层呢,它是基于一个 pad 的 一个 底层的一个 ai 智能的一个包,它其实我看它底层的一个原理,其实就这么,就是这么简单,就是一个一个循环的一个过程,它会检测 最终跳出循环的,就是说我们会检测没有那个,嗯,没有命令执行了,他会跳出这个循环。就是其实就是这么的一个简单的逻辑吧。我们其实现在 这次改动应该只是一个这么改动,让 color code 给他 commit 一下。哎,其实我们, 哎,他说当前工作区是干净的。不会吧,我不是有这个限制了吗?我现在既然这个我自己做的 ai 出来,那我们让他给它 command 一下,看看行不行。 让我们现在做的这个 ai command 一下啊,你看他现在执行了一个查看当前状态的一个 一个一个一个那个啥,然后发现了当天有修改待会暂存的文件,你需要先暂存更改才能提交。你希望帮你执行哪些操作? 请告诉我需要的提交信息,我会帮你完成提交案。我们现在告诉我们现在自己造的这个 ai 哈。嗯,请帮我暂存所有的改动,并生成一行简短的 一号 it commit 信息,并帮我 it commit 我 们自己的 ai, 去帮我们去完善自己的 ai 项目。朋友们,这是不是还是很给力的 哦,他是直接一下子执行了一条命令,哎,算了,没,没关系没关系,反正我们那个多条命令的那个已经测试好了。提交成功,提交成功啊, 看一下啊,这边确实是有这个提交记录的。其实这就是它底层的 open clock 或者说是 card code 底层的一个最核心的一个循环嘛,它是可以执行 执行这个命令,然后可以去循环地去请求大模型。对, 然后其实后面那些技能的话,其实它也很简单,它你如果是有技能的话,它会把技能一开始会读到这个 system 的 这个提示词中,就是说它会把这个 content 在 不断的完善。嗯,如果说, 嗯,你们感兴趣的话,可以去抓包看一下他那个 code code 的 一开始的那个 system 提示词应该是一个很大很大的一个 content, 然后如果说,嗯,这次的这个, 嗯, ai engine 的 这个原理去了解的话,那你就会知道其实他每次的这个 api 请求都会把这个很如果是 cloj 的 话,他都会把这个很大的这个 content 在 每次请求都会给到大冒险 api 那 边,那这样的话其实他的头可能 消耗很快。就是,其实是有原因的吗?其实你如果理解到他的这个原原理的话,你就会知道一些原因了。对,看一下我录了多久了啊?什么时候开始录的?哎, 嗯,先不录了吧,后面如果有需要我再录 skill 方面的,然后录如何?嗯,我问可乐的话,它火出圈的一个原因是它有很多的,它可以接入很多的那个聊天工具,它其实只是一个。嗯, 界面层的一个改动了,我也不想去做那方面的一个逻辑,我感觉就可以了,后面如果 有其他的想法再录吧。好,谢谢大家。如果说这个视频对你有所帮助,欢迎点赞、评论、收藏、投币。好,再见。

之前有人怀疑不是用写的项目代码贴出来给大家看看。 历史原因,作者还是习惯电或透喷的项目结构,对于 t o t。 的拍不是很喜欢用,因此每一个项目都是独立的库或可执行程序 编译后的目录。如图所示,项目全部使用 g u w u g, 并未使用 g u 登照。在后续开发中,壁图部分计划使用 休练照切入 t o e。 除了做 u i, 作者并不打算使用其他组件,包括 david 多媒体物业被认证。 本次录像时长较长,给出了比较详细的介绍,有这方面兴趣的朋友可以点关注。后期我们将持续更新,直到将其做成一个产品。 除关键之外,如果您还有其他想法,那么您可以加入我们的 qq 群,七一七七四三四五八。在这里我们将为您解答有关问题或与我们一起技术交流。如果您能力达标,并有兴趣与我们一 继续开发,那么我们非常欢迎您的加入。接下来请看演示。 哎呀,这个启动声音是不是很轻薄,差点走的窗口都裂开了。 其实动画还是比较流畅的,只是开着屏幕录像导致比较卡顿。 全系统采用了模块化设计,均通过调用约定进行显示调研。所有模块均需要依赖框架与内容调度,由框架处理。我们在这里改掉两个文件名,然后看看效果。 哦哦。 由于我们改变了聊天模块和主题设置模块的文件,因此系统将无法再创建此模块身, 我们将逐渐完善模块化功能。在后期的建设中,我们计划已配置文件对外部模块进行扩展,这将意味着所有人都可以自由扩展功能。 现在我们将文件名改回去,再看看效果, 熟悉的聊天界面又回来了。而模块化还具备其他好处,平稳稳定,不影响整体变异速度。缺点也是显而易见的,很大程度上增加了系统开发难度,并且导致程序性能略有降低。 至此,本次视频就要结束,如果您想关注我们的进度,您可以点关注。如果您想加入我们或技术交流,您可以加 qq 七一七七四三四五八。感谢您的观看,我们下期见!

大家好,欢迎来到鸿飞软件集,今天介绍 qt 的 属性动画在 qt 知识的第十六部分,该部分内容介绍的是 crop 提 animation 属性动画,就是可以对 vg 的 属性值,比如位置和宽、高、透明度、颜色等进行数值的变化, 可以设置出变化的时间用时这样的当属性在进行变化时,外形的呈现给人的感觉就是图形在进行动画的变化,我们便易导出的项目例子, 这是设置属性动画的源码,我们看运行成功的界面,点击第一个大小位置属性动画,第二个长度属性变化,第三个颜色属性变化第四个位置属性变化第五个透明度属性变化 第六个大小属性变化。以上就是这个 crop 题 and mason 属性动画设置的介绍内容,欢迎关注此账号,分享更多使用技术。若想获取 qt 开发手册,参看视频下方信息,或查看主页签名介绍,谢谢您的观看,拜拜!

这是一个非常有趣的 javascript 开源项目 star, 新高达近二十九 k。 它展示了 js 中一些有趣且怪异行为的视力列表。我们知道 javascraft 是一个非常有趣的语言,但同时也充满了各种奇怪的行为。这些奇怪的行为真的很让人头疼。你是不是也曾经想过, js 你到底是个什么东西?运行结果为什么是这样的呢?有时真的会让我们忍俊不惊。 简单浏览一下目录。比如我们可以看到最典型的一个问题零点一加零点二精读计算问题。对于每道题,文档中都给出了解释,并介绍他们如何工作。无论如何,可以试试读读看,也许你会发现一些新的东西,让你重新认识一下 js 的另一面。

hi, 欢迎回来,那么今天呢,我们就来解决一直困扰我们的一个问题,那就是为什么在它自动生成的这样一个 nest js 的 项目中,我们的 controller 中间没有显示地去创建一个叫做 app service 的 一个对象,但是呢,在我们的 controller 里面的 方法函数中呢,它却能够直接调用这样一个对象,并且调用 service 里面的这样一个方法,甚至它没有报错。非常奇怪啊,它到底是怎么实现的呢?首先呢, 既然我们用了 type script, 那 么 type script 它有没有这个能力呢?那很明显, type script 啊,它只是针对 javascript 在 类型上的一个增强,它不可能有这样的能力。那难道是 node js 给我们实现的这个功能吗?那很明显也不可能,因为 node js 它本质上只是一个 javascript 的 运行器,还有连接 javascript 和我们的操作系统之间的这样一个桥梁,它如果要实现这么一个复杂的功能的话,那它就不应该 只是一个简单的 javascript 运行环境。那很明显,答案只有一个,这个功能呢,应该是 nest js 为我们实现的。既然在我们的 controller 中间,它没有创建这样一个叫做 app service 的 对象,那么和我们框架相关的地方,用到了这个 app service 的 地方只有哪里呢? 很明显就只有我们的 app module, 因为只有在 app module 这个地方,它显示的将我们的 app service 作为一个 provider 属性之一给它传了进去。而我们的 app module, 它作为 nest js 的 一个基础,一个基石, 它又传递给了我们的 main t s 中间的这个 create 函数,创建出来了一个 nest js 的 服务器。那么具体它到底是怎么创建的呢?那这里呢,我们就可以根据 modular 中间它使用到的这样一个叫做 provider 的 这样一个关键字。首先 provider 它到底是个什么东西?为什么上面这里要叫做 controller, 下面这里使用 app service 的 地方它要叫做 provider 呢?我们来到 ness 的 jess 的 官方文档, 在官方文档的左边找到 overviews, 我 们可以找到这里有一个小结,就叫做 providers, 我 们来看一下它针对 providers 的 定义。那可以看到关于 providers 它的说法呢,是比较的简单的, many of the basicist classes, social services, repository and helpers can be treated as providers。 也就是说呢,类或者是 service, 或者是 repository, 它都可以 当作是一个 provider。 所以呢, provider 它只是一个泛化的概念,并不是说只有我们的 service 才能够作为一个 provider。 那 问题是我们的框架它到底是怎样知道一个东西它是一个 provider 的 呢?这里我不把这个 provider 这个单词进行翻译,我是叫它供应商还是叫它 什么提供者呢?翻译出来就很奇怪,所以呢,我之后会一直叫它 provider。 我 们再往下面看关于 provider 进一步的说明,在下面这里的 service 这个地方,它就展示了一个和我们一模一样的一个场景,它这里创建了一个 service, 叫做 cat service。 然后呢,它需要将我们的 cat service 用在我们的 controller 中啊,也就是在这个地方 可以看到它的写法和我们是一样的,它只是在 controllers 这样一个类中间的构造函数中声明了一下我们的 service, 但是呢,并没有实际地去创建它,然后呢,它却能够在 controller 这个类里面的方法中去使用我们这样一个并没有显示创建的 service 对 象,那它到底是怎么实现的呢?那这里它就简单地告诉我们, the cat service is injected through the class constructor 啊,它是通过我们的类构造器被注入进来的。这里它强调了一下 inject 这样一个关键词,它是被注入进来的。同时呢,它还告诉我们, this shorthand allows us to both declare and initialize the cat's service member in the same line streamlining the process。 也就是说,单纯地将我们的 service 在 controller 这样一个类中的构造器这个函数中进行声明,它同时就能够实现声明和创建的这个过程。也就是说,仅仅这一行,它其实就已经完成了我们这个 service 对象的创建。为什么这么一行就能够实现创建呢?明明在我们的角度看来他只是做了声明,就算他告诉我是被注入的,但是问题在于,他为什么会被注入进去呢?他到底是怎么来注入的呢?这里我们就产生了更多的疑问。那么紧接着他下面一节就讲述了 dependency injection。 那 么这里的所谓的 dependency injection, 我 们一般的叫法叫它依赖注入,那它告诉我们 nest is built around a powerful design pattern known as dependency injection。 它告诉我们 nest just。 它本身呢,其实就内置了一个非常强大的 这样一个设计模式,叫做依赖注入。那么这个依赖注入本身呢,它就是用来解决我们刚才上面所演示的,将这样一个 service 注入在我们的 controller 中间的这样一个过程。然后呢,具体相关的一些概念的话,它推荐我们去到 anger 官方的一个文档,我们打开看一下 这里它会跳转到 angular 官方的一个文档,然后呢,会告诉我们非常多的一些概念。但我说实话,这里的概念呢,其实是比较的难懂的,它也只是讲了一些 angular 相关的一些知识,所以呢,这里的解释我个人觉得并不是特别的好理解。 那么为了让各位能够进一步的理解,我们的 service 到底是怎样被注入在我们的 control 中去使用的呢?那这个地方呢,我推荐大家来到 nest 的 js 官方文档的另一个部分,我们收起 overview, 来到下面的 fundamentals, 也就是基础。找到这里第一个部分, custom providers。 那 么在刚才的那个文档中,我们知道了 provider 可以 是各种各样的类,不仅仅是我们的 service, 它还可以是我们的各种 factor, 各种 repository。 好,当然这些东西呢,我们之后都会用到,那么在这样一篇新的文档中,它告诉我们什么呢?我们来看这个部分,这里的 d i fundamentals d i 就是 依赖注入的简写,就是这里的 dependency injection, 它这里对我们的依赖注入做了进一步的说明,它告诉我们, dependency injection is an inversion of control technique wherein you delegates instantiation of dependencies to the ioc container 啊,它告诉我们,首先 d i 依赖注入它是一个 什么什么的技术啊?这个 inversion of control, 我 们一般把它叫做控制反转啊,这里又出现了一个新的名词,对吧?我们连依赖注入它的原理都还没搞懂呢,这里又多出来了一个叫做 i o c 控制反转的东西,并且它告诉我们什么呢?依赖住它本身是将我们实力化依赖的这样一个过程呢,交给了我们的 i o c 容器,那这里它又出现了 i o c 容器这样一个概念。我们先来解决最关键的一个点,就是我们的一个类,比如这里的 service, 它到底是 怎样被我们的 nest 的 js 标注成一个 provider 的 呢?不可能所有的类都是一个 provider, 比如我们的 controller, 那 很明显 controller 它就不是一个 provider, 因为我们没有 在其他的地方像我们的 service 一 样去使用我们的 controller, 很 明显它是有一定的方法来区分到底哪个类是 provider, 哪个类不是的。那么在这个地方,它就明确地告诉了我们, first we define a provider the injectable decorator marks the cat service class as a provider。 它这里就明确告诉我们,其实要识别一个类是不是一个 provider, 就 只需要使用这样一个注解,叫做 injectable。 那 很明显,我们的 app service 它就自带了这样一个注解 injectable, 那 么就意味着只要一个类上带有了这样一个 injectable 的 注解,它就是一个 provider, 它就可以被依赖注入到其他的地方。那么解决了这个问题之后呢, 我们再来看接下来的问题,到底是谁来把这个标记好的 provider 放进去,然后又是谁把这个放进去的 provider 拿到我们的 controller 中间去使用的?我们继续接着往下看, 来到这个地方,在这里同样是 d i fundamental。 下面这里它详细地告诉了我们整个这个依赖注入的过程。首先呢,第一步, in cat service t s then the injectable decorator declares cat service class as a class that can be managed by the nest i o c containers。 它首先告诉我们, 我们第一步做的就是在我们的 service 文件中给这个类添加上一个 injectable 的 注解,那很明显,这个类它就变成了一个 provider。 同时呢,这个 provider 或者说这个类它就会被我们的 nest 内置的一个 ioc 容器进行管理。注意,是 nest 的 机制内置的容器,那这个容器呢?我们在 nest 的 机制的使用过程中是看不到的,因为它是隐藏在框架下面的,我们是看不到它的细节的。第二步呢,在 controller 中, 它又显示的声明了一下,在我们的 controller, 它会使用到我们的 cat service。 这个声明的过程呢,就是在这个 controller 类,它的构造函数的参数列表 去声明了一下。那这个写法呢,也和我们之前是一样的,就在我们的这个地方, controller 这个地,只要在这里声明,那么我们的框架它就能够自动地为我们进行注入。那注入的前提就是我们要 给我们的框架提供一下,到底哪个东西是我们要注入进去的 provider。 那 么第三步是什么呢?在我们的 module 文件中,它将这个 cat service 这样一个类和我们的 t s 文件进行了关联,那这样的话它就能够实现将我们的这个 cat service 进行注册。所以呢真正起作用的一步呢,就是在我们的 module 这里,它将我们 需要用到的所有的 provider 都放在了这个 module 注解里面的这个 providers 这样一个属性中,这样就直接告诉了我们框架这个树组里面所有的类全部都是要作为一个 provider 进行 注册,注册完了之后呢,再去查看哪些地方用到了这些 provider, 然后呢就让我们的框架给它注入进去。好,我知道大家这么听下来的话,还是会觉得有点麻烦,还是会感觉不太直观,并且刚才我们提到的这个 ioc 容器,为什么它要叫做 version of control 呢?我们来到刚才的这个概念,为什么它要叫做 控制反转呢?这里到底哪里反转了呢?它到底控制了什么东西呢?这里呢我给各位简单提供了一个图标,中间这个 ioc 容器呢,就是我们的 list 的, 这是整个框架给我们提供的。而左边的 provider 呢,它可以是任何东西。刚才我们也看过了它的概念, provider 可以 是一个 service, 也可以是什么 repository factor, 而右边的 controller 就是 我们实际使用这样一些 service 类或者是 service 类对应方法的这样一些东西。而很明显我们的 controller 中,它是不会直接了当地去从我们的 provisor 中去创建一个新的对象。我们的写法中呢,也没有这一步,那它所实现的过程呢,就是在我们的 provider 这些类中添加上我们的 injectable 注解之后呢,我们的 i o c 容器,它就知道这样一些东西是 provider, 它就把这些所谓的类呢,在它的容器里自动地完成了 对象的创建。就比如这里的 app service, 它只要打上这个标注,并且在我们的 module 中引入为这个 providers 之后呢,在我们的 i o c 容器里啊, 或者说在我们的 n s j s 框架的内部,它就自动的会创建这样一个 app service, 它的对应类型的这样一个对象。注意啊,这个创建的过程它是自动的,不需要我们去操心。创建好了之后呢, 所有的这样一些对象都会放在这个容器里,那么具体什么时候使用呢啊?很简单,就在我们的控制器中,如果它在它的这个构造函数中去声明了一下,那么这个声明呢,同时就意味着我们的容器要为我们的这个 controller 去解决 它所依赖的这样一个 service。 所以呢,容器检测到我们的 controller 使用到了这样一个 service 之后呢,那么这个 service 刚好 又在这个容器里面注册好了相应的类,那么这个东西呢,就会由容器交给我们的 controller。 所以 为什么我们这个 ness 的 jess 看起来它没有 显示的创建对应的 service 类,但是能够直接使用它呢?就是呢,我们在使用这个 ness 的 jess 框架,在编辑对应的 type script 代码的时候呢, 我们没有办法体现出来这一点,其实要查看它到底是怎样创建的,也很简单。还记得我们运行一个类似的 js 项目,它的过程吗?它肯定是先将我们的 type script 代码给它翻译成 javascript 代码,然后再由 node js 去运行的,所以呢,它会生成一个 所有 type script 代码对应的 javascript 代码的版本。因此呢,这个地方其实很简单,我们直接在终端中运行我们整个项目, ok 运行好项目之后呢,我们照例会在左边,它会生成一个 disk 目录, disk 目录下面就是所有编辑好的这样一些 javascript 版本的代码。那此时呢,如果我们来到这里的 app controller js, 来到下面,你会惊奇地发现,在我们这个 app controller 类的定义中呢,在这里的 constructor 构造函数里, 它的写法呢,就和我们刚才的 type script 的 代码中的写法就完全不一样, type script 代码中只是在这里的参数列表声明了一下,但是呢,编辑好的 javascript 版本之后呢,它是会实打实的去 创建一个 app service 对 象的。所以呢,这个创建的过程呢,只是让我们的框架或者说对应的 ioc 容器给我们进行了抽象,并不是 完全把这一步舍弃掉了,它只是让我们不用自己去操心这样一个创建的过程。那我们简单再来对比一下,来到这里的 app controller, 我 们来对比一下这里的构造函数,那左边呢就是翻译好的 js 的 版本,右边呢就是没有翻译的 type script 版本。很明显,在我们的编码层面,我们是没有实现这样一个创建的过程的, 所有创建过程呢,都是由我们的框架为我们能完成的。那么到此,相信大家就大概了解了,我们是怎样实现 在不创建一个 service 对 象的情况下,却能够调用它里面的方法的。这个过程呢,就是由框架或者说 nest js 它的依赖注入为我们实现的。那么最后一部分呢,我再给大家简单的讲解一下,为什么 这里这个容器它要叫做 ioc, 为什么要叫做 inversion of control 控制反转这个部分呢?你不想要了解,没关系,我们之后的话呢,一直都会把这样一个机制叫做 依赖注入,因为叫做控制反转的话,很多人他其实会感到非常的困惑啊,但是为什么要叫做控制反转?首先控制反转这个词本身大家听起来就很难理解,我个人其实也不是很喜欢这个词啊,包括这个词 最开始在 java 论坛好像是零四年的时候,大家讨论的时候,当时发的一篇 blog 里面, blog 的 作者就明确地表示,他们发现很多人对控制反转 ioc 这个词呢感到非常的困惑,所以呢,大家都会使用 依赖注入,也就是 d i 来替代这个叫法。但是呢,为什么要再控制反转呢?要理解它的话,我们就需要理解一下我们之前这个代码的写法。上一节我给各位提供的这样一个 express 项目,我们来看一下这个项目它的结构啊,这个项目的结构看起来和 ness js 项目的结构差不多,但是呢,它的最重要的问题就在于,在我们的 controller 这个地方,它去调用我们的 service 这样一个函数的过程中的,我们的 service 函数它是实打实的被创建了的啊,如果真的要进行一对一对标的话,那很明显我们这个 get hello 它的最外层如果包裹一个 class 类,那么这个 class 类我们是很显然要基于它去创建一个 对象的,然后基于这个对象才能够去使用里面的 get hello service 这样一个方法。所以呢,我们之前的这样一个写法呢,我们是需要显示的去在我们的 controller 中 去声明一个 provider 这个类对应的一个对象才可以的,所以呢,方向是从 controller 主动去引用我们的 provider 的。 而有了我们的 ioc, 有 了我们的控制反转之后呢,你会发现整个箭头它就是反过来的,它是先有我们的 provider, 或者是这样一些 service 类主动的 去声明它自己是一个 provider, 然后呢放到容器里,最后再由容器去决定哪些 controller 需要使用到哪些 provider 类,然后呢再由容器提供给它们, 所以呢,这个反转,其实反转呢,就是这样一个调用的过程,之前是由 controller 去主动调用我们的 provider 或者是这样一些 service 类, 而现在呢,是由 provider 主动去声明,向容器去报备,再由容器去统一的调度哪些 controller 去用到它,那么这就是控制反转中反转它的意义。相信各位现在听来就明白了这里的 inversion of control 控制反转它到底是什么意思了吧,但是呢,很明显,如果你是 新手小白,没有接触过这样一个依赖注入的方式,第一次听说 iuc 控制反转这个词,相信你是两眼一抹黑的,因为我们的框架本身它是把这个控制反转,或者说这个这样一个容器注入的整个过程呢,它是隐藏在框架之下的, 我们日常使用的时候呢,是根本看不出来,它会自动的为我们完成整个这个流程,这也是为什么很多人根本理解不了为什么它要叫做控制反转,它到底反转了什么?那么以上就是本期视频的所有内容,希望你能关注或订阅我的频道,感谢你的观看,我们下期视频再见!

好嘞,各位,那么继续来讲一下 note g s 第六张 n p x, 那 n p x 呢?它跟 n p m 是一样的,都是基于这个命令行的一个工具,同时也是在 no 的 g s 高版本之中呢,去自带的一个命令。对,如果你用的是非常非常低的版本,那你需要手动安装一下 n p x, 那你需要执行 n p m install n p x 杠 g 就可以了啊,那 n p x 它的作用呢?主要是可以在命令杭州呢,运行我们这个 note 包里边的一些可知性文件, note 的 modis 下面点并的可知性文件。在我们没有学 n p x 的时候呢,我们之前是使用这个 script, 然后在里面去配置,通过 n p m run 去给它运行。哎,我们学了 n p x 之后呢,可以直接使用 n p x 去运行,并且呢是不需 要安装这个依赖包的。对,我们本地运行呢,是不是还要去安装下这个依赖。使用 n p x 运行呢,是不需要安装这个依赖包的,所以说这个就是它的一个优势,就是避免全局安装它的依赖包,并且呢,每次使用的都是最新的版本, 并且它还可以执行任意的一个 npm 包。哦,那最后一个命令,大家只需要了解一下即可,这个用的并不多啊, 就是我们这个 n p x 呢,它也可以执行 get up 下面的一些可执性文件。对,但是前提是你的 get up 呢,要公开我们这个 javasque 文件,所以说这个功能呢,它是支持的,但是可能用的是比较少,比如说大家了解一下即可。好,那接下来是一道面试题啊, 就是 n p m 和 n p x 一个区别,那 n p x 呢?它主要是侧重于命令,比如说执行这个并下面脚本, 或者是运行一些全局的命令,这个是用的比较多的。而 n p x 呢,它主要是包管理工具,控制我们这个模块的什么蒸山改查,对,用的比较多一点,所以说这也是他们一个主要的一个区别。好,那接下来的话就给大家去演示一下 我们刚才说的这个如何避免全局安装和总是使用这个最新版本。哎,这两条是什么意思啊?哦,然后我把演示的网址呢,已经给他贴到这个博客里边了,大家来找一下就可以了啊。然后我们使用这个 react 的一个脚手架呢,去给大家展示一下。 好,那在之前的话,我们没有 npx, 那么是不是需要执行下这个命令,去给他把这个脚手架呢去装到我们这个全局?好,我们可以先看一下啊。好,这的话要给大家再介绍一个命令,这个命令也一定要记住啊,比如说我想看一下我全局安装 装了哪些可执行文件,注意啊,全局安装了哪些可执行文件?使用 n p m l s 杠 g。 对,这个命令一定要记住啊,不加杠 g 就是当前项目啊,好,回车 他就会给你列出来。好,我们稍等一下,大家看到,这是我电脑上装的一些全局的一些可执行文件,就是可以直接去给他调用的, 就是我们在之前的片当中展示过这个 t s 杠豆的,因为我把它装到了这个全局,但是我这个全局呢,并没有安装我们这个 rec 脚手架,所以说我们需要给它先安装一下哦,然后我之前这个命令啊, a p p。 好,我们稍等一下啊。好,安装完成之后呢,我们再来看一下 n p m l s 杠 g, 哎,我们会发现这多了一个 craich recta app, 多了一个这个命令,然后这个命令呢,就可以直接去给他执行了。对,比如说后面呢,可以跟一个这个项目的名称啊,比如说叉叉叉,对,你就可以去运行这个命令了,我们先不跟了, 咱们先直接输出一下,哎,发现这个命令是不是也是可以执行的?对,传统的方式呢,就是这样去做的,但是这样做有什么缺点呢?首先 注意啊,第一个缺点是什么?他这个版本就锁定了五点零点一,对吧?还有那这个东西是不是装到我们这个磁盘里边,占用我们这个磁盘的一个空间,对吧?这是他两个一个弊端,而 n p x 呢,他就可以完美的去解决这个问题。好,那现在的话我把这个命令去给他卸载掉啊, 同样也是 on install 加一个杠 g 就可以了。对,杠 g 就是卸载全局的一个包。好,一定 已经卸载完了,然后通过 n p m l s 杠 g 去看一下, 发现是不是已经没有没有了,然后我们再执行这个命令,发现是不是已经是执行不了了,但是 n p x 呢,就可以去帮我们去做这件事,比如我们切到一个桌面哦,然后使用 n p x 呢去执行这个命令, 然后呢,比如说创建个项目叫什么 my app, 好,我们回车一下,哎,发现他是不是能够,哎执行起来,对不对? 我们并没有安装这个包啊,发现 npx 是可以帮我们去执行起来哦,他的查找规则是什么呢?注意,他的查找规则呢,是会去当前的项目里边看 note 猫就是下面的,并有没有这个可执行文件,如果没有就去全局找 全局,如果再找不到,他就会去这个安瓶官网上去给你把这个东西给你下下来,下下来等你用完之后呢,又给你删掉。对,这是他的一个规则啊,注意 啊,我们现在都没有,他应该是在帮我们去下这个依赖,下完依赖呢,把这个魅力执行完成,执行完成之后呢,又会把这个包给他删掉,所以说这个包呢,他就是一次性的。那这样的话就是什么 节省了我们这个磁盘空间,并且呢,他每次下载的时候呢,版本都是最新的,对他他就可以去解决这两个问题。 好,那这下载的话比较慢啊,我们就稍微等一下。好的,那这个项目呢,究竟是构建成功了,然后我们去切到这个 my app 里边,好,然后去运行下这个项目,看能不能运行起来啊。好,回车我们来看桌面上啊,对, 桌面上是不是已经有了这个 map 哦,然后其实也是可以运行起来。好,稍等一下。哎,网页呢也是打开了,对,基本上是没有什么问题的,那这样的话就可以避免我们这个 全局的安装,而且每次安装的是一个最新的版本。对,这就是一个 n p x 的一个妙用,很多的 c l i 呢,都是推荐他们去使用的,比如说 max, g s, 还有这个 rex 以及什么 wait price 等等,都是怎么去推荐这个使用的。好,那这个的话就是它的第一个使用场景,然后我们再演示它的第二个使用场景,好,我们先把它关掉啊, 好,这些都关掉。那第二个使用场景,我们说过它可以运行我们这个呃, note modules 点并的一个可执行文件哦,比如说我们现在执行下 wechat 哦,现在是执行不了。然后呢,我们再去看一下全局我有没有 装过位车,还是通过 m p m l s 杠 g 哦,我们可以看到发现我全局是不是也没有装过这个位车哦,然后我们可以在本地检索一下,就是通过 m p m l s 就不加杠 g 了,就是检索本地的那种模式,发现是不是也是空的 哦,什么都没有。但是呢,我就想运行这个 vit 的命令,是不是也是可以的?对,你可以直接使用 npxvit, 咱们说过他从本地检索不到呢,他就去全局找全局找不到就干嘛去给你安装啊?如果他能找到的话,他就会在本地呢去给你做一个执行,所以说我们可以安装一下 n p m i h 杠 d。 好,然后我们直接执行 white 也是执行不了的,因为什么?因为我们这个稳定的目录没有在 环境变量里边配置啊。所以说这时候我们可以通过 n p x 位车哦,然后他就他呢就会去找这个 note 猫,就是点并下面的位车帮我们去运行起来,所以他是可以帮我们去执行这个命令的。哎,发现是不是也是启动起来的,而且是非常快的,因为他能找到 它,能找到就不需要,咱就下载了嘛,对吧?所以说它是可以运行我们这个命令的,那以上的就是两个 n p x 使用的一个场景啊。

一个软件是怎么被开发出来的?这个视频给你演示。我们将介绍 qt 开发一个软件,下面将介绍如何快速开发一个在 windows 上可以运行的软件,快速让你获得成就感。 第一步,使用 qt creator 创建新的项目。这里我们导出一个完整项目例子来代替这个创建新的项目。导出该例子到桌面上 qt creator 打开该项目,这样就处于与我们创建了一个新的项目一样的状态下。 我们选择编辑器进行编辑,确保例子没有问题, 运行正常。当前状态就是我们已经开发好了的项目状态。接下来进行打包。 第二步,为我们的项目选择一个图标,这个图标将用来放于桌面,点击图标启动我们应用。我们根据 qt 开发手册上的按钮链接进入看下载网站, 随机选择一个任意的图标进行下载, 选择这个火的图标起名为 hot png 吧。 在 qt 中,应用图标的使用需要看格式,这里同样点击按钮进入转化格式的网址。将我们之前下载到桌面上的 hot png 放于这个网站中进行转化。 将转化适当大小的图标同样下载到桌面,起名 hot icon。 接下来将 hot echo 放于源码目录中,与 pro 文件同处于一级, 我们可以测试一下 应用图标并没有生效,是因为还需在 pro 文件中添加或 see i can see 等于 can name echo。 再次测试仍有报错是因为我们要把应用图标的名称进行修改,而 c a 看下等于 hotcopy。 这样我们可以看出应用运行起来的时候,任务栏和主界面左上角的应用图标已经显示出来。 第三步,添加运行的动态库到项目生成文件夹为例所 我们首先进入 qt 手册中序号二,在 windows 下打包的选择瑞丽所文件夹中的 ykk 文件生成我们所需的两个路径, 选择之后,下方就生成了我们所需的两条命令,我们点击第一条命令复制按钮,再打开 qt 官方自带的打包工具, 将第一条命令复制进入,点击运行就能进入指定文件位置。接着我们点击第二条命令的复制按钮,复制进入并运行。这样操作之后,就能将应用所需的全部 dl 动态库放置到我们项目的 web 一 所文件夹中, 这时点击 excel 文件,我们开发的应用就可以正常运行。第四步,将 release 文件打包成为一个 excel 文件。我们点击桌面上的这个打包应用。第一项,选择我们 release 文件夹中的 excel 文件, 接着将 release 文件夹添加到这里面, 点击打包,就能将 linux 文件夹中的所有 dl 动态库和 exe 文件全部打包成为一个 exe 文件,生成的 exe 文件就默认存在 linux 文件夹中, 就是这个 project 零一 box exe 文件我们复制到桌面上,这样一个完整的应用就开发完成。 以上就是 qt 开发应用的全过程,我将把该应用和打包软件下载链接发于评论第一条中,可进行下载,也欢迎关注我,谢谢!

哈喽,大家好,我是斌哥,今天给大家分享一下 dependencies 呢,和第一位 dependency 的区别,一个是生产依赖,一个是开发依赖。 那什么是生产以来?比如说我们做微有项目开发,那么首先你必须要安装我们的 vugs, 包括我们的 vut, 如果说你用了 ui 框架,比如说像 ana d, 像 anauy 等等,那么他们呢都称之为我们的生产以来。因为呢,你打包以后步数到线上没有,他呢,你是跑不起来的,我们称之为生产以来。 那什么是开发议论呢?比如说我们做 vivo 项目,那你通过 vivo cra 呢,安装了一个项目,那这个项目里面很明显他会内置一个 star 呢,其实他是急于闹了,结实去搭建了一套 star。 那这个 star 的目的是什么?帮助我们本地能够去起一个静态服务, 还去运行我们的项目。他呢就是我们的开发一来,那因为我们在做完以后,他就没有用了,因为打包的线上他是包含我们这个 十万的,他只在本地帮助我们去搭建一个服务,仅此而已。那再比如说的话,我们的刹车软件,那么刹车的目的是什么?就是帮助我们去把一些刹车文件的进行解析和编译。 而我们真正的网页是不能够去识别我们的砂纸文件的,所以我们需要把它打包编译成我们的纯 cs 文件,让网页浏览器能够去识别。 那因此的话呢,萨斯像我们一些骚味,他就是一些开发以来,比如说我们上线的时候,这样是用不到的,我们打包上部署到线上之后都是一堆的我们的 atv, 包括我们的 cs 以及我们的 gs 文件, 因此我们把这些砂石文件,包括一些砂石捞点等等,称之为开发依赖。那我们一般的话会把这第三方软件安装到我们的 dvdps 里面去。但是有的同学会问,假设我们安装错了怎么办?无所谓,他只是一个规范定义而已。你可以把无有 gs 安装到 dvd 单式里面去,也可以把上次捞点或者说下次安装到底盘式里面去,也没有关系,他只是一个规范。我们说规范是人定的,我们习惯性的讲把这个开发一带一向无有 gs、 lnuigs 等等安装到底盘是满区,这是一种规范,即使你安装错了也无所谓。好,那这一节课就给大家分享一下开发依赖和生产依赖的区别,谢谢大家。

你知道吗? tiktok 上有个超级离谱的四百八十八 k 新开源项目,它声称要教你从零开始,亲手手搓出所有你听过的主流软件,从用 python 写机器人,到用 node js 搭服务器, 甚至用 c 语言造操作系统,用 c 加加写游戏,连开发数据库、前端框架、 dk 容器这种级别的东西,它都敢一步一步教你做。更夸张的是,这个项目还自带完整的编程练习库, 就像有人把互联网技术的底裤都拆开给你看,还塞给你一套扳手,让你自己装回去。如果你曾觉得现在的技术像黑盒,这个项目可能就是带你捅破窗户纸的那根手指。
