{"version":"https://jsonfeed.org/version/1.1","title":"序 on 流动","home_page_url":"https://liudon.com/","feed_url":"https://liudon.com/index.json","authors":[{"name":"Liudon"}],"items":[{"title":"山西之旅","id":"https://liudon.com/posts/the-trip-of-shanxi/","url":"https://liudon.com/posts/the-trip-of-shanxi/","summary":"\u003cp\u003e趁着暑假最后一个周末的尾声，来了一趟三天两晚的山西之行。\u003c/p\u003e\n\u003ch2 id=\"第一天\"\u003e第一天\u003c/h2\u003e\n\u003cp\u003e上午11:29分在清河站乘坐G2509次火车，下午14:27分直达忻州西。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-trip-of-shanxi/xinzhouxizhan.jpg_320x.avif 320w, https://liudon.com/posts/the-trip-of-shanxi/xinzhouxizhan.jpg_480x.avif 480w, https://liudon.com/posts/the-trip-of-shanxi/xinzhouxizhan.jpg_720x.avif 720w, https://liudon.com/posts/the-trip-of-shanxi/xinzhouxizhan.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-trip-of-shanxi/xinzhouxizhan.jpg_320x.webp 320w, https://liudon.com/posts/the-trip-of-shanxi/xinzhouxizhan.jpg_480x.webp 480w, https://liudon.com/posts/the-trip-of-shanxi/xinzhouxizhan.jpg_720x.webp 720w, https://liudon.com/posts/the-trip-of-shanxi/xinzhouxizhan.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-trip-of-shanxi/xinzhouxizhan.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e","content_html":"\u003cp\u003e趁着暑假最后一个周末的尾声，来了一趟三天两晚的山西之行。\u003c/p\u003e\n\u003ch2 id=\"第一天\"\u003e第一天\u003c/h2\u003e\n\u003cp\u003e上午11:29分在清河站乘坐G2509次火车，下午14:27分直达忻州西。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-trip-of-shanxi/xinzhouxizhan.jpg_320x.avif 320w, https://liudon.com/posts/the-trip-of-shanxi/xinzhouxizhan.jpg_480x.avif 480w, https://liudon.com/posts/the-trip-of-shanxi/xinzhouxizhan.jpg_720x.avif 720w, https://liudon.com/posts/the-trip-of-shanxi/xinzhouxizhan.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-trip-of-shanxi/xinzhouxizhan.jpg_320x.webp 320w, https://liudon.com/posts/the-trip-of-shanxi/xinzhouxizhan.jpg_480x.webp 480w, https://liudon.com/posts/the-trip-of-shanxi/xinzhouxizhan.jpg_720x.webp 720w, https://liudon.com/posts/the-trip-of-shanxi/xinzhouxizhan.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-trip-of-shanxi/xinzhouxizhan.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e一下火车，就感受到了山西的凉爽，甚至有一丝丝的凉意，我还穿着大裤衩。\u003c/p\u003e\n\u003cp\u003e出站打车，直奔民宿。\u003c/p\u003e\n\u003cp\u003e忻州古城附近民宿很多，这也是头一次住民宿，比酒店也不差。\u003c/p\u003e\n\u003cp\u003e最关键离古城近，走路过去就行。\u003c/p\u003e\n\u003cp\u003e收拾完行李，稍微休息，出发古城。\u003c/p\u003e\n\u003cp\u003e先来一瓶山西特产 —— 陈醋味可乐，真酸啊！\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-trip-of-shanxi/chencukele.jpg_320x.avif 320w, https://liudon.com/posts/the-trip-of-shanxi/chencukele.jpg_480x.avif 480w, https://liudon.com/posts/the-trip-of-shanxi/chencukele.jpg_720x.avif 720w, https://liudon.com/posts/the-trip-of-shanxi/chencukele.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-trip-of-shanxi/chencukele.jpg_320x.webp 320w, https://liudon.com/posts/the-trip-of-shanxi/chencukele.jpg_480x.webp 480w, https://liudon.com/posts/the-trip-of-shanxi/chencukele.jpg_720x.webp 720w, https://liudon.com/posts/the-trip-of-shanxi/chencukele.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-trip-of-shanxi/chencukele.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e排了很久队吃上的石头饼，本以为是硬硬的烧饼，结果是软软的。\u003c/p\u003e\n\u003cp\u003e味道就那么回事，人多就没必要排了。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-trip-of-shanxi/shitoubing.jpg_320x.avif 320w, https://liudon.com/posts/the-trip-of-shanxi/shitoubing.jpg_480x.avif 480w, https://liudon.com/posts/the-trip-of-shanxi/shitoubing.jpg_720x.avif 720w, https://liudon.com/posts/the-trip-of-shanxi/shitoubing.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-trip-of-shanxi/shitoubing.jpg_320x.webp 320w, https://liudon.com/posts/the-trip-of-shanxi/shitoubing.jpg_480x.webp 480w, https://liudon.com/posts/the-trip-of-shanxi/shitoubing.jpg_720x.webp 720w, https://liudon.com/posts/the-trip-of-shanxi/shitoubing.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-trip-of-shanxi/shitoubing.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e古城里小吃很多，但大多热门摊位排队很长。\u003c/p\u003e\n\u003cp\u003e最夸张的是泰山街里的羊肉串，从街一头排到另一头了。\u003c/p\u003e\n\u003cp\u003e我们是南门进，一路往北，走到古城中轴的明月楼。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-trip-of-shanxi/mingyuelou.jpg_320x.avif 320w, https://liudon.com/posts/the-trip-of-shanxi/mingyuelou.jpg_480x.avif 480w, https://liudon.com/posts/the-trip-of-shanxi/mingyuelou.jpg_720x.avif 720w, https://liudon.com/posts/the-trip-of-shanxi/mingyuelou.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-trip-of-shanxi/mingyuelou.jpg_320x.webp 320w, https://liudon.com/posts/the-trip-of-shanxi/mingyuelou.jpg_480x.webp 480w, https://liudon.com/posts/the-trip-of-shanxi/mingyuelou.jpg_720x.webp 720w, https://liudon.com/posts/the-trip-of-shanxi/mingyuelou.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-trip-of-shanxi/mingyuelou.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e差不多快到饭点了，本来想的是在古城外面吃，但晚上还要看打铁花，所以临时改在城内简单吃点。\u003c/p\u003e\n\u003cp\u003e晚饭在泰山街里的定襄饭铺解决，价格不贵，味道可以。\u003c/p\u003e\n\u003cp\u003e一伙人都说荞麦河捞好吃，但是山西的醋是真酸啊，面都是酸的了。\u003c/p\u003e\n\u003cp\u003e吃完穿过酒吧一条街，就到了打铁花表演的地方了。\u003c/p\u003e\n\u003cp\u003e我们到的晚了点，就在入口旁站着看了，来的早可以选位置坐着看。\u003c/p\u003e\n\u003ciframe\n    src=\"//player.bilibili.com/player.html?bvid=BV18RbA6PEpv\u0026page=1\"\n    scrolling=\"no\"\n    height=\"768px\"\n    width=\"1024px\"\n    frameborder=\"no\"\n    framespacing=\"0\"\n    allowfullscreen=\"true\"\n\u003e\n\u003c/iframe\u003e\n\u003cp\u003e表演完之后，还有放飞孔明灯。我们来的晚，没找到有卖的了。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-trip-of-shanxi/datiehua-1.jpg_320x.avif 320w, https://liudon.com/posts/the-trip-of-shanxi/datiehua-1.jpg_480x.avif 480w, https://liudon.com/posts/the-trip-of-shanxi/datiehua-1.jpg_720x.avif 720w, https://liudon.com/posts/the-trip-of-shanxi/datiehua-1.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-trip-of-shanxi/datiehua-1.jpg_320x.webp 320w, https://liudon.com/posts/the-trip-of-shanxi/datiehua-1.jpg_480x.webp 480w, https://liudon.com/posts/the-trip-of-shanxi/datiehua-1.jpg_720x.webp 720w, https://liudon.com/posts/the-trip-of-shanxi/datiehua-1.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-trip-of-shanxi/datiehua-1.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-trip-of-shanxi/datiehua-2.jpg_320x.avif 320w, https://liudon.com/posts/the-trip-of-shanxi/datiehua-2.jpg_480x.avif 480w, https://liudon.com/posts/the-trip-of-shanxi/datiehua-2.jpg_720x.avif 720w, https://liudon.com/posts/the-trip-of-shanxi/datiehua-2.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-trip-of-shanxi/datiehua-2.jpg_320x.webp 320w, https://liudon.com/posts/the-trip-of-shanxi/datiehua-2.jpg_480x.webp 480w, https://liudon.com/posts/the-trip-of-shanxi/datiehua-2.jpg_720x.webp 720w, https://liudon.com/posts/the-trip-of-shanxi/datiehua-2.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-trip-of-shanxi/datiehua-2.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e整个表演超级精彩，大概30分钟左右，来了一定要看！\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-trip-of-shanxi/heying.jpg_320x.avif 320w, https://liudon.com/posts/the-trip-of-shanxi/heying.jpg_480x.avif 480w, https://liudon.com/posts/the-trip-of-shanxi/heying.jpg_720x.avif 720w, https://liudon.com/posts/the-trip-of-shanxi/heying.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-trip-of-shanxi/heying.jpg_320x.webp 320w, https://liudon.com/posts/the-trip-of-shanxi/heying.jpg_480x.webp 480w, https://liudon.com/posts/the-trip-of-shanxi/heying.jpg_720x.webp 720w, https://liudon.com/posts/the-trip-of-shanxi/heying.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-trip-of-shanxi/heying.jpg\" alt=\"\"\n         width=\"1080\" height=\"1441\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e散场就直接回民宿了，如果打车的话，可以直接往北门走，到路边打车就行。\u003c/p\u003e\n\u003ch2 id=\"第二天\"\u003e第二天\u003c/h2\u003e\n\u003cp\u003e早上出门吃个早餐，跟手差不多大的包子。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-trip-of-shanxi/dabaozi.jpg_320x.avif 320w, https://liudon.com/posts/the-trip-of-shanxi/dabaozi.jpg_480x.avif 480w, https://liudon.com/posts/the-trip-of-shanxi/dabaozi.jpg_720x.avif 720w, https://liudon.com/posts/the-trip-of-shanxi/dabaozi.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-trip-of-shanxi/dabaozi.jpg_320x.webp 320w, https://liudon.com/posts/the-trip-of-shanxi/dabaozi.jpg_480x.webp 480w, https://liudon.com/posts/the-trip-of-shanxi/dabaozi.jpg_720x.webp 720w, https://liudon.com/posts/the-trip-of-shanxi/dabaozi.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-trip-of-shanxi/dabaozi.jpg\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e集齐了山西的各种口味可乐，可以召唤神龙了。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-trip-of-shanxi/shanxikele.jpg_320x.avif 320w, https://liudon.com/posts/the-trip-of-shanxi/shanxikele.jpg_480x.avif 480w, https://liudon.com/posts/the-trip-of-shanxi/shanxikele.jpg_720x.avif 720w, https://liudon.com/posts/the-trip-of-shanxi/shanxikele.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-trip-of-shanxi/shanxikele.jpg_320x.webp 320w, https://liudon.com/posts/the-trip-of-shanxi/shanxikele.jpg_480x.webp 480w, https://liudon.com/posts/the-trip-of-shanxi/shanxikele.jpg_720x.webp 720w, https://liudon.com/posts/the-trip-of-shanxi/shanxikele.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-trip-of-shanxi/shanxikele.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e吃完收拾下行李，打车到忻州西站，坐火车半个小时到太原。\u003c/p\u003e\n\u003cp\u003e在车站还出了个小插曲，来的时候带了一瓶剃须泡沫，在北京没被查出来，忻州西站说超限了，又发了个快递。\u003c/p\u003e\n\u003cp\u003e到了之后，已经中午12点多，赶紧找地方吃饭。\u003c/p\u003e\n\u003cp\u003e今天有点闷热，孩子们不愿外出，下午就在酒店休整了。\u003c/p\u003e\n\u003cp\u003e晚上吃完饭，出发太原古县城。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-trip-of-shanxi/taiyuangucheng-1.jpg_320x.avif 320w, https://liudon.com/posts/the-trip-of-shanxi/taiyuangucheng-1.jpg_480x.avif 480w, https://liudon.com/posts/the-trip-of-shanxi/taiyuangucheng-1.jpg_720x.avif 720w, https://liudon.com/posts/the-trip-of-shanxi/taiyuangucheng-1.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-trip-of-shanxi/taiyuangucheng-1.jpg_320x.webp 320w, https://liudon.com/posts/the-trip-of-shanxi/taiyuangucheng-1.jpg_480x.webp 480w, https://liudon.com/posts/the-trip-of-shanxi/taiyuangucheng-1.jpg_720x.webp 720w, https://liudon.com/posts/the-trip-of-shanxi/taiyuangucheng-1.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-trip-of-shanxi/taiyuangucheng-1.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-trip-of-shanxi/taiyuangucheng-2.jpg_320x.avif 320w, https://liudon.com/posts/the-trip-of-shanxi/taiyuangucheng-2.jpg_480x.avif 480w, https://liudon.com/posts/the-trip-of-shanxi/taiyuangucheng-2.jpg_720x.avif 720w, https://liudon.com/posts/the-trip-of-shanxi/taiyuangucheng-2.jpg_1024x.avif 1024w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-trip-of-shanxi/taiyuangucheng-2.jpg_320x.webp 320w, https://liudon.com/posts/the-trip-of-shanxi/taiyuangucheng-2.jpg_480x.webp 480w, https://liudon.com/posts/the-trip-of-shanxi/taiyuangucheng-2.jpg_720x.webp 720w, https://liudon.com/posts/the-trip-of-shanxi/taiyuangucheng-2.jpg_1024x.webp 1024w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-trip-of-shanxi/taiyuangucheng-2.jpg\" alt=\"\"\n         width=\"1024\" height=\"1366\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-trip-of-shanxi/taiyuangucheng-3.jpg_320x.avif 320w, https://liudon.com/posts/the-trip-of-shanxi/taiyuangucheng-3.jpg_480x.avif 480w, https://liudon.com/posts/the-trip-of-shanxi/taiyuangucheng-3.jpg_720x.avif 720w, https://liudon.com/posts/the-trip-of-shanxi/taiyuangucheng-3.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-trip-of-shanxi/taiyuangucheng-3.jpg_320x.webp 320w, https://liudon.com/posts/the-trip-of-shanxi/taiyuangucheng-3.jpg_480x.webp 480w, https://liudon.com/posts/the-trip-of-shanxi/taiyuangucheng-3.jpg_720x.webp 720w, https://liudon.com/posts/the-trip-of-shanxi/taiyuangucheng-3.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-trip-of-shanxi/taiyuangucheng-3.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-trip-of-shanxi/taiyuangucheng-4.jpg_320x.avif 320w, https://liudon.com/posts/the-trip-of-shanxi/taiyuangucheng-4.jpg_480x.avif 480w, https://liudon.com/posts/the-trip-of-shanxi/taiyuangucheng-4.jpg_720x.avif 720w, https://liudon.com/posts/the-trip-of-shanxi/taiyuangucheng-4.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-trip-of-shanxi/taiyuangucheng-4.jpg_320x.webp 320w, https://liudon.com/posts/the-trip-of-shanxi/taiyuangucheng-4.jpg_480x.webp 480w, https://liudon.com/posts/the-trip-of-shanxi/taiyuangucheng-4.jpg_720x.webp 720w, https://liudon.com/posts/the-trip-of-shanxi/taiyuangucheng-4.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-trip-of-shanxi/taiyuangucheng-4.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-trip-of-shanxi/taiyuangucheng-5.jpg_320x.avif 320w, https://liudon.com/posts/the-trip-of-shanxi/taiyuangucheng-5.jpg_480x.avif 480w, https://liudon.com/posts/the-trip-of-shanxi/taiyuangucheng-5.jpg_720x.avif 720w, https://liudon.com/posts/the-trip-of-shanxi/taiyuangucheng-5.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-trip-of-shanxi/taiyuangucheng-5.jpg_320x.webp 320w, https://liudon.com/posts/the-trip-of-shanxi/taiyuangucheng-5.jpg_480x.webp 480w, https://liudon.com/posts/the-trip-of-shanxi/taiyuangucheng-5.jpg_720x.webp 720w, https://liudon.com/posts/the-trip-of-shanxi/taiyuangucheng-5.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-trip-of-shanxi/taiyuangucheng-5.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e两边全是商业小店，走马灯式逛了一圈，然后就回酒店休息了。\u003c/p\u003e\n\u003ch2 id=\"第三天\"\u003e第三天\u003c/h2\u003e\n\u003cp\u003e早上6点起来，发现是个超级好的大晴天。\u003c/p\u003e\n\u003cp\u003e昨晚打车回来，司机师傅给推荐汾河边逛逛，查了下地图也不远，骑车20分钟。\u003c/p\u003e\n\u003cp\u003e快速洗漱完就出门了，扫了辆单车，跟着导航就往河边骑。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-trip-of-shanxi/fensedanche.jpg_320x.avif 320w, https://liudon.com/posts/the-trip-of-shanxi/fensedanche.jpg_480x.avif 480w, https://liudon.com/posts/the-trip-of-shanxi/fensedanche.jpg_720x.avif 720w, https://liudon.com/posts/the-trip-of-shanxi/fensedanche.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-trip-of-shanxi/fensedanche.jpg_320x.webp 320w, https://liudon.com/posts/the-trip-of-shanxi/fensedanche.jpg_480x.webp 480w, https://liudon.com/posts/the-trip-of-shanxi/fensedanche.jpg_720x.webp 720w, https://liudon.com/posts/the-trip-of-shanxi/fensedanche.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-trip-of-shanxi/fensedanche.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e今天一扫昨天的阴霾，天非常蓝，看预报今天热，出门穿的短裤，结果出来冷的不行，骑上车总算好一点了。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-trip-of-shanxi/yueliang.jpg_320x.avif 320w, https://liudon.com/posts/the-trip-of-shanxi/yueliang.jpg_480x.avif 480w, https://liudon.com/posts/the-trip-of-shanxi/yueliang.jpg_720x.avif 720w, https://liudon.com/posts/the-trip-of-shanxi/yueliang.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-trip-of-shanxi/yueliang.jpg_320x.webp 320w, https://liudon.com/posts/the-trip-of-shanxi/yueliang.jpg_480x.webp 480w, https://liudon.com/posts/the-trip-of-shanxi/yueliang.jpg_720x.webp 720w, https://liudon.com/posts/the-trip-of-shanxi/yueliang.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-trip-of-shanxi/yueliang.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e河边有一条骑行道，骑车的、跑步的，人很多。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-trip-of-shanxi/qiao.jpg_320x.avif 320w, https://liudon.com/posts/the-trip-of-shanxi/qiao.jpg_480x.avif 480w, https://liudon.com/posts/the-trip-of-shanxi/qiao.jpg_720x.avif 720w, https://liudon.com/posts/the-trip-of-shanxi/qiao.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-trip-of-shanxi/qiao.jpg_320x.webp 320w, https://liudon.com/posts/the-trip-of-shanxi/qiao.jpg_480x.webp 480w, https://liudon.com/posts/the-trip-of-shanxi/qiao.jpg_720x.webp 720w, https://liudon.com/posts/the-trip-of-shanxi/qiao.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-trip-of-shanxi/qiao.jpg\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e一看时间，快7点了，赶紧往回走，导航得绕一下，骑了一段还剩4.5公里，还是打车吧。\u003c/p\u003e\n\u003cp\u003e等车时刚好碰到一对新人大婚，今天是个好日子啊。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-trip-of-shanxi/xinhun.jpg_320x.avif 320w, https://liudon.com/posts/the-trip-of-shanxi/xinhun.jpg_480x.avif 480w, https://liudon.com/posts/the-trip-of-shanxi/xinhun.jpg_720x.avif 720w, https://liudon.com/posts/the-trip-of-shanxi/xinhun.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-trip-of-shanxi/xinhun.jpg_320x.webp 320w, https://liudon.com/posts/the-trip-of-shanxi/xinhun.jpg_480x.webp 480w, https://liudon.com/posts/the-trip-of-shanxi/xinhun.jpg_720x.webp 720w, https://liudon.com/posts/the-trip-of-shanxi/xinhun.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-trip-of-shanxi/xinhun.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e回酒店吃完早饭，就直奔太原的重头戏 —— 晋祠。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-trip-of-shanxi/jinci.jpg_320x.avif 320w, https://liudon.com/posts/the-trip-of-shanxi/jinci.jpg_480x.avif 480w, https://liudon.com/posts/the-trip-of-shanxi/jinci.jpg_720x.avif 720w, https://liudon.com/posts/the-trip-of-shanxi/jinci.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-trip-of-shanxi/jinci.jpg_320x.webp 320w, https://liudon.com/posts/the-trip-of-shanxi/jinci.jpg_480x.webp 480w, https://liudon.com/posts/the-trip-of-shanxi/jinci.jpg_720x.webp 720w, https://liudon.com/posts/the-trip-of-shanxi/jinci.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-trip-of-shanxi/jinci.jpg\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-trip-of-shanxi/tangyuan.jpg_320x.avif 320w, https://liudon.com/posts/the-trip-of-shanxi/tangyuan.jpg_480x.avif 480w, https://liudon.com/posts/the-trip-of-shanxi/tangyuan.jpg_720x.avif 720w, https://liudon.com/posts/the-trip-of-shanxi/tangyuan.jpg_960x.avif 960w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-trip-of-shanxi/tangyuan.jpg_320x.webp 320w, https://liudon.com/posts/the-trip-of-shanxi/tangyuan.jpg_480x.webp 480w, https://liudon.com/posts/the-trip-of-shanxi/tangyuan.jpg_720x.webp 720w, https://liudon.com/posts/the-trip-of-shanxi/tangyuan.jpg_960x.webp 960w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-trip-of-shanxi/tangyuan.jpg\" alt=\"\"\n         width=\"960\" height=\"1280\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-trip-of-shanxi/xiandian.jpg_320x.avif 320w, https://liudon.com/posts/the-trip-of-shanxi/xiandian.jpg_480x.avif 480w, https://liudon.com/posts/the-trip-of-shanxi/xiandian.jpg_720x.avif 720w, https://liudon.com/posts/the-trip-of-shanxi/xiandian.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-trip-of-shanxi/xiandian.jpg_320x.webp 320w, https://liudon.com/posts/the-trip-of-shanxi/xiandian.jpg_480x.webp 480w, https://liudon.com/posts/the-trip-of-shanxi/xiandian.jpg_720x.webp 720w, https://liudon.com/posts/the-trip-of-shanxi/xiandian.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-trip-of-shanxi/xiandian.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e圣母殿和左右护法。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-trip-of-shanxi/shengmudian.jpg_320x.avif 320w, https://liudon.com/posts/the-trip-of-shanxi/shengmudian.jpg_480x.avif 480w, https://liudon.com/posts/the-trip-of-shanxi/shengmudian.jpg_720x.avif 720w, https://liudon.com/posts/the-trip-of-shanxi/shengmudian.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-trip-of-shanxi/shengmudian.jpg_320x.webp 320w, https://liudon.com/posts/the-trip-of-shanxi/shengmudian.jpg_480x.webp 480w, https://liudon.com/posts/the-trip-of-shanxi/shengmudian.jpg_720x.webp 720w, https://liudon.com/posts/the-trip-of-shanxi/shengmudian.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-trip-of-shanxi/shengmudian.jpg\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-trip-of-shanxi/shengmudian-1.jpg_320x.avif 320w, https://liudon.com/posts/the-trip-of-shanxi/shengmudian-1.jpg_480x.avif 480w, https://liudon.com/posts/the-trip-of-shanxi/shengmudian-1.jpg_720x.avif 720w, https://liudon.com/posts/the-trip-of-shanxi/shengmudian-1.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-trip-of-shanxi/shengmudian-1.jpg_320x.webp 320w, https://liudon.com/posts/the-trip-of-shanxi/shengmudian-1.jpg_480x.webp 480w, https://liudon.com/posts/the-trip-of-shanxi/shengmudian-1.jpg_720x.webp 720w, https://liudon.com/posts/the-trip-of-shanxi/shengmudian-1.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-trip-of-shanxi/shengmudian-1.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-trip-of-shanxi/shengmudian-2.jpg_320x.avif 320w, https://liudon.com/posts/the-trip-of-shanxi/shengmudian-2.jpg_480x.avif 480w, https://liudon.com/posts/the-trip-of-shanxi/shengmudian-2.jpg_720x.avif 720w, https://liudon.com/posts/the-trip-of-shanxi/shengmudian-2.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-trip-of-shanxi/shengmudian-2.jpg_320x.webp 320w, https://liudon.com/posts/the-trip-of-shanxi/shengmudian-2.jpg_480x.webp 480w, https://liudon.com/posts/the-trip-of-shanxi/shengmudian-2.jpg_720x.webp 720w, https://liudon.com/posts/the-trip-of-shanxi/shengmudian-2.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-trip-of-shanxi/shengmudian-2.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e殿前的盘龙柱，最有意思的两个：点赞龙和比耶龙。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-trip-of-shanxi/dianzanlong.jpg_320x.avif 320w, https://liudon.com/posts/the-trip-of-shanxi/dianzanlong.jpg_480x.avif 480w, https://liudon.com/posts/the-trip-of-shanxi/dianzanlong.jpg_720x.avif 720w, https://liudon.com/posts/the-trip-of-shanxi/dianzanlong.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-trip-of-shanxi/dianzanlong.jpg_320x.webp 320w, https://liudon.com/posts/the-trip-of-shanxi/dianzanlong.jpg_480x.webp 480w, https://liudon.com/posts/the-trip-of-shanxi/dianzanlong.jpg_720x.webp 720w, https://liudon.com/posts/the-trip-of-shanxi/dianzanlong.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-trip-of-shanxi/dianzanlong.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-trip-of-shanxi/biyelong.jpg_320x.avif 320w, https://liudon.com/posts/the-trip-of-shanxi/biyelong.jpg_480x.avif 480w, https://liudon.com/posts/the-trip-of-shanxi/biyelong.jpg_720x.avif 720w, https://liudon.com/posts/the-trip-of-shanxi/biyelong.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-trip-of-shanxi/biyelong.jpg_320x.webp 320w, https://liudon.com/posts/the-trip-of-shanxi/biyelong.jpg_480x.webp 480w, https://liudon.com/posts/the-trip-of-shanxi/biyelong.jpg_720x.webp 720w, https://liudon.com/posts/the-trip-of-shanxi/biyelong.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-trip-of-shanxi/biyelong.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-trip-of-shanxi/shu-1.jpg_320x.avif 320w, https://liudon.com/posts/the-trip-of-shanxi/shu-1.jpg_480x.avif 480w, https://liudon.com/posts/the-trip-of-shanxi/shu-1.jpg_720x.avif 720w, https://liudon.com/posts/the-trip-of-shanxi/shu-1.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-trip-of-shanxi/shu-1.jpg_320x.webp 320w, https://liudon.com/posts/the-trip-of-shanxi/shu-1.jpg_480x.webp 480w, https://liudon.com/posts/the-trip-of-shanxi/shu-1.jpg_720x.webp 720w, https://liudon.com/posts/the-trip-of-shanxi/shu-1.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-trip-of-shanxi/shu-1.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-trip-of-shanxi/shu-2.jpg_320x.avif 320w, https://liudon.com/posts/the-trip-of-shanxi/shu-2.jpg_480x.avif 480w, https://liudon.com/posts/the-trip-of-shanxi/shu-2.jpg_720x.avif 720w, https://liudon.com/posts/the-trip-of-shanxi/shu-2.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-trip-of-shanxi/shu-2.jpg_320x.webp 320w, https://liudon.com/posts/the-trip-of-shanxi/shu-2.jpg_480x.webp 480w, https://liudon.com/posts/the-trip-of-shanxi/shu-2.jpg_720x.webp 720w, https://liudon.com/posts/the-trip-of-shanxi/shu-2.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-trip-of-shanxi/shu-2.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-trip-of-shanxi/shu-3.jpg_320x.avif 320w, https://liudon.com/posts/the-trip-of-shanxi/shu-3.jpg_480x.avif 480w, https://liudon.com/posts/the-trip-of-shanxi/shu-3.jpg_720x.avif 720w, https://liudon.com/posts/the-trip-of-shanxi/shu-3.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-trip-of-shanxi/shu-3.jpg_320x.webp 320w, https://liudon.com/posts/the-trip-of-shanxi/shu-3.jpg_480x.webp 480w, https://liudon.com/posts/the-trip-of-shanxi/shu-3.jpg_720x.webp 720w, https://liudon.com/posts/the-trip-of-shanxi/shu-3.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-trip-of-shanxi/shu-3.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-trip-of-shanxi/xiaofangzi.jpg_320x.avif 320w, https://liudon.com/posts/the-trip-of-shanxi/xiaofangzi.jpg_480x.avif 480w, https://liudon.com/posts/the-trip-of-shanxi/xiaofangzi.jpg_720x.avif 720w, https://liudon.com/posts/the-trip-of-shanxi/xiaofangzi.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-trip-of-shanxi/xiaofangzi.jpg_320x.webp 320w, https://liudon.com/posts/the-trip-of-shanxi/xiaofangzi.jpg_480x.webp 480w, https://liudon.com/posts/the-trip-of-shanxi/xiaofangzi.jpg_720x.webp 720w, https://liudon.com/posts/the-trip-of-shanxi/xiaofangzi.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-trip-of-shanxi/xiaofangzi.jpg\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e各种古树古建，还有西游记里孙悟空变的小房子。\u003c/p\u003e\n\u003cp\u003e逛了一圈3个小时，走的时候打包了一瓶晋祠水。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-trip-of-shanxi/jincishui.jpg_320x.avif 320w, https://liudon.com/posts/the-trip-of-shanxi/jincishui.jpg_480x.avif 480w, https://liudon.com/posts/the-trip-of-shanxi/jincishui.jpg_720x.avif 720w, https://liudon.com/posts/the-trip-of-shanxi/jincishui.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-trip-of-shanxi/jincishui.jpg_320x.webp 320w, https://liudon.com/posts/the-trip-of-shanxi/jincishui.jpg_480x.webp 480w, https://liudon.com/posts/the-trip-of-shanxi/jincishui.jpg_720x.webp 720w, https://liudon.com/posts/the-trip-of-shanxi/jincishui.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-trip-of-shanxi/jincishui.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e午饭在酒店附近解决，吃完饭收拾行李出发太原南站，坐高铁返京。\u003c/p\u003e\n\u003ch2 id=\"后记\"\u003e后记\u003c/h2\u003e\n\u003cp\u003e地上文物看山西，这次时间关系只走了山西中部两个城市，期待以后来个山西全境游。\u003c/p\u003e\n\u003cp\u003e山西的消费低，吃饭打车都很便宜。\u003c/p\u003e\n\u003cp\u003e天气凉爽，适合夏天避暑出行。\u003c/p\u003e\n","date_published":"2026-09-07T14:55:05+08:00","tags":["旅行"]},{"title":"博客焕新，记录继续","id":"https://liudon.com/posts/blog-refresh/","url":"https://liudon.com/posts/blog-refresh/","summary":"博客焕新，记录 Terminal 终端主题从想法到实现的过程。","content_html":"\u003ch2 id=\"前言\"\u003e前言\u003c/h2\u003e\n\u003cp\u003e经常访问本站的朋友，可能已经发现本站换了新的主题。\u003c/p\u003e\n\u003cp\u003e回顾折腾博客的这一路，已经用过了5个主题，其中 PaperMod 这个用的时间最长。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecactus\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ejane\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eyinyang\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ememe\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePaperMod\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e一直想换个新主题，但查了一下，没有找到特别喜欢的主题了。\u003c/p\u003e\n\u003cp\u003e查 Hermes 资料时，偶然发现一个类似终端风格的\u003ca href=\"https://blakecrosley.com/guides/hermes\"\u003e网站\u003c/a\u003e。\u003c/p\u003e\n\u003cp\u003e没办法，程序员，就喜欢这种终端风格。😂\u003c/p\u003e\n\u003cp\u003e7月份的时候，用 Codex 搞了一次，搞的 Demo 页效果一般，后来就懒得折腾了，这个事情就又放下了。\u003c/p\u003e\n\u003cp\u003e最近又重新开启折腾博客，又想起这个事情了，这次拿 DeepSeek 先做了一个初版，还行，后面遇到的一些细节、难点问题由 Codex 解决。\u003c/p\u003e\n\u003cp\u003e于是，就有现在这个主题。\u003c/p\u003e\n\u003ch2 id=\"主题介绍\"\u003e主题介绍\u003c/h2\u003e\n\u003cblockquote\u003e\n\u003cp\u003eTerminal — 复古 CRT 风格 Hugo 主题\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\u003cimg src=\"logo.svg\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/p\u003e\n\u003cp\u003e这是一个将网站呈现在橙色荧光 CRT 终端窗口中的 Hugo 主题，灵感来自 blakecrosley.com。\u003c/p\u003e\n\u003cp\u003e文章通过 \u003ccode\u003eless index.md\u003c/code\u003e 打开，目录显示为 \u003ccode\u003els -la\u003c/code\u003e 列表，页脚采用 Vim 风格状态栏， 整个界面在 CRT 扫描线下安静地闪烁。\u003c/p\u003e\n\u003cp\u003e交由 AI 实现时，最核心的一点就是页面简单干净，模拟终端风格。\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e引入了\u003ca href=\"https://liudon.com/posts/blog-performance-optimization/\"\u003e博客加速实践\u003c/a\u003e里的响应式图片布局和静态资源合并特性\u003c/li\u003e\n\u003cli\u003e支持 VIM 终端的快捷键 \u003cspan class=\"terminal-key\"\u003ej\u003c/span\u003e\n / \u003cspan class=\"terminal-key\"\u003ek\u003c/span\u003e\n / \u003cspan class=\"terminal-key\"\u003egg\u003c/span\u003e\n / \u003cspan class=\"terminal-key\"\u003eG\u003c/span\u003e\n 进行滚动操作\u003c/li\u003e\n\u003cli\u003e支持首页/单页的 ASCII 艺术图像\u003c/li\u003e\n\u003c/ul\u003e\n\u003cfigure class=\"align-center \"\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/blog-refresh/home-light.png_320x.avif 320w, https://liudon.com/posts/blog-refresh/home-light.png_480x.avif 480w, https://liudon.com/posts/blog-refresh/home-light.png_720x.avif 720w, https://liudon.com/posts/blog-refresh/home-light.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/blog-refresh/home-light.png_320x.webp 320w, https://liudon.com/posts/blog-refresh/home-light.png_480x.webp 480w, https://liudon.com/posts/blog-refresh/home-light.png_720x.webp 720w, https://liudon.com/posts/blog-refresh/home-light.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/blog-refresh/home-light.png#center\" alt=\"首页效果图\"\n         width=\"1080\" height=\"975\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003cfigcaption\u003e\n            \u003cp\u003e首页效果图\u003c/p\u003e\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003cfigure class=\"align-center \"\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/blog-refresh/lighthouse-result.png_320x.avif 320w, https://liudon.com/posts/blog-refresh/lighthouse-result.png_480x.avif 480w, https://liudon.com/posts/blog-refresh/lighthouse-result.png_720x.avif 720w, https://liudon.com/posts/blog-refresh/lighthouse-result.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/blog-refresh/lighthouse-result.png_320x.webp 320w, https://liudon.com/posts/blog-refresh/lighthouse-result.png_480x.webp 480w, https://liudon.com/posts/blog-refresh/lighthouse-result.png_720x.webp 720w, https://liudon.com/posts/blog-refresh/lighthouse-result.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/blog-refresh/lighthouse-result.png#center\" alt=\"SpeedVitals Performance Report\"\n         width=\"1080\" height=\"401\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003cfigcaption\u003e\n            \u003cp\u003eSpeedVitals Performance Report\u003c/p\u003e\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003ch2 id=\"开发历程\"\u003e开发历程\u003c/h2\u003e\n\u003cp\u003e前前后后折腾了两天，总算搞出来了。\u003c/p\u003e\n\u003cp\u003e主要使用 DeepSeek 和 Codex 配合完成，大部分功能由 DeepSeek 实现，Codex 主要负责解决疑难和细节问题，以及审视方案。\u003c/p\u003e\n\u003cp\u003eDeepSeek 通过 OpenCode GO 调用，共花费 $6，消耗周限额的 40%。\u003c/p\u003e\n\u003cp\u003eCodex 消耗周限额的 70%，共计 1.3 亿 Token。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/blog-refresh/deepseek-usage.png_320x.avif 320w, https://liudon.com/posts/blog-refresh/deepseek-usage.png_480x.avif 480w, https://liudon.com/posts/blog-refresh/deepseek-usage.png_720x.avif 720w, https://liudon.com/posts/blog-refresh/deepseek-usage.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/blog-refresh/deepseek-usage.png_320x.webp 320w, https://liudon.com/posts/blog-refresh/deepseek-usage.png_480x.webp 480w, https://liudon.com/posts/blog-refresh/deepseek-usage.png_720x.webp 720w, https://liudon.com/posts/blog-refresh/deepseek-usage.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/blog-refresh/deepseek-usage.png\" alt=\"\"\n         width=\"1080\" height=\"279\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/blog-refresh/codex-usage.png_320x.avif 320w, https://liudon.com/posts/blog-refresh/codex-usage.png_480x.avif 480w, https://liudon.com/posts/blog-refresh/codex-usage.png_720x.avif 720w, https://liudon.com/posts/blog-refresh/codex-usage.png_1016x.avif 1016w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/blog-refresh/codex-usage.png_320x.webp 320w, https://liudon.com/posts/blog-refresh/codex-usage.png_480x.webp 480w, https://liudon.com/posts/blog-refresh/codex-usage.png_720x.webp 720w, https://liudon.com/posts/blog-refresh/codex-usage.png_1016x.webp 1016w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/blog-refresh/codex-usage.png\" alt=\"\"\n         width=\"1016\" height=\"406\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e实际用下来，两者还是有一些比较明显的区别。\u003c/p\u003e\n\u003cp\u003eDeepSeek 不支持多模态，有些细节需要看截图进行处理，只能交给 Codex 解决。\u003c/p\u003e\n\u003cp\u003e还有一些问题，DeepSeek 容易发散，Codex 能很快定位问题解决掉。\u003c/p\u003e\n\u003ch2 id=\"后记\"\u003e后记\u003c/h2\u003e\n\u003cp\u003e终于换上了一套自己满意的主题了，甚是喜欢。\u003c/p\u003e\n\u003cp\u003e目前可能还有些小问题，还会继续调整。\u003c/p\u003e\n\u003cp\u003e如果您访问过程中发现有什么问题，欢迎评论指出，我会尽快修复。\u003c/p\u003e\n","date_published":"2026-09-04T11:41:08+08:00","tags":["博客优化","hugo"]},{"title":"友链","id":"https://liudon.com/links/","url":"https://liudon.com/links/","summary":"\u003cp\u003e欢迎交换友链，但需要一定条件：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e使用独立域名\u003c/li\u003e\n\u003cli\u003e内容以原创主，保持一定的更新频率\u003c/li\u003e\n\u003cli\u003e上线一年以上，内容十篇以上\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e本站友链相关信息：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e站点名称：流动\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e站点地址：https://liudon.com\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e站点LOGO：https://liudon.com/avatar.png\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e申请友链时，请提供以下信息：\u003c/p\u003e","content_html":"\u003cp\u003e欢迎交换友链，但需要一定条件：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e使用独立域名\u003c/li\u003e\n\u003cli\u003e内容以原创主，保持一定的更新频率\u003c/li\u003e\n\u003cli\u003e上线一年以上，内容十篇以上\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e本站友链相关信息：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e站点名称：流动\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e站点地址：https://liudon.com\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e站点LOGO：https://liudon.com/avatar.png\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e申请友链时，请提供以下信息：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e站点名称\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e站点地址\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e站点LOGO\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e一句话的站点描述\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e下面是友链列表，排名不分先后。\u003c/p\u003e\n\u003cdiv class=\"terminal-cards\"\u003e\n  \n\u003ca class=\"terminal-card\" href=\"https://dvel.me?referer=https://liudon.com\" title=\"Dvel’s Blog\" target=\"_blank\" rel=\"noopener\"\u003e\n  \u003cspan class=\"terminal-card__icon-box\"\u003e\n    \u003cimg class=\"terminal-card__icon\" src=\"https://dvel.me/avatar.png\" alt=\"\" loading=\"lazy\" onerror=\"this.hidden=true;this.nextElementSibling.hidden=false\"\u003e\n    \u003cspan class=\"terminal-card__icon terminal-card__icon--placeholder\" aria-hidden=\"true\" hidden\u003eD\u003c/span\u003e\n  \u003c/span\u003e\n  \u003cspan class=\"terminal-card__text\"\u003e\n    \u003cspan class=\"terminal-card__name\"\u003eDvel’s Blog\u003c/span\u003e\u003cspan class=\"terminal-card__description\"\u003eLess is More.\u003c/span\u003e\n  \u003c/span\u003e\n  \u003cspan class=\"terminal-card__arrow\" aria-hidden=\"true\"\u003e\u0026#8599;\u003c/span\u003e\n\u003c/a\u003e\n\u003ca class=\"terminal-card\" href=\"https://immmmm.com/?referer=https://liudon.com\" title=\"林木木木木木\" target=\"_blank\" rel=\"noopener\"\u003e\n  \u003cspan class=\"terminal-card__icon-box\"\u003e\n    \u003cimg class=\"terminal-card__icon\" src=\"https://cdn.sep.cc/avatar/ba83fa02fc4b2ba621514941307e21be?d=identicon\" alt=\"\" loading=\"lazy\" onerror=\"this.hidden=true;this.nextElementSibling.hidden=false\"\u003e\n    \u003cspan class=\"terminal-card__icon terminal-card__icon--placeholder\" aria-hidden=\"true\" hidden\u003e林\u003c/span\u003e\n  \u003c/span\u003e\n  \u003cspan class=\"terminal-card__text\"\u003e\n    \u003cspan class=\"terminal-card__name\"\u003e林木木木木木\u003c/span\u003e\u003cspan class=\"terminal-card__description\"\u003e木木老师\u003c/span\u003e\n  \u003c/span\u003e\n  \u003cspan class=\"terminal-card__arrow\" aria-hidden=\"true\"\u003e\u0026#8599;\u003c/span\u003e\n\u003c/a\u003e\n\u003ca class=\"terminal-card\" href=\"https://laozhang.org/?referer=https://liudon.com\" title=\"老张博客\" target=\"_blank\" rel=\"noopener\"\u003e\n  \u003cspan class=\"terminal-card__icon-box\"\u003e\n    \u003cimg class=\"terminal-card__icon\" src=\"https://picx.s3.bitiful.net/2023/05/01/644f0e3acd666.png\" alt=\"\" loading=\"lazy\" onerror=\"this.hidden=true;this.nextElementSibling.hidden=false\"\u003e\n    \u003cspan class=\"terminal-card__icon terminal-card__icon--placeholder\" aria-hidden=\"true\" hidden\u003e老\u003c/span\u003e\n  \u003c/span\u003e\n  \u003cspan class=\"terminal-card__text\"\u003e\n    \u003cspan class=\"terminal-card__name\"\u003e老张博客\u003c/span\u003e\u003cspan class=\"terminal-card__description\"\u003e老张头\u003c/span\u003e\n  \u003c/span\u003e\n  \u003cspan class=\"terminal-card__arrow\" aria-hidden=\"true\"\u003e\u0026#8599;\u003c/span\u003e\n\u003c/a\u003e\n\n\u003c/div\u003e\n","date_published":"2026-09-03T14:17:58+08:00","tags":[]},{"title":"博客加速实践","id":"https://liudon.com/posts/blog-performance-optimization/","url":"https://liudon.com/posts/blog-performance-optimization/","summary":"记录一次博客完整的性能优化实践：响应式图片预生成和JS文件延迟加载。","content_html":"\u003cp\u003e目前博客部署在 Cloudflare Pages 服务上，通过 DnsPod 服务做了国内和海外分线路解析。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCloudflare Pages\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e       ↑\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eblog.liudon.xyz\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   ↑         ↑\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e 回源       直接访问\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   │         │\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e腾讯云 CDN    │\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   ↑         ↑\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   国内     海外\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \\       /\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      DNSPod\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        ↑\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    liudon.com\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e因为 Cloudflare 在国内属于反向加速，所以加了一层国内CDN做加速。\u003c/p\u003e\n\u003cp\u003e但总感觉博客访问不快，随便打开一个页面，页面完全处理完都要在秒级，实在是慢。\u003c/p\u003e\n\u003cp\u003e通过 Lighthouse 测试，借助 AI 的能力，又做了一轮新的优化。\u003c/p\u003e\n\u003ch2 id=\"1-增加国内-cdn-节点缓存时间\"\u003e1. 增加国内 CDN 节点缓存时间\u003c/h2\u003e\n\u003cp\u003e腾讯 CDN 首页的响应：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecf-cache-status: DYNAMIC\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecf-ray: ...-AMS\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ex-cache-lookup: Cache Miss\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecache-control: public, must-revalidate, max-age=0\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eage: 0\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ex-nws-log-uuid: ...\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e请求确实经过腾讯云 CDN（x-nws-log-uuid），但腾讯边缘节点没有命中首页缓存，随后回源 Cloudflare，并落到 AMS（阿姆斯特丹）。\u003c/p\u003e\n\u003cp\u003eCloudflare Pages 默认返回 max-age=0, must-revalidate，这是 Pages 的正常默认行为；但腾讯 CDN 如果“遵循源站”，就会频繁回源。\u003c/p\u003e\n\u003cp\u003e通过调整腾讯云 CDN 的缓存规则，增加强制缓存规则解决。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e首页 缓存30分钟\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e/posts 缓存30分钟\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e/tags 缓存30分钟\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e/page 缓存30分钟\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"2-延长指纹资源缓存时间\"\u003e2. 延长指纹资源缓存时间\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecache-control: public, must-revalidate, max-age=14400\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eage: 223\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ex-cache-lookup: Cache Hit\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e当前 CSS / JS 文件名已经包含 hash，可以设置更长的过期时间。\u003c/p\u003e\n\u003cp\u003e通过 _headers 文件配置缓存时间解决。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e/assets/*\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  Cache-Control: public, max-age=31536000, immutable\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"3-修正响应式图片效果\"\u003e3. 修正响应式图片效果\u003c/h2\u003e\n\u003cp\u003e终于来到这次优化的重头戏了。\u003c/p\u003e\n\u003cp\u003e这里之前其实做过一次优化，见\u003ca href=\"https://liudon.com/posts/use-avif-to-optimize-images-on-hugo/\"\u003e当Hugo遇上AVIF，优化图片加载\u003c/a\u003e。\u003c/p\u003e\n\u003cp\u003e当时引入了 AVIF 格式文件，增加了响应式图片效果。\u003c/p\u003e\n\u003cp\u003e但通过 Lighthouse 测试，仍有图片大小的问题。\u003c/p\u003e\n\u003cp\u003e比如\u003ca href=\"https://liudon.com/posts/guangfu-ancient-city-day-trip/\"\u003e广府古城一日游\u003c/a\u003e文章里，整个页面 Lighthouse 给出的图片优化空间是3,914 KiB，接近 4 MB。\u003c/p\u003e\n\u003cp\u003e当前页面的响应式代码如下：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;source\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  type=\u0026#34;image/avif\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  srcset=\u0026#34;IMG_7537.PNG_1080x.avif 1080w\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  sizes=\u0026#34;(min-width: 768px) 1080px, 100vw\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e这里只有 1080x 这一个规格，并不能发挥响应式图片的作用。\u003c/p\u003e\n\u003cp\u003e这里是我理解有误，我理解成浏览器是按页面屏幕大小来做选择了，实际上是按这个元素的占位大小来选择不同规格。\u003c/p\u003e\n\u003cp\u003e页面里多图并排的情况，也会下载 1080x 这个规格的文件，导致大量的流量浪费。\u003c/p\u003e\n\u003cp\u003e另外还有一个问题是，现在的 AVIF / WEBP 格式文件都是提前预处理的。\u003c/p\u003e\n\u003cp\u003e因为每次都是全量生成，虽然现在只生成一个规格，但每次执行耗时都要在 10 分钟以上。\u003c/p\u003e\n\u003cp\u003e如果生成多个规格文件，会导致 Github Actions 执行非常慢。\u003c/p\u003e\n\u003cp\u003e怎么优化这个耗时，一直想优化来着，苦于找不到好的方案。\u003c/p\u003e\n\u003cp\u003e将这些问题反馈给 AI，给出了如下的方案：\u003c/p\u003e\n\u003cp\u003e通过预生成多个规格的 AVIF / WEBP 文件做响应式图片；\u003c/p\u003e\n\u003cp\u003e通过增加流水线缓存，避免每次都全量生成，只做增量更新。\u003c/p\u003e\n\u003ch3 id=\"31-流水线增加媒体处理逻辑\"\u003e3.1 流水线增加媒体处理逻辑\u003c/h3\u003e\n\u003cp\u003e新增.github/scripts/media/package.json文件，内容如下：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u0026#34;name\u0026#34;: \u0026#34;liudon-media-pipeline\u0026#34;,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u0026#34;private\u0026#34;: true,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u0026#34;type\u0026#34;: \u0026#34;module\u0026#34;,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u0026#34;engines\u0026#34;: {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u0026#34;node\u0026#34;: \u0026#34;\u0026gt;=24\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  },\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u0026#34;dependencies\u0026#34;: {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u0026#34;sharp\u0026#34;: \u0026#34;0.35.0\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e新增 \u003ccode\u003e.github/scripts/media/process-media.mjs\u003c/code\u003e，负责统一处理文章中的图片和视频。脚本较长，正文只保留处理流程，完整实现可以直接查看仓库中的 \u003ca href=\"https://github.com/Liudon/liudon.github.io/blob/code/.github/scripts/media/process-media.mjs\"\u003e\u003ccode\u003eprocess-media.mjs\u003c/code\u003e\u003c/a\u003e：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e递归扫描文章目录中的 JPG、JPEG、PNG 和 MP4 文件。\u003c/li\u003e\n\u003cli\u003e根据源文件内容和处理配置生成缓存键，未变化的文件直接复用缓存。\u003c/li\u003e\n\u003cli\u003e按 320、480、720、1080 像素生成响应式图片，不放大尺寸较小的原图。\u003c/li\u003e\n\u003cli\u003e使用 Sharp 同时生成 AVIF 和 WebP，供浏览器按支持情况选择。\u003c/li\u003e\n\u003cli\u003e使用 FFmpeg 处理视频并生成封面，避免在 Hugo 构建阶段重复执行重任务。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e这样可以把耗时的媒体转换放到 GitHub Actions 预处理阶段，Hugo 构建时只需要读取已经生成好的文件。\u003c/p\u003e\n\u003cp\u003e调整 \u003ccode\u003e.github/workflows/main.yml\u003c/code\u003e 文件，修改预处理逻辑为下面内容：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      # ------------------------------------------------------\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      # Media cache\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      #\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      # 第一次：\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      #\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      # media-v1 不存在\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      # -\u0026gt; 全量图片 + 视频处理\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      #\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      # 后续：\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      #\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      # source 未变化\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      # -\u0026gt; exact cache hit\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      #\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      # 修改一张图片/视频\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      # -\u0026gt; restore 最近的 media-v1\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      # -\u0026gt; 只处理变化文件\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      # ------------------------------------------------------\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      - name: Restore media cache\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        uses: actions/cache@v5\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        with:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          path: .cache/media\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          key: media-v1-${{ hashFiles(\u0026#39;content/posts/**/*.jpg\u0026#39;, \u0026#39;content/posts/**/*.jpeg\u0026#39;, \u0026#39;content/posts/**/*.png\u0026#39;, \u0026#39;content/posts/**/*.JPG\u0026#39;, \u0026#39;content/posts/**/*.JPEG\u0026#39;, \u0026#39;content/posts/**/*.PNG\u0026#39;, \u0026#39;content/posts/**/*.mp4\u0026#39;, \u0026#39;content/posts/**/*.MP4\u0026#39;, \u0026#39;static/ArchitectsDaughter-Regular.ttf\u0026#39;, \u0026#39;.github/scripts/media/package.json\u0026#39;, \u0026#39;.github/scripts/media/process-media.mjs\u0026#39;) }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          restore-keys: |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            media-v1-\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      # ------------------------------------------------------\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      # Node.js\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      # ------------------------------------------------------\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      - name: Setup Node.js\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        uses: actions/setup-node@v7\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        with:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          node-version: \u0026#34;24\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          package-manager-cache: false\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      # ------------------------------------------------------\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      # Sharp\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      #\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      # 使用 Sharp 官方预编译 Linux 二进制。\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      #\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      # 不再需要：\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      #\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      # build-essential\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      # libheif-dev\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      # libaom-dev\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      # libwebp-dev\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      # ImageMagick configure/make\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      # ------------------------------------------------------\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      - name: Install Sharp\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        run: |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          npm install \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            --prefix .github/scripts/media \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            --omit=dev \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            --no-audit \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            --no-fund\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      # ------------------------------------------------------\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      # FFmpeg\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      # ------------------------------------------------------\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      - name: Setup FFmpeg\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        shell: bash\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        run: |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          set -euo pipefail\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          NEED_APT=0\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          if ! command -v ffmpeg \u0026gt;/dev/null 2\u0026gt;\u0026amp;1; then\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            NEED_APT=1\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          fi\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          if ! command -v ffprobe \u0026gt;/dev/null 2\u0026gt;\u0026amp;1; then\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            NEED_APT=1\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          fi\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          if ! command -v fc-match \u0026gt;/dev/null 2\u0026gt;\u0026amp;1; then\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            NEED_APT=1\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          fi\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          if [[ \u0026#34;$NEED_APT\u0026#34; == \u0026#34;1\u0026#34; ]]; then\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            sudo apt-get update\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            sudo apt-get install -y \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e              ffmpeg \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e              fontconfig\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          fi\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          echo\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          echo \u0026#34;FFmpeg:\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          ffmpeg -version | head -n 1\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          echo\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          echo \u0026#34;FFprobe:\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          ffprobe -version | head -n 1\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          echo\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          echo \u0026#34;Checking H.264 encoder...\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          if ! ffmpeg -hide_banner -encoders 2\u0026gt;/dev/null | grep -q libx264; then\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            echo \u0026#34;ERROR: FFmpeg does not contain libx264 encoder\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            exit 1\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          fi\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          echo \u0026#34;libx264: OK\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      # ------------------------------------------------------\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      # Process images + videos\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      # ------------------------------------------------------\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      - name: Process media\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        run: |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          node .github/scripts/media/process-media.mjs\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e把 ImageMagick 换成了 Sharp，压缩后的文件更小一些。\u003c/p\u003e\n\u003ch3 id=\"32-hugo-图片解析响应式调整\"\u003e3.2 Hugo 图片解析响应式调整\u003c/h3\u003e\n\u003cp\u003e\u003ca href=\"https://gohugo.io/content-management/image-processing/\"\u003e当前 Hugo 已经可以处理 AVIF\u003c/a\u003e；本站继续在 GitHub Actions 中使用 Sharp 预生成 AVIF/WebP，是为了复用媒体缓存，并避免在 Hugo 生产构建阶段集中处理大量原图。\u003c/p\u003e\n\u003cp\u003e新增 layouts/_default/_markup/render-image.html文件，内容如下：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e/*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e响应式图片尺寸：\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e普通大图：\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"mi\"\u003e320\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u003c/span\u003e \u003cspan class=\"mi\"\u003e480\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u003c/span\u003e \u003cspan class=\"mi\"\u003e720\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u003c/span\u003e \u003cspan class=\"mi\"\u003e1080\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e如果源图片小于\u003c/span\u003e \u003cspan class=\"mi\"\u003e1080\u003c/span\u003e\u003cspan class=\"err\"\u003e：\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e还会自动加入图片实际宽度。\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e例如：\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e源图\u003c/span\u003e \u003cspan class=\"mi\"\u003e900\u003c/span\u003e\u003cspan class=\"n\"\u003epx\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e→\u003c/span\u003e \u003cspan class=\"mi\"\u003e320\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u003c/span\u003e \u003cspan class=\"mi\"\u003e480\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u003c/span\u003e \u003cspan class=\"mi\"\u003e720\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u003c/span\u003e \u003cspan class=\"mi\"\u003e900\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e源图\u003c/span\u003e \u003cspan class=\"mi\"\u003e600\u003c/span\u003e\u003cspan class=\"n\"\u003epx\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e→\u003c/span\u003e \u003cspan class=\"mi\"\u003e320\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u003c/span\u003e \u003cspan class=\"mi\"\u003e480\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u003c/span\u003e \u003cspan class=\"mi\"\u003e600\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e*/\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003erespSizes\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eslice\u003c/span\u003e \u003cspan class=\"mi\"\u003e320\u003c/span\u003e \u003cspan class=\"mi\"\u003e480\u003c/span\u003e \u003cspan class=\"mi\"\u003e720\u003c/span\u003e \u003cspan class=\"mi\"\u003e1080\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e/*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eauto\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e现代浏览器根据\u003c/span\u003e \u003cspan class=\"n\"\u003eCSS\u003c/span\u003e \u003cspan class=\"err\"\u003e布局后的实际尺寸选择图片。\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003efallback\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e如果浏览器不支持\u003c/span\u003e \u003cspan class=\"n\"\u003eauto\u003c/span\u003e\u003cspan class=\"err\"\u003e，则最大按照\u003c/span\u003e \u003cspan class=\"mi\"\u003e1080\u003c/span\u003e\u003cspan class=\"n\"\u003epx\u003c/span\u003e \u003cspan class=\"err\"\u003e处理。\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e*/\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003edataSizes\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003esite\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eParams\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eresponsiveImageSizes\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003edefault\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;box\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eDestination\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eDestination\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ePage\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePage\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eText\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eText\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eTitle\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eTitle\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eresponsiveImages\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePage\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eParams\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eresponsiveImages\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003edefault\u003c/span\u003e \u003cspan class=\"n\"\u003esite\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eParams\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eresponsiveImages\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003edefault\u003c/span\u003e \u003cspan class=\"bp\"\u003etrue\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e/*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003edevelopment\u003c/span\u003e \u003cspan class=\"err\"\u003e环境只输出原图，避免本地预览时生成响应式变体。\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e*/\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"ow\"\u003enot\u003c/span\u003e \u003cspan class=\"n\"\u003ehugo\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eIsProduction\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eresponsiveImages\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"bp\"\u003efalse\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003ewith\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003esrc\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePage\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eResources\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eGetMatch\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eDestination\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eresponsiveImages\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e/*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"err\"\u003e根据源图片宽度生成实际候选尺寸。\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"err\"\u003e最大不会超过源图。\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e*/\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ecandidateSizes\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eslice\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"nb\"\u003erange\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003esize\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003erespSizes\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003ege\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eWidth\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003esize\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ecandidateSizes\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ecandidateSizes\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003eappend\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003esize\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e/*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"err\"\u003e如果源图片实际宽度不是标准档位，\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"err\"\u003e把实际宽度作为最后一档。\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"err\"\u003e例如\u003c/span\u003e \u003cspan class=\"mi\"\u003e900\u003c/span\u003e\u003cspan class=\"n\"\u003epx\u003c/span\u003e\u003cspan class=\"err\"\u003e：\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"mi\"\u003e320\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u003c/span\u003e \u003cspan class=\"mi\"\u003e480\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u003c/span\u003e \u003cspan class=\"mi\"\u003e720\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u003c/span\u003e \u003cspan class=\"mi\"\u003e900\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e*/\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"ow\"\u003enot\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ecandidateSizes\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eWidth\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ecandidateSizes\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ecandidateSizes\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003eappend\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eWidth\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e/*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"err\"\u003e优先\u003c/span\u003e \u003cspan class=\"n\"\u003eAVIF\u003c/span\u003e\u003cspan class=\"err\"\u003e，再\u003c/span\u003e \u003cspan class=\"n\"\u003eWebP\u003c/span\u003e\u003cspan class=\"err\"\u003e。\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e*/\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eimageTypes\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eslice\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;avif\u0026#34;\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;webp\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003epicture\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"nb\"\u003erange\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eimageType\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eimageTypes\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003esrcset\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eslice\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"nb\"\u003erange\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003esize\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ecandidateSizes\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ecompressedImage\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eprintf\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"si\"\u003e%s\u003c/span\u003e\u003cspan class=\"s2\"\u003e_\u003c/span\u003e\u003cspan class=\"si\"\u003e%d\u003c/span\u003e\u003cspan class=\"s2\"\u003ex.\u003c/span\u003e\u003cspan class=\"si\"\u003e%s\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eDestination\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003esize\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eimageType\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ecmSrc\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ePage\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eResources\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eGetMatch\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ecompressedImage\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ecmSrc\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ecmSrc\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eRelPermalink\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003eabsURL\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e/*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"err\"\u003e用实际图片宽度作为\u003c/span\u003e \u003cspan class=\"n\"\u003edescriptor\u003c/span\u003e\u003cspan class=\"err\"\u003e，\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"err\"\u003e不依赖文件名里的数字。\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"o\"\u003e*/\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ecandidate\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eprintf\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"si\"\u003e%s\u003c/span\u003e\u003cspan class=\"s2\"\u003e \u003c/span\u003e\u003cspan class=\"si\"\u003e%d\u003c/span\u003e\u003cspan class=\"s2\"\u003ew\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eurl\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ecmSrc\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eWidth\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003esrcset\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003esrcset\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003eappend\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ecandidate\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"ow\"\u003eand\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eeq\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eimageType\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;webp\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003ehugo\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eIsExtended\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e/*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"err\"\u003e生产构建没有预处理文件时，\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"n\"\u003eWebP\u003c/span\u003e \u003cspan class=\"err\"\u003e仍然可以让\u003c/span\u003e \u003cspan class=\"n\"\u003eHugo\u003c/span\u003e \u003cspan class=\"err\"\u003e自己生成。\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"n\"\u003eAVIF\u003c/span\u003e \u003cspan class=\"err\"\u003e则依赖\u003c/span\u003e \u003cspan class=\"n\"\u003eGitHub\u003c/span\u003e \u003cspan class=\"n\"\u003eAction\u003c/span\u003e \u003cspan class=\"err\"\u003e预处理。\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"o\"\u003e*/\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eresized\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eResize\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eprintf\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"si\"\u003e%d\u003c/span\u003e\u003cspan class=\"s2\"\u003ex \u003c/span\u003e\u003cspan class=\"si\"\u003e%s\u003c/span\u003e\u003cspan class=\"s2\"\u003e \u003c/span\u003e\u003cspan class=\"si\"\u003e%s\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003esize\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eimageType\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003efilter\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eresized\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eRelPermalink\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003eabsURL\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ecandidate\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eprintf\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"si\"\u003e%s\u003c/span\u003e\u003cspan class=\"s2\"\u003e \u003c/span\u003e\u003cspan class=\"si\"\u003e%d\u003c/span\u003e\u003cspan class=\"s2\"\u003ew\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eurl\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eresized\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eWidth\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003esrcset\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003esrcset\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003eappend\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ecandidate\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003egt\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003elen\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003esrcset\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003esource\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"n\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;image/{{ $imageType }}\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"n\"\u003esrcset\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ delimit $srcset \u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34; }}\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"n\"\u003esizes\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ $dataSizes }}\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"o\"\u003e/\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eimg\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ $Destination | safeURL }}\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003ewidth\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ $src.Width }}\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eheight\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ $src.Height }}\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003ealt\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ $Text }}\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003ewith\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eTitle\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003etitle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ . }}\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eloading\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;lazy\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003edecoding\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;async\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"o\"\u003e/\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"n\"\u003epicture\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eimg\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ $Destination | safeURL }}\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003ewidth\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ $src.Width }}\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eheight\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ $src.Height }}\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003ealt\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ $Text }}\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003ewith\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eTitle\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003etitle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ . }}\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eloading\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;lazy\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003edecoding\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;async\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e/\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e第一次执行需要处理全量文件，输出类似如下：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eImages processed : N\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eImages cached    : 0\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e再次执行，输出类似如下：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCACHE IMAGE ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCACHE IMAGE ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eImages processed : 0\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eImages cached    : N\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e至此，图片响应式问题搞定了，流水线的耗时问题也解决了，目前控制在3分钟左右。\u003c/p\u003e\n\u003cp\u003e模板通过 \u003ccode\u003ehugo.IsProduction\u003c/code\u003e 判断构建环境。本地预览使用 development 环境时，\u003ccode\u003eresponsiveImages\u003c/code\u003e 会被设为 \u003ccode\u003efalse\u003c/code\u003e，只输出带有宽高属性的原图，不会进入 \u003ccode\u003e$src.Resize\u003c/code\u003e 分支：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ehugo server --environment development\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e生产构建前需要先运行媒体预处理脚本。否则缺少预生成文件时，主题可能回退到 Hugo 生成 WebP；原图尺寸过大或数量较多时，会明显增加构建内存。对于远大于站点最大展示尺寸的原图，建议先缩小再进入构建流程。\u003c/p\u003e\n\u003ch2 id=\"4-js-文件按需加载\"\u003e4. JS 文件按需加载\u003c/h2\u003e\n\u003cp\u003e图片从数 MB 降下来以后，Lighthouse 中最明显的问题开始变成：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eReduce unused JavaScript\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e目前文章页共引入了两个 JS 文件：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eview-image.min.js 用于点击图片浮窗展示；\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etwikoo.min.js 用于展示twikoo评论；\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e在页面打开后就立即加载这两个文件，而评论部分在页面最下面，这个资源的加载时机不合理。\u003c/p\u003e\n\u003cp\u003e通过 article.js 文件引入 ViewImage 和 Twikoo loader，待用户接近评论区时才真正加载Twikoo评论。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eViewImage\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e+\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eTwikoo loader\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e ↓\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003earticle.js\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eTwikoo 本体\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e ↓\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e用户接近评论区才加载\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e同时通过 Hugo 判断页面是否有插入图片，有的话才加载 ViewImage 代码，改为按需加载。\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e下载 view-image.min.js 到 assets/js/vendor目录下，不再依赖 tokinx.github.io 服务访问。\u003c/li\u003e\n\u003cli\u003e通过 Hugo Pipeline 构建文章页 JS文件引入。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e文件目录：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eassets/js/\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├── article.js\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e└── vendor/\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    └── view-image.min.js\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003earticle.js 文件代码如下：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e\u0026#34;use strict\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"o\"\u003e============================================================\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eHugo\u003c/span\u003e \u003cspan class=\"n\"\u003ebuild\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003etime\u003c/span\u003e \u003cspan class=\"n\"\u003econfiguration\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"o\"\u003e============================================================\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003eTWIKOO_VERSION\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eParams\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003etwikoo\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eversion\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003ejsonify\u003c/span\u003e \u003cspan class=\"p\"\u003e}};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003eTWIKOO_ENV_ID\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eParams\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003etwikoo\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eenvId\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003edefault\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003ejsonify\u003c/span\u003e \u003cspan class=\"p\"\u003e}};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003eTWIKOO_URL\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"err\"\u003e`\u003c/span\u003e\u003cspan class=\"n\"\u003ehttps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e//\u003c/span\u003e\u003cspan class=\"n\"\u003ecdnjs\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecloudflare\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecom\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eajax\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003elibs\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003etwikoo\u003c/span\u003e\u003cspan class=\"o\"\u003e/$\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003eTWIKOO_VERSION\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003etwikoo\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003emin\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ejs\u003c/span\u003e\u003cspan class=\"err\"\u003e`\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"o\"\u003e============================================================\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eViewImage\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"o\"\u003e============================================================\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003einitViewImage\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"n\"\u003ewindow\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eViewImage\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003eimages\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003edocument\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003equerySelectorAll\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"s2\"\u003e\u0026#34;.post-content img\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eimages\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003elength\u003c/span\u003e \u003cspan class=\"o\"\u003e===\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003ewindow\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eViewImage\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003einit\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"s2\"\u003e\u0026#34;.post-content img\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"o\"\u003e============================================================\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eTwikoo\u003c/span\u003e \u003cspan class=\"n\"\u003estate\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"o\"\u003e============================================================\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003elet\u003c/span\u003e \u003cspan class=\"n\"\u003etwikooLoading\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003enull\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003elet\u003c/span\u003e \u003cspan class=\"n\"\u003etwikooInitialized\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"bp\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"o\"\u003e============================================================\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eTwikoo\u003c/span\u003e \u003cspan class=\"n\"\u003einitialization\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"o\"\u003e============================================================\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003einitTwikoo\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etwikooInitialized\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"n\"\u003ewindow\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003etwikoo\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003econtainer\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003edocument\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003equerySelector\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"s2\"\u003e\u0026#34;#tcomment\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"n\"\u003econtainer\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003etwikooInitialized\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"bp\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003etry\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003eresult\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003ewindow\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003etwikoo\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003einit\u003c/span\u003e\u003cspan class=\"p\"\u003e({\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eenvId\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003eTWIKOO_ENV_ID\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eel\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"s2\"\u003e\u0026#34;#tcomment\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003elang\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;zh-CN\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eregion\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;ap-shanghai\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003epath\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003ewindow\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eTWIKOO_MAGIC_PATH\u003c/span\u003e\u003cspan class=\"o\"\u003e||\u003c/span\u003e\u003cspan class=\"n\"\u003ewindow\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003elocation\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epathname\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eresult\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nb\"\u003etypeof\u003c/span\u003e \u003cspan class=\"n\"\u003eresult\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecatch\u003c/span\u003e \u003cspan class=\"o\"\u003e===\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"s2\"\u003e\u0026#34;function\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eresult\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecatch\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eerror\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003etwikooInitialized\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"bp\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003econsole\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eerror\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"s2\"\u003e\u0026#34;Twikoo initialization failed:\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003eerror\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"n\"\u003ecatch\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eerror\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003etwikooInitialized\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"bp\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003econsole\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eerror\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"s2\"\u003e\u0026#34;Twikoo initialization failed:\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eerror\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"o\"\u003e============================================================\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eDynamically\u003c/span\u003e \u003cspan class=\"nb\"\u003eload\u003c/span\u003e \u003cspan class=\"n\"\u003eTwikoo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"o\"\u003e============================================================\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003eloadTwikoo\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ewindow\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003etwikoo\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003einitTwikoo\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003ePromise\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eresolve\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etwikooLoading\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003etwikooLoading\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003etwikooLoading\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003ePromise\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eresolve\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ereject\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003escript\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003edocument\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecreateElement\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"s2\"\u003e\u0026#34;script\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003escript\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esrc\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003eTWIKOO_URL\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003escript\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003easync\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"bp\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003escript\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecrossOrigin\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"s2\"\u003e\u0026#34;anonymous\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003escript\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eonload\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"n\"\u003einitTwikoo\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"n\"\u003eresolve\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003escript\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eonerror\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"n\"\u003etwikooLoading\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"n\"\u003enull\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"n\"\u003ereject\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"n\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eError\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                \u003cspan class=\"err\"\u003e`\u003c/span\u003e\u003cspan class=\"n\"\u003eFailed\u003c/span\u003e \u003cspan class=\"n\"\u003eto\u003c/span\u003e \u003cspan class=\"nb\"\u003eload\u003c/span\u003e \u003cspan class=\"n\"\u003eTwikoo\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003eTWIKOO_URL\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"err\"\u003e`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003edocument\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ehead\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eappendChild\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003escript\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003etwikooLoading\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"o\"\u003e============================================================\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eLazy\u003c/span\u003e \u003cspan class=\"nb\"\u003eload\u003c/span\u003e \u003cspan class=\"n\"\u003eTwikoo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"o\"\u003e============================================================\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003einitLazyTwikoo\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003econtainer\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003edocument\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003equerySelector\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"s2\"\u003e\u0026#34;#tcomment\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"err\"\u003e当前文章没有评论区域：\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"err\"\u003e完全不下载\u003c/span\u003e \u003cspan class=\"n\"\u003eTwikoo\u003c/span\u003e\u003cspan class=\"err\"\u003e。\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"n\"\u003econtainer\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"err\"\u003e老浏览器\u003c/span\u003e \u003cspan class=\"n\"\u003efallback\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"s2\"\u003e\u0026#34;IntersectionObserver\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003ewindow\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eloadTwikoo\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecatch\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003econsole\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eerror\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003eobserver\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eIntersectionObserver\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eentries\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003eshouldLoad\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003eentries\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esome\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"n\"\u003eentry\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"n\"\u003eentry\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eisIntersecting\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"n\"\u003eshouldLoad\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eobserver\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003edisconnect\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eloadTwikoo\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecatch\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eerror\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"n\"\u003econsole\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eerror\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"n\"\u003eerror\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"err\"\u003e用户距离评论区约\u003c/span\u003e \u003cspan class=\"mi\"\u003e1000\u003c/span\u003e\u003cspan class=\"n\"\u003epx\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"err\"\u003e时开始下载\u003c/span\u003e \u003cspan class=\"n\"\u003eTwikoo\u003c/span\u003e\u003cspan class=\"err\"\u003e，\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"err\"\u003e避免滚动到评论区才等待。\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003erootMargin\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"s2\"\u003e\u0026#34;1000px 0px\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eobserver\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eobserve\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003econtainer\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"o\"\u003e============================================================\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eArticle\u003c/span\u003e \u003cspan class=\"n\"\u003einitialization\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"o\"\u003e============================================================\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003einitArticle\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003einitViewImage\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003einitLazyTwikoo\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"o\"\u003e============================================================\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eDOM\u003c/span\u003e \u003cspan class=\"n\"\u003eready\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"o\"\u003e============================================================\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003edocument\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ereadyState\u003c/span\u003e \u003cspan class=\"o\"\u003e===\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;loading\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003edocument\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eaddEventListener\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"s2\"\u003e\u0026#34;DOMContentLoaded\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003einitArticle\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eonce\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"bp\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003einitArticle\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e把原有的 view-image.min.js 和 twikoo.min.js 加载代码全部去掉，在 layouts/partials/extend_footer.html 文件里增加下面代码：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-go-html-template\" data-lang=\"go-html-template\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e{{-\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"na\"\u003e.IsPage\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"cp\"\u003e-}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"cp\"\u003e{{-\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003e$hasImages\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nx\"\u003estrings\u003c/span\u003e\u003cspan class=\"na\"\u003e.Contains\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"na\"\u003e.Content\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;\u0026lt;img\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"cp\"\u003e-}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"cp\"\u003e{{-\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003e$hasComments\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"na\"\u003e.Param\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;comments\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"cp\"\u003e-}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"cp\"\u003e{{-\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003e$hasImages\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003e$hasComments\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"cp\"\u003e-}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"cp\"\u003e{{-\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003e$articleSource\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"nx\"\u003eresources\u003c/span\u003e\u003cspan class=\"na\"\u003e.Get\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e                \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;js/article.js\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"cp\"\u003e-}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"cp\"\u003e{{-\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003e$article\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"nx\"\u003eresources\u003c/span\u003e\u003cspan class=\"na\"\u003e.ExecuteAsTemplate\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e                \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;js/article.generated.js\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e                \u003c/span\u003e\u003cspan class=\"nx\"\u003esite\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e                \u003c/span\u003e\u003cspan class=\"nx\"\u003e$articleSource\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"cp\"\u003e-}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"cp\"\u003e{{-\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003e$bundle\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"nx\"\u003e$article\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"cp\"\u003e-}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"cp\"\u003e{{-\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003e$hasImages\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"cp\"\u003e-}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"cp\"\u003e{{-\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003e$viewImage\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e                \u003c/span\u003e\u003cspan class=\"nx\"\u003eresources\u003c/span\u003e\u003cspan class=\"na\"\u003e.Get\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e                    \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;js/vendor/view-image.min.js\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"cp\"\u003e-}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"cp\"\u003e{{-\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003e$bundle\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e                \u003c/span\u003e\u003cspan class=\"k\"\u003eslice\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e                    \u003c/span\u003e\u003cspan class=\"nx\"\u003e$viewImage\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e                    \u003c/span\u003e\u003cspan class=\"nx\"\u003e$article\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e                \u003c/span\u003e\u003cspan class=\"o\"\u003e|\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eresources\u003c/span\u003e\u003cspan class=\"na\"\u003e.Concat\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e                    \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;js/article.js\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"cp\"\u003e-}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"cp\"\u003e{{-\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eelse\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"cp\"\u003e-}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"cp\"\u003e{{-\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003e$bundle\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e                \u003c/span\u003e\u003cspan class=\"k\"\u003eslice\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003e$article\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e                \u003c/span\u003e\u003cspan class=\"o\"\u003e|\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eresources\u003c/span\u003e\u003cspan class=\"na\"\u003e.Concat\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e                    \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;js/article.js\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"cp\"\u003e-}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"cp\"\u003e{{-\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eend\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"cp\"\u003e-}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"cp\"\u003e{{-\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003e$bundle\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"nx\"\u003e$bundle\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"o\"\u003e|\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eminify\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"o\"\u003e|\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003efingerprint\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;sha256\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"cp\"\u003e-}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"na\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"cp\"\u003e{{\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003e$bundle\u003c/span\u003e\u003cspan class=\"na\"\u003e.RelPermalink\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"cp\"\u003e}}\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"na\"\u003eintegrity\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"cp\"\u003e{{\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003e$bundle\u003c/span\u003e\u003cspan class=\"na\"\u003e.Data.Integrity\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"cp\"\u003e}}\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"na\"\u003ecrossorigin\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;anonymous\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"na\"\u003edefer\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"nt\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"cp\"\u003e{{-\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eend\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"cp\"\u003e-}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e{{-\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eend\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"cp\"\u003e-}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/blog-performance-optimization/lighthouse-result.png_320x.avif 320w, https://liudon.com/posts/blog-performance-optimization/lighthouse-result.png_480x.avif 480w, https://liudon.com/posts/blog-performance-optimization/lighthouse-result.png_720x.avif 720w, https://liudon.com/posts/blog-performance-optimization/lighthouse-result.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/blog-performance-optimization/lighthouse-result.png_320x.webp 320w, https://liudon.com/posts/blog-performance-optimization/lighthouse-result.png_480x.webp 480w, https://liudon.com/posts/blog-performance-optimization/lighthouse-result.png_720x.webp 720w, https://liudon.com/posts/blog-performance-optimization/lighthouse-result.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/blog-performance-optimization/lighthouse-result.png\" alt=\"\"\n         width=\"1080\" height=\"708\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e优化后的 Lighthouse 测试效果，目前自己体感快了一些，不知道是不是错觉。\u003c/p\u003e\n\u003cp\u003e博客优化永无止境，咱这次就先优化到这里。😁\u003c/p\u003e\n","date_published":"2026-09-01T15:14:02+08:00","tags":["Hugo","Lighthouse","博客优化","Avif","Core Web Vitals"]},{"title":"广府古城一日游","id":"https://liudon.com/posts/guangfu-ancient-city-day-trip/","url":"https://liudon.com/posts/guangfu-ancient-city-day-trip/","summary":"\u003cp\u003e6月底给家里添置了辆车，还在磨合期。\u003c/p\u003e\n\u003cp\u003e平时爸妈开的不多，这次暑假回家，想着找一天带爸妈出门逛逛。\u003c/p\u003e\n\u003cp\u003e上午带老妈去医院做了个CT检查，检查完结果要4个小时才能出来。\u003c/p\u003e","content_html":"\u003cp\u003e6月底给家里添置了辆车，还在磨合期。\u003c/p\u003e\n\u003cp\u003e平时爸妈开的不多，这次暑假回家，想着找一天带爸妈出门逛逛。\u003c/p\u003e\n\u003cp\u003e上午带老妈去医院做了个CT检查，检查完结果要4个小时才能出来。\u003c/p\u003e\n\u003cp\u003e昨天下了雨，今天特别凉快，适合外出。\u003c/p\u003e\n\u003cp\u003e虽然拿驾照开车几年了，但是一直没上过高速，稳妥起见，还是走下道在附近逛一逛。\u003c/p\u003e\n\u003cp\u003e之前查了一下，附近近一点的有广府古城和正定古城，正定的话要更远一点，想着下午回来看结果，所以就选择了广府古城。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e广府城，又称永年城，是位于中国河北省邯郸市永年区的一座古城，也是明清广平府府治、永年县县治所在地。\n城址位于永年区东南60公里处的永年洼中，永年洼面积28平方公里，而古县城坐落于延伸至湖中的半岛上。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e从医院出发，导航不走高速，大概1小时40分钟左右到达。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7537.jpg_320x.avif 320w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7537.jpg_480x.avif 480w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7537.jpg_720x.avif 720w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7537.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7537.jpg_320x.webp 320w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7537.jpg_480x.webp 480w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7537.jpg_720x.webp 720w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7537.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/guangfu-ancient-city-day-trip/IMG_7537.jpg\" alt=\"\"\n         width=\"1080\" height=\"2341\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e因为前一天下了雨，先是在107国道辅路下来上桥的地方，有一处大的积水。\u003c/p\u003e\n\u003cp\u003e停车观察了一下有小车经过，应该问题不大，慢慢开了过去。\u003c/p\u003e\n\u003cp\u003e最后在还有20多公里到的地方，又遇到了1公里左右的堵车，原因也是路口中间一个大水坑，两个方向的车全部堵在路上了。\u003c/p\u003e\n\u003cp\u003e这个大水坑要比前面那个更深，开过去的时候前方雷达一直在报警。\u003c/p\u003e\n\u003cp\u003e经过快半个小时的龟速前进，总算过了这段拥堵路段。\u003c/p\u003e\n\u003cp\u003e11点12的时候，终于到了广府古城，耗时近3个小时。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7294.jpeg_320x.avif 320w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7294.jpeg_480x.avif 480w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7294.jpeg_720x.avif 720w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7294.jpeg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7294.jpeg_320x.webp 320w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7294.jpeg_480x.webp 480w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7294.jpeg_720x.webp 720w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7294.jpeg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/guangfu-ancient-city-day-trip/IMG_7294.jpeg\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e我们是从北门进的，城外面一圈水系围绕。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7306.jpg_320x.avif 320w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7306.jpg_480x.avif 480w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7306.jpg_720x.avif 720w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7306.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7306.jpg_320x.webp 320w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7306.jpg_480x.webp 480w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7306.jpg_720x.webp 720w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7306.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/guangfu-ancient-city-day-trip/IMG_7306.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e进去后，全都是各种小店，商业气息浓厚。\u003c/p\u003e\n\u003cp\u003e到饭点时间了，所以先找地方吃饭。\u003c/p\u003e\n\u003cp\u003e美团上查了一下，有个宋海饭店，说是上过央视。\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"IMG_7311.jpg\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/p\u003e\n\u003cp\u003e点了缯肘、特色乱炖、小酥鱼三道菜，味道不错，个人更喜欢缯肘，酥鱼我觉得一般。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7313.JPG_320x.avif 320w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7313.JPG_480x.avif 480w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7313.JPG_720x.avif 720w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7313.JPG_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7313.JPG_320x.webp 320w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7313.JPG_480x.webp 480w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7313.JPG_720x.webp 720w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7313.JPG_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/guangfu-ancient-city-day-trip/IMG_7313.JPG\" alt=\"\"\n         width=\"1080\" height=\"608\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7314.JPG_320x.avif 320w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7314.JPG_480x.avif 480w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7314.JPG_720x.avif 720w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7314.JPG_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7314.JPG_320x.webp 320w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7314.JPG_480x.webp 480w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7314.JPG_720x.webp 720w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7314.JPG_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/guangfu-ancient-city-day-trip/IMG_7314.JPG\" alt=\"\"\n         width=\"1080\" height=\"608\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7315.JPG_320x.avif 320w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7315.JPG_480x.avif 480w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7315.JPG_720x.avif 720w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7315.JPG_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7315.JPG_320x.webp 320w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7315.JPG_480x.webp 480w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7315.JPG_720x.webp 720w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7315.JPG_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/guangfu-ancient-city-day-trip/IMG_7315.JPG\" alt=\"\"\n         width=\"1080\" height=\"608\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e吃完饭，离的不远有个广府署衙，买门票进去逛了逛。\u003c/p\u003e\n\u003cp\u003e大堂里可以免费拍照，让老爸拍了一张。\u003c/p\u003e\n\u003cp\u003e免费的说是6寸照片，结果发现是6寸明信片，右下角只有一个小小的照片；花了20大洋买了升级版的照片，连明信片都给封膜了。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7322.jpeg_320x.avif 320w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7322.jpeg_480x.avif 480w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7322.jpeg_720x.avif 720w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7322.jpeg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7322.jpeg_320x.webp 320w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7322.jpeg_480x.webp 480w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7322.jpeg_720x.webp 720w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7322.jpeg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/guangfu-ancient-city-day-trip/IMG_7322.jpeg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7325.jpeg_320x.avif 320w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7325.jpeg_480x.avif 480w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7325.jpeg_720x.avif 720w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7325.jpeg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7325.jpeg_320x.webp 320w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7325.jpeg_480x.webp 480w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7325.jpeg_720x.webp 720w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7325.jpeg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/guangfu-ancient-city-day-trip/IMG_7325.jpeg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e本以为就一个大堂，门票花的实在太冤了。\u003c/p\u003e\n\u003cp\u003e从旁边往后走，地方越来越大，这署衙可真大啊。\u003c/p\u003e\n\u003cp\u003e屋子不少，里面的摆件都被粘在了桌子上，应该都不是老物件。\u003c/p\u003e\n\u003cp\u003e后面还有一个浮青阁，可以拜一拜。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7365.jpeg_320x.avif 320w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7365.jpeg_480x.avif 480w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7365.jpeg_720x.avif 720w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7365.jpeg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7365.jpeg_320x.webp 320w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7365.jpeg_480x.webp 480w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7365.jpeg_720x.webp 720w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7365.jpeg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/guangfu-ancient-city-day-trip/IMG_7365.jpeg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e最后面是三皇宫，到跟前才发现这里还曾是跑男的场地。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7377.jpeg_320x.avif 320w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7377.jpeg_480x.avif 480w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7377.jpeg_720x.avif 720w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7377.jpeg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7377.jpeg_320x.webp 320w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7377.jpeg_480x.webp 480w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7377.jpeg_720x.webp 720w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7377.jpeg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/guangfu-ancient-city-day-trip/IMG_7377.jpeg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7384.jpeg_320x.avif 320w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7384.jpeg_480x.avif 480w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7384.jpeg_720x.avif 720w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7384.jpeg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7384.jpeg_320x.webp 320w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7384.jpeg_480x.webp 480w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7384.jpeg_720x.webp 720w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7384.jpeg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/guangfu-ancient-city-day-trip/IMG_7384.jpeg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e旁边还有一个小花园，亭台假山流水，一个不少。\u003c/p\u003e\n\u003cp\u003e时间还早，出来后决定上城墙转一转，后来发现大中午上城墙这是一个错误的决定。\u003c/p\u003e\n\u003cp\u003e从署衙出来，这个时候晴天出太阳了，往东走到东门，买门票上城墙。\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"IMG_7422.jpeg\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/p\u003e\n\u003cp\u003e上面其实没有什么东西，大中午的还非常晒，可以远眺北边的一座桥。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7451.jpeg_320x.avif 320w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7451.jpeg_480x.avif 480w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7451.jpeg_720x.avif 720w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7451.jpeg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7451.jpeg_320x.webp 320w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7451.jpeg_480x.webp 480w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7451.jpeg_720x.webp 720w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7451.jpeg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/guangfu-ancient-city-day-trip/IMG_7451.jpeg\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e走到北边的角楼，碰到一个大爷，问了一嘴北门不能下，还好问一下，不然又得走冤枉路。\u003c/p\u003e\n\u003cp\u003e又原路返回，从城里绕回北门，路上娃热的不行，给她买了把编制的扇子。\u003c/p\u003e\n\u003cp\u003e下午2点半准备返程，早上来的时候路上没碰到加油站没加油，得先找地方加油。\u003c/p\u003e\n\u003cp\u003e高德搜了一下，附近都是些小加油点，距离最近的中石油在10公里，导航出发。\u003c/p\u003e\n\u003cp\u003e加完油快3点了，决定今天直接回家，下午5点到家。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7455.jpeg_320x.avif 320w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7455.jpeg_480x.avif 480w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7455.jpeg_720x.avif 720w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7455.jpeg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7455.jpeg_320x.webp 320w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7455.jpeg_480x.webp 480w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7455.jpeg_720x.webp 720w, https://liudon.com/posts/guangfu-ancient-city-day-trip/IMG_7455.jpeg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/guangfu-ancient-city-day-trip/IMG_7455.jpeg\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e第一次开车这么久，坐的屁股疼，一路有惊无险，平安到家。 😄\u003c/p\u003e\n","date_published":"2026-08-27T13:59:14+08:00","tags":["旅行"]},{"title":"我做了一个口播短视频二创工具：VideoRemaker","id":"https://liudon.com/posts/video-remaker-talking-head-video/","url":"https://liudon.com/posts/video-remaker-talking-head-video/","summary":"\u003cp\u003e做自媒体的同学，有个口播视频的需求，希望能帮忙搞个工具出来。\u003c/p\u003e\n\u003cp\u003e以前没有 AI 的时候，我还真不敢接这活，现在有了 AI，决定试试看。\u003c/p\u003e\n\u003cp\u003e前面做了调研，核心就是\u003ca href=\"https://liudon.com/posts/voice-cloning-solution-comparison/\"\u003e语音克隆\u003c/a\u003e和\u003ca href=\"https://liudon.com/posts/lip-sync-video-synthesis-comparison/\"\u003e对口型视频合成\u003c/a\u003e两个能力。\u003c/p\u003e","content_html":"\u003cp\u003e做自媒体的同学，有个口播视频的需求，希望能帮忙搞个工具出来。\u003c/p\u003e\n\u003cp\u003e以前没有 AI 的时候，我还真不敢接这活，现在有了 AI，决定试试看。\u003c/p\u003e\n\u003cp\u003e前面做了调研，核心就是\u003ca href=\"https://liudon.com/posts/voice-cloning-solution-comparison/\"\u003e语音克隆\u003c/a\u003e和\u003ca href=\"https://liudon.com/posts/lip-sync-video-synthesis-comparison/\"\u003e对口型视频合成\u003c/a\u003e两个能力。\u003c/p\u003e\n\u003cp\u003e在 AutoDL 平台先做了分步骤的单独验证，确定可行后再开始进行实际编码。\u003c/p\u003e\n\u003cp\u003e经过两个月左右的开发验证，终于 VibeCoding 出来了第一个小工具 \u003ca href=\"https://videoremaker.liudon.xyz/\"\u003eVideoRemaker\u003c/a\u003e。\u003c/p\u003e\n\u003ch3 id=\"videoremaker-是做什么的\"\u003eVideoRemaker 是做什么的\u003c/h3\u003e\n\u003cp\u003e\u003ca href=\"https://videoremaker.liudon.xyz/\"\u003eVideoRemaker\u003c/a\u003e 主要用于真人口播视频的二次创作。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/video-remaker-talking-head-video/video-remaker-flowchart.png_320x.avif 320w, https://liudon.com/posts/video-remaker-talking-head-video/video-remaker-flowchart.png_480x.avif 480w, https://liudon.com/posts/video-remaker-talking-head-video/video-remaker-flowchart.png_720x.avif 720w, https://liudon.com/posts/video-remaker-talking-head-video/video-remaker-flowchart.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/video-remaker-talking-head-video/video-remaker-flowchart.png_320x.webp 320w, https://liudon.com/posts/video-remaker-talking-head-video/video-remaker-flowchart.png_480x.webp 480w, https://liudon.com/posts/video-remaker-talking-head-video/video-remaker-flowchart.png_720x.webp 720w, https://liudon.com/posts/video-remaker-talking-head-video/video-remaker-flowchart.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/video-remaker-talking-head-video/video-remaker-flowchart.png\" alt=\"VideoRemaker 流程架构图\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e工具首先从原视频中提取音频，通过 ASR 识别原始文案；然后使用 AI 对文案进行改写，并基于原人物声音生成改写后文案对应的新音频。最后，将新音频与准备好的新视频素材进行对口型合成，生成一条新的口播视频。\u003c/p\u003e\n\u003cp\u003e整个过程基本实现了从“原始口播视频”到“新文案、新音频、新画面”的自动化处理。\u003c/p\u003e\n\u003ch3 id=\"videoremaker-使用介绍\"\u003eVideoRemaker 使用介绍\u003c/h3\u003e\n\u003cp\u003eVideoRemaker 分为服务端和客户端。\u003c/p\u003e\n\u003cp\u003e服务端进行授权管理，支持新增/续期/解绑重新生成/禁用/恢复/删除操作。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/video-remaker-talking-head-video/video-remaker-console.png_320x.avif 320w, https://liudon.com/posts/video-remaker-talking-head-video/video-remaker-console.png_480x.avif 480w, https://liudon.com/posts/video-remaker-talking-head-video/video-remaker-console.png_720x.avif 720w, https://liudon.com/posts/video-remaker-talking-head-video/video-remaker-console.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/video-remaker-talking-head-video/video-remaker-console.png_320x.webp 320w, https://liudon.com/posts/video-remaker-talking-head-video/video-remaker-console.png_480x.webp 480w, https://liudon.com/posts/video-remaker-talking-head-video/video-remaker-console.png_720x.webp 720w, https://liudon.com/posts/video-remaker-talking-head-video/video-remaker-console.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/video-remaker-talking-head-video/video-remaker-console.png\" alt=\"\"\n         width=\"1080\" height=\"617\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e客户端需要激活后才能使用，第一次会自动进行环境初始化。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/video-remaker-talking-head-video/video-remaker-init.png_320x.avif 320w, https://liudon.com/posts/video-remaker-talking-head-video/video-remaker-init.png_480x.avif 480w, https://liudon.com/posts/video-remaker-talking-head-video/video-remaker-init.png_720x.avif 720w, https://liudon.com/posts/video-remaker-talking-head-video/video-remaker-init.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/video-remaker-talking-head-video/video-remaker-init.png_320x.webp 320w, https://liudon.com/posts/video-remaker-talking-head-video/video-remaker-init.png_480x.webp 480w, https://liudon.com/posts/video-remaker-talking-head-video/video-remaker-init.png_720x.webp 720w, https://liudon.com/posts/video-remaker-talking-head-video/video-remaker-init.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/video-remaker-talking-head-video/video-remaker-init.png\" alt=\"\"\n         width=\"1080\" height=\"787\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e客户端的完整使用演示，可以参考B站的这个视频，基于\tNVIDIA GeForce RTX 3070 显卡测试，请忽略背景里的网吧杂音。\u003c/p\u003e\n\u003ciframe\n    src=\"//player.bilibili.com/player.html?bvid=BV1yeuQ6VENQ\u0026page=1\"\n    scrolling=\"no\"\n    height=\"768px\"\n    width=\"1024px\"\n    frameborder=\"no\"\n    framespacing=\"0\"\n    allowfullscreen=\"true\"\n\u003e\n\u003c/iframe\u003e\n\u003ch3 id=\"vibecoding体验\"\u003eVibeCoding体验\u003c/h3\u003e\n\u003cp\u003e整个开发过程，一波三折，方案也几经调整。\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e封号 \u0026amp;\u0026amp; 限额\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e早期使用 Claude 出方案，Codex 编码，但是不久 Claude 就被封号了，所以基本上都是 Codex 干的活，官网落地页和管理平台少量使用了 DeepSeek 进行开发。\u003c/p\u003e\n\u003cp\u003e一开始受限于 Codex 的 5h 限额，基本上一个任务就触发限额了。\u003c/p\u003e\n\u003cp\u003e7月份 Codex 不断重置，同时去掉了 5h 限额，终于能愉快的编码了。\u003c/p\u003e\n\u003cp\u003eVibeCoding使人上头，每天起床第一件事就是看 Tibo 今天有没有重置；额度用完了，整个人都不知道干什么了。\u003c/p\u003e\n\u003cp\u003e好的模型事半功倍，DeepSeek 做的事情总会有一些小尾巴，需要 Codex 再处理一下。\u003c/p\u003e\n\u003cp\u003e但是 DeepSeek 便宜量大，速度快，希望正式版能带来更大的惊喜。\u003c/p\u003e\n\u003cp\u003e我用的 OpenCode GO，DeepSeek V4 Flash 比官方的量更多一些，10$ 可以用到 60$ 的用量。\u003c/p\u003e\n\u003cp\u003e欢迎使用\u003ca href=\"https://opencode.ai/go?ref=AYV8HRXRZS\"\u003e我的邀请链接\u003c/a\u003e，我们都能获得 5$ 奖励。\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e调试问题\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e因为手头只有一台 Thinkpad X1 笔记本，没有显卡，没办法完整验证，所以一开始先搞了一个 Linux 服务版，走通了流程。\u003c/p\u003e\n\u003cp\u003e后来朋友给寄了台主机，结果京东路上把机器给弄坏了，没想到京东现在的服务也这么差了。\u003c/p\u003e\n\u003cp\u003e再后来直接到网吧做调试验证了，自从毕业 20年后，第一次再进网吧，居然还没带身份证，又回家折腾了一次。\u003c/p\u003e\n\u003cp\u003e最后还得感谢媳妇，投重金支持我买了块 1T 的硬盘（硬盘现在也变成金子啦），省去了倒腾文件的大量时间。😘\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e网络问题\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e因为涉及到很多模型，文件都非常大。\u003c/p\u003e\n\u003cp\u003e国内网络的问题，导致下载会非常非常慢，Windows离线包的构建花费了非常多的时间。\u003c/p\u003e\n\u003cp\u003e通过AI改进，现在可以做到复用缓存 + 增量更新，相比早期已经是天壤之别了。\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e方案调整\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/video-remaker-talking-head-video/video-remaker-design-docs.png_320x.avif 320w, https://liudon.com/posts/video-remaker-talking-head-video/video-remaker-design-docs.png_480x.avif 480w, https://liudon.com/posts/video-remaker-talking-head-video/video-remaker-design-docs.png_720x.avif 720w, https://liudon.com/posts/video-remaker-talking-head-video/video-remaker-design-docs.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/video-remaker-talking-head-video/video-remaker-design-docs.png_320x.webp 320w, https://liudon.com/posts/video-remaker-talking-head-video/video-remaker-design-docs.png_480x.webp 480w, https://liudon.com/posts/video-remaker-talking-head-video/video-remaker-design-docs.png_720x.webp 720w, https://liudon.com/posts/video-remaker-talking-head-video/video-remaker-design-docs.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/video-remaker-talking-head-video/video-remaker-design-docs.png\" alt=\"\"\n         width=\"1080\" height=\"1117\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e整个方案几经调整，涉及到多个模型，Windows平台环境构建，都在AI的帮助下一个个解决了。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/video-remaker-talking-head-video/codex-stat.png_320x.avif 320w, https://liudon.com/posts/video-remaker-talking-head-video/codex-stat.png_480x.avif 480w, https://liudon.com/posts/video-remaker-talking-head-video/codex-stat.png_720x.avif 720w, https://liudon.com/posts/video-remaker-talking-head-video/codex-stat.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/video-remaker-talking-head-video/codex-stat.png_320x.webp 320w, https://liudon.com/posts/video-remaker-talking-head-video/codex-stat.png_480x.webp 480w, https://liudon.com/posts/video-remaker-talking-head-video/codex-stat.png_720x.webp 720w, https://liudon.com/posts/video-remaker-talking-head-video/codex-stat.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/video-remaker-talking-head-video/codex-stat.png\" alt=\"\"\n         width=\"1080\" height=\"402\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003eCodex的统计，截止到今天一共用了31亿Token。\u003c/p\u003e\n\u003cp\u003e第一次 VibeCoding，很神奇，很有成就感，有点像第一次编程的时刻。\u003c/p\u003e\n","date_published":"2026-08-10T11:09:27+08:00","tags":["VideoRemaker","口播视频","短视频二创","AI视频","文案改写","语音合成","Lip Sync","对口型","VibeCoding"]},{"title":"Windows 下 Codex Cli 更新报 Move-Item is denied 错误的解决","id":"https://liudon.com/posts/windows-codex-update-failed/","url":"https://liudon.com/posts/windows-codex-update-failed/","summary":"记录 Windows 下 Codex Cli 更新报 Move-Item is denied 错误的解决过程，最终定位是杀毒软件防护的原因导致。","content_html":"\u003cp\u003e最近在 VibeCoding 一个小工具，遇到了好几次 Windows下 Codex Cli 更新失败的问题，每次都要花不少时间解决。\u003c/p\u003e\n\u003cp\u003e这次特地把问题搞清楚了，做个记录。\u003c/p\u003e\n\u003ch2 id=\"问题现象\"\u003e问题现象\u003c/h2\u003e\n\u003cp\u003eCodex Cli 有版本更新，使用 Powershell 命令进行更新。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epowershell -NoProfile -ExecutionPolicy Bypass -Command \u0026#39;$env:CODEX_NON_INTERACTIVE=1; irm https://chatgpt.com/codex/install.ps1 | iex\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e执行最后报错。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e==\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003eUpdating\u003c/span\u003e \u003cspan class=\"n\"\u003eCodex\u003c/span\u003e \u003cspan class=\"n\"\u003eCLI\u003c/span\u003e \u003cspan class=\"n\"\u003efrom\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.144\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mi\"\u003e6\u003c/span\u003e \u003cspan class=\"n\"\u003eto\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.146\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e==\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003eDetected\u003c/span\u003e \u003cspan class=\"n\"\u003eplatform\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eWindows\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ex64\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e==\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003eResolved\u003c/span\u003e \u003cspan class=\"n\"\u003eversion\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.146\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e==\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003eDownloading\u003c/span\u003e \u003cspan class=\"n\"\u003eCodex\u003c/span\u003e \u003cspan class=\"n\"\u003eCLI\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eMove\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eItem\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eAccess\u003c/span\u003e \u003cspan class=\"n\"\u003eto\u003c/span\u003e \u003cspan class=\"n\"\u003ethe\u003c/span\u003e \u003cspan class=\"n\"\u003epath\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;C:\\Users\\liudon\\.codex\\packages\\standalone\u003c/span\u003e\u003cspan class=\"se\"\u003e\\r\u003c/span\u003e\u003cspan class=\"s1\"\u003eeleases\\.staging.0.146.0-x86_64-pc-windows-msvc.14684\u0026#39;\u003c/span\u003e \u003cspan class=\"n\"\u003eis\u003c/span\u003e \u003cspan class=\"n\"\u003edenied\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eAt\u003c/span\u003e \u003cspan class=\"n\"\u003eline\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"mi\"\u003e1006\u003c/span\u003e \u003cspan class=\"n\"\u003echar\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"mi\"\u003e13\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e+\u003c/span\u003e             \u003cspan class=\"n\"\u003eMove\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eItem\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eLiteralPath\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003estagingDir\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eDestination\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ereleaseD\u003c/span\u003e \u003cspan class=\"o\"\u003e...\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e+\u003c/span\u003e             \u003cspan class=\"o\"\u003e~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e+\u003c/span\u003e \u003cspan class=\"n\"\u003eCategoryInfo\u003c/span\u003e          \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eWriteError\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eC\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\\\u003cspan class=\"n\"\u003eUsers\u003c/span\u003e\\\u003cspan class=\"n\"\u003eliudon\u003c/span\u003e\u003cspan class=\"o\"\u003e...\u003c/span\u003e\u003cspan class=\"n\"\u003edows\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003emsvc\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mi\"\u003e14684\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"n\"\u003eDirectoryInfo\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eMove\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eItem\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e \u003cspan class=\"n\"\u003eIOException\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e+\u003c/span\u003e \u003cspan class=\"n\"\u003eFullyQualifiedErrorId\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eMoveDirectoryItemIOError\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"n\"\u003eMicrosoft\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePowerShell\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eCommands\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eMoveItemCommand\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"问题原因\"\u003e问题原因\u003c/h2\u003e\n\u003cp\u003e看到 denied 这个错误，首先想到的是权限问题。\u003c/p\u003e\n\u003cp\u003e但我是用的管理员启动的 Powershell 终端，理论上不应该有这个问题。\u003c/p\u003e\n\u003cp\u003e经过跟 ChatGPT 一番沟通定位，最终确认是杀毒软件的防护导致的。\u003c/p\u003e\n\u003cp\u003e我本机安装了腾讯电脑管家，关闭防护后再进行更新就ok了。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# 先清理遗留文件\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ereleases\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;$env:USERPROFILE\\.codex\\packages\\standalone\u003c/span\u003e\u003cspan class=\"se\"\u003e\\r\u003c/span\u003e\u003cspan class=\"s2\"\u003eeleases\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003eGet\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eChildItem\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ereleases\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eForce\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"ne\"\u003eDirectory\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eFilter\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;.staging.*\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e     \u003cspan class=\"n\"\u003eRemove\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eItem\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eRecurse\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eForce\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# 重新进行更新\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003epowershell\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eNoProfile\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eExecutionPolicy\u003c/span\u003e \u003cspan class=\"n\"\u003eBypass\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eCommand\u003c/span\u003e \u003cspan class=\"err\"\u003e`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e   \u003cspan class=\"s1\"\u003e\u0026#39;$env:CODEX_NON_INTERACTIVE=1; irm https://chatgpt.com/codex/install.ps1 | iex\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e==\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003eUpdating\u003c/span\u003e \u003cspan class=\"n\"\u003eCodex\u003c/span\u003e \u003cspan class=\"n\"\u003eCLI\u003c/span\u003e \u003cspan class=\"n\"\u003efrom\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.144\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mi\"\u003e6\u003c/span\u003e \u003cspan class=\"n\"\u003eto\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.146\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e==\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003eDetected\u003c/span\u003e \u003cspan class=\"n\"\u003eplatform\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eWindows\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ex64\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e==\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003eResolved\u003c/span\u003e \u003cspan class=\"n\"\u003eversion\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.146\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e==\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003eDownloading\u003c/span\u003e \u003cspan class=\"n\"\u003eCodex\u003c/span\u003e \u003cspan class=\"n\"\u003eCLI\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e==\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003eC\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\\\u003cspan class=\"n\"\u003eUsers\u003c/span\u003e\\\u003cspan class=\"n\"\u003eliudon\u003c/span\u003e\\\u003cspan class=\"n\"\u003eAppData\u003c/span\u003e\\\u003cspan class=\"n\"\u003eLocal\u003c/span\u003e\\\u003cspan class=\"n\"\u003ePrograms\u003c/span\u003e\\\u003cspan class=\"n\"\u003eOpenAI\u003c/span\u003e\\\u003cspan class=\"n\"\u003eCodex\u003c/span\u003e\\\u003cspan class=\"n\"\u003ebin\u003c/span\u003e \u003cspan class=\"n\"\u003eis\u003c/span\u003e \u003cspan class=\"n\"\u003ealready\u003c/span\u003e \u003cspan class=\"n\"\u003eon\u003c/span\u003e \u003cspan class=\"n\"\u003ePATH\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e==\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003eCurrent\u003c/span\u003e \u003cspan class=\"n\"\u003ePowerShell\u003c/span\u003e \u003cspan class=\"n\"\u003esession\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003ecodex\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e==\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003eFuture\u003c/span\u003e \u003cspan class=\"n\"\u003ePowerShell\u003c/span\u003e \u003cspan class=\"n\"\u003ewindows\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eopen\u003c/span\u003e \u003cspan class=\"n\"\u003ea\u003c/span\u003e \u003cspan class=\"n\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003ePowerShell\u003c/span\u003e \u003cspan class=\"n\"\u003ewindow\u003c/span\u003e \u003cspan class=\"ow\"\u003eand\u003c/span\u003e \u003cspan class=\"n\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003ecodex\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eCodex\u003c/span\u003e \u003cspan class=\"n\"\u003eCLI\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.146\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e \u003cspan class=\"n\"\u003einstalled\u003c/span\u003e \u003cspan class=\"n\"\u003esuccessfully\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","date_published":"2026-07-30T10:48:09+08:00","tags":["codex"]},{"title":"Caddy 转发 GOST 报 TLS internal error 问题的排查与解决","id":"https://liudon.com/posts/caddy-forward-gost-tls-internal-error/","url":"https://liudon.com/posts/caddy-forward-gost-tls-internal-error/","summary":"记录 GOST 客户端通过 Caddy 转发访问 GOST 服务端时出现 TLS internal error 的排查过程，最终定位为客户端通过 IP 连接时未发送 SNI，并使用域名配合 ip 参数解决。","content_html":"\u003ch2 id=\"问题现象\"\u003e问题现象\u003c/h2\u003e\n\u003cp\u003e原本 GOST 服务端直接监听公网 \u003ccode\u003e443\u003c/code\u003e，Windows GOST 客户端通过服务器 IP 连接时可以正常使用。\u003c/p\u003e\n\u003cp\u003e后来为了让公网 \u003ccode\u003e443\u003c/code\u003e 端口由 Caddy 统一管理，将 GOST 调整为监听本机端口，再由 Caddy 通过域名反向代理到 GOST。\u003c/p\u003e\n\u003cp\u003e改造后，Windows GOST 客户端连接失败，并出现：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eremote error: tls: internal error\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e开启 GOST 调试日志后，本地代理调用方还会收到：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHTTP/1.1 503 Service Unavailable\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eProxy-Agent: gost/2.12.0\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eContent-Length: 0\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e一开始容易将问题理解为：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eCaddy 返回了 HTTP 503；\u003c/li\u003e\n\u003cli\u003eGOST 服务端没有正常监听；\u003c/li\u003e\n\u003cli\u003eCaddy 的 \u003ccode\u003ereverse_proxy\u003c/code\u003e 配置错误；\u003c/li\u003e\n\u003cli\u003eWebSocket 路径不一致；\u003c/li\u003e\n\u003cli\u003e用户名或密码错误。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e但后续抓包表明，请求根本没有进入 Caddy 的 HTTP 反向代理阶段，真正的错误发生在 TLS 握手过程中。\u003c/p\u003e\n\u003ch2 id=\"两种部署架构\"\u003e两种部署架构\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e代理域名：proxy.example.com\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e服务器公网 IP：203.0.113.10\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGOST 本地端口：127.0.0.1:10443\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"架构一gost-客户端直连-gost-服务端\"\u003e架构一：GOST 客户端直连 GOST 服务端\u003c/h3\u003e\n\u003cp\u003e原来的部署结构如下：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e┌─────────────────────────┐\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│ GOST Client             │\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│ relay+mwss              │\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│                         │\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│ 连接 203.0.113.10:443   │\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e└────────────┬────────────┘\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e             │\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e             │ TLS\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e             │ WebSocket\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e             │ Relay\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e             ▼\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e┌─────────────────────────┐\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│ GOST Server             │\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│ relay+mwss              │\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│                         │\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│ 监听 0.0.0.0:443        │\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│ GOST 自己处理 TLS       │\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e└─────────────────────────┘\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eGOST 服务端示例：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker run -d \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --name gost \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --restart unless-stopped \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --network host \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -v \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003eCERT_DIR\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e:\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003eCERT_DIR\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e:ro\u0026#34;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  ginuerzh/gost \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -L \u003cspan class=\"s2\"\u003e\u0026#34;relay+mwss://\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003eUSER\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e:\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003ePASS\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e@0.0.0.0:443?cert=\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003eCERT\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026amp;key=\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003eKEY\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e客户端使用服务器 IP 连接：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e-F \u003cspan class=\"s2\"\u003e\u0026#34;relay+mwss://user:password@203.0.113.10:443?host=proxy.example.com\u0026amp;sni=proxy.example.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e在这一架构下连接正常。\u003c/p\u003e\n\u003ch3 id=\"架构二gost-客户端通过-caddy-访问-gost\"\u003e架构二：GOST 客户端通过 Caddy 访问 GOST\u003c/h3\u003e\n\u003cp\u003e调整后的部署结构如下：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e┌─────────────────────────┐\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│ GOST Client             │\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│ relay+mwss              │\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│                         │\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│ 连接 Caddy 公网 443     │\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e└────────────┬────────────┘\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e             │\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e             │ TLS\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e             │ WebSocket\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e             ▼\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e┌─────────────────────────┐\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│ Caddy                   │\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│                         │\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│ 监听公网 :443           │\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│ 终止 TLS                │\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│ 根据域名选择站点        │\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e└────────────┬────────────┘\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e             │\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e             │ 明文 WebSocket\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e             ▼\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e┌─────────────────────────┐\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│ GOST Server             │\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│ relay+mws               │\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│                         │\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│ 127.0.0.1:10443         │\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e└─────────────────────────┘\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e此时 TLS 由 Caddy 处理：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e客户端 → Caddy：relay+mwss\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCaddy → GOST：relay+mws\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eGOST 服务端改为：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker run -d \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --name gost \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --restart unless-stopped \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --network host \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  ginuerzh/gost \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -L \u003cspan class=\"s2\"\u003e\u0026#34;relay+mws://\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003eUSER\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e:\u003c/span\u003e\u003cspan class=\"si\"\u003e${\u003c/span\u003e\u003cspan class=\"nv\"\u003ePASS\u003c/span\u003e\u003cspan class=\"si\"\u003e}\u003c/span\u003e\u003cspan class=\"s2\"\u003e@127.0.0.1:10443\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eCaddy 配置为：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-caddyfile\" data-lang=\"caddyfile\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gh\"\u003eproxy.example.com\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"k\"\u003ereverse_proxy\u003c/span\u003e \u003cspan class=\"n\"\u003e127.0.0.1\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"mi\"\u003e10443\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e客户端仍然使用原来的 IP 连接方式：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e-F \u003cspan class=\"s2\"\u003e\u0026#34;relay+mwss://user:password@203.0.113.10:443?host=proxy.example.com\u0026amp;sni=proxy.example.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e此时开始出现：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eremote error: tls: internal error\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"排查过程\"\u003e排查过程\u003c/h2\u003e\n\u003ch3 id=\"确认-sni-和-host-所在的阶段\"\u003e确认 SNI 和 Host 所在的阶段\u003c/h3\u003e\n\u003cp\u003e一次 \u003ccode\u003emwss\u003c/code\u003e 连接大致经过：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e1. 建立 TCP 连接\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2. 发送 TLS ClientHello\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e3. 在 ClientHello 中携带 SNI\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e4. 完成 TLS 握手\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e5. 发送 WebSocket HTTP 请求\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e6. 在 HTTP 请求中携带 Host\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e7. 进行 GOST Relay 握手\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e因此：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSNI：在 TLS 握手阶段发送\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHost：在 TLS 完成后的 HTTP 请求中发送\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e如果 TLS 阶段已经失败，那么客户端配置中的：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ehost=proxy.example.com\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e根本没有机会发送到 Caddy。\u003c/p\u003e\n\u003cp\u003e这意味着排查时不能只看客户端命令行参数，还必须确认它实际发出的 TLS ClientHello 中是否存在 SNI。\u003c/p\u003e\n\u003ch3 id=\"使用-curl-验证-caddy-本身\"\u003e使用 curl 验证 Caddy 本身\u003c/h3\u003e\n\u003cp\u003e先使用 \u003ccode\u003ecurl\u003c/code\u003e 强制将域名解析到指定服务器 IP：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-powershell\" data-lang=\"powershell\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ecurl\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"py\"\u003eexe\u003c/span\u003e \u003cspan class=\"n\"\u003e-vk\u003c/span\u003e \u003cspan class=\"p\"\u003e`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003e-resolve\u003c/span\u003e \u003cspan class=\"n\"\u003eproxy\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"py\"\u003eexample\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecom\u003c/span\u003e\u003cspan class=\"err\"\u003e:\u003c/span\u003e\u003cspan class=\"mf\"\u003e443\u003c/span\u003e\u003cspan class=\"err\"\u003e:\u003c/span\u003e\u003cspan class=\"mf\"\u003e203.0\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"py\"\u003e113\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"py\"\u003e10\u003c/span\u003e \u003cspan class=\"p\"\u003e`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"n\"\u003ehttps\u003c/span\u003e\u003cspan class=\"err\"\u003e:\u003c/span\u003e\u003cspan class=\"p\"\u003e//\u003c/span\u003e\u003cspan class=\"n\"\u003eproxy\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"py\"\u003eexample\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecom\u003c/span\u003e\u003cspan class=\"p\"\u003e/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e如果能正常完成 TLS 并返回类似：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHTTP/2 404\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e说明以下部分基本正常：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e公网 \u003ccode\u003e443\u003c/code\u003e 可达；\u003c/li\u003e\n\u003cli\u003eCaddy 正在监听；\u003c/li\u003e\n\u003cli\u003eCaddy 管理的证书可用；\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eproxy.example.com\u003c/code\u003e 站点能够正确匹配；\u003c/li\u003e\n\u003cli\u003e使用域名作为 SNI 时，TLS 握手可以完成。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e这里返回 \u003ccode\u003e404\u003c/code\u003e 并不代表 GOST 有问题。\u003c/p\u003e\n\u003cp\u003e普通 \u003ccode\u003ecurl\u003c/code\u003e 请求不是合法的 GOST WebSocket 请求，因此返回普通 HTTP 错误是正常现象。这个测试的目的只是验证 Caddy 的 TLS 和站点匹配。\u003c/p\u003e\n\u003ch3 id=\"使用-tshark-检查客户端是否发送-sni\"\u003e使用 tshark 检查客户端是否发送 SNI\u003c/h3\u003e\n\u003cp\u003e安装 \u003ccode\u003etshark\u003c/code\u003e：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo apt update\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo apt install -y tshark\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e实时查看访问公网 \u003ccode\u003e443\u003c/code\u003e 的 TLS ClientHello：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo tshark \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -i any \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -f \u003cspan class=\"s1\"\u003e\u0026#39;tcp port 443\u0026#39;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -Y \u003cspan class=\"s1\"\u003e\u0026#39;tls.handshake.type == 1\u0026#39;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -T fields \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -e ip.src \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -e tcp.srcport \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -e tls.handshake.extensions_server_name\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e启动 Windows GOST 客户端后，输出类似：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e198.51.100.25    17619\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e198.51.100.25    17620\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e最后一列本应显示：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eproxy.example.com\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e但实际为空。\u003c/p\u003e\n\u003cp\u003e这说明客户端真实发送的是：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eTCP 目标：203.0.113.10:443\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eTLS SNI：空\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e虽然客户端参数里配置了：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esni=proxy.example.com\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e但在当前使用的 GOST v2.12.0 和 \u003ccode\u003erelay+mwss\u003c/code\u003e 组合下，该参数没有真正进入 TLS ClientHello。\u003c/p\u003e\n\u003ch3 id=\"抓取完整请求确认失败位置\"\u003e抓取完整请求确认失败位置\u003c/h3\u003e\n\u003cp\u003e为了确认请求是否进入 GOST 后端，可以同时抓取公网 \u003ccode\u003e443\u003c/code\u003e 和本机 \u003ccode\u003e10443\u003c/code\u003e：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo tshark \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -i any \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -f \u003cspan class=\"s1\"\u003e\u0026#39;tcp port 443 or tcp port 10443\u0026#39;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -w /tmp/gost-test.pcapng\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e客户端连接一次，出现错误后停止抓包。\u003c/p\u003e\n\u003cp\u003e查看 TLS ClientHello：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo tshark \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -r /tmp/gost-test.pcapng \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -Y \u003cspan class=\"s1\"\u003e\u0026#39;tcp.dstport == 443 \u0026amp;\u0026amp; tls.handshake.type == 1\u0026#39;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -T fields \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -e frame.number \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -e frame.time \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -e ip.src \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -e tcp.srcport \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -e tls.handshake.extensions_server_name\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e结果类似：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e16  Jul 30, 2026 09:56:08.224178672 CST  198.51.100.25  17619\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e26  Jul 30, 2026 09:56:08.466286059 CST  198.51.100.25  17620\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eSNI 字段仍然为空。\u003c/p\u003e\n\u003cp\u003e接着查看 Caddy 是否向 GOST 后端发送了请求：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo tshark \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -r /tmp/gost-test.pcapng \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -Y \u003cspan class=\"s1\"\u003e\u0026#39;tcp.dstport == 10443 \u0026amp;\u0026amp; http.request\u0026#39;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -T fields \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -e frame.number \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -e frame.time \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -e http.request.method \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -e http.host \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -e http.request.uri \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -e http.upgrade\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e没有任何输出。\u003c/p\u003e\n\u003cp\u003e这说明请求没有进入：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e127.0.0.1:10443\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e也就是 Caddy 尚未执行：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-caddyfile\" data-lang=\"caddyfile\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gh\"\u003ereverse_proxy\u003c/span\u003e \u003cspan class=\"gh\"\u003e127.0.0.1:10443\u003c/span\u003e\u003cspan class=\"p\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e连接就已经失败。\u003c/p\u003e\n\u003ch3 id=\"查看-tls-alert\"\u003e查看 TLS Alert\u003c/h3\u003e\n\u003cp\u003e继续查看 TLS Alert：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo tshark \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -r /tmp/gost-test.pcapng \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -Y \u003cspan class=\"s1\"\u003e\u0026#39;tls.alert_message\u0026#39;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -T fields \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -e frame.number \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -e frame.time \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -e ip.src \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -e ip.dst \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -e tls.alert_message\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e输出类似：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e18  Jul 30, 2026 09:56:08.224555864 CST  203.0.113.10  198.51.100.25  1\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e28  Jul 30, 2026 09:56:08.466625388 CST  203.0.113.10  198.51.100.25  1\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e查看其中一个数据包的详细内容：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo tshark \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -r /tmp/gost-test.pcapng \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -Y \u003cspan class=\"s1\"\u003e\u0026#39;frame.number == 18\u0026#39;\u003c/span\u003e \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -V\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e可以看到：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eTransport Layer Security\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    TLSv1.2 Record Layer: Alert\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        Level: Fatal\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        Description: Internal Error\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e完整失败路径已经明确：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eWindows GOST\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e→ 连接 203.0.113.10:443\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e→ ClientHello 没有 SNI\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e→ Caddy 在 TLS 阶段返回 Fatal Internal Error\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e→ 未进入 HTTP/WebSocket\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e→ 未转发到 127.0.0.1:10443\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e→ Windows 本地 GOST 返回 HTTP 503\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"解决方案\"\u003e解决方案\u003c/h2\u003e\n\u003ch3 id=\"推荐方案域名作为节点地址使用-ip-指定实际服务器\"\u003e推荐方案：域名作为节点地址，使用 ip 指定实际服务器\u003c/h3\u003e\n\u003cp\u003e推荐将客户端配置改为：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e-F \u003cspan class=\"s2\"\u003e\u0026#34;relay+mwss://user:password@proxy.example.com:443?ip=203.0.113.10\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e这里将两个概念分开：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eproxy.example.com：\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e- 用于 TLS SNI\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e- 用于 WebSocket Host\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e203.0.113.10：\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e- 用于实际建立 TCP 连接\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e客户端实际行为变为：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eTCP 连接目标：203.0.113.10:443\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eTLS SNI：proxy.example.com\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eWebSocket Host：proxy.example.com\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e这相当于只为当前 GOST 节点指定了一个固定 IP，但不会修改系统 hosts，也不会依赖该域名当前的公共 DNS 解析结果。\u003c/p\u003e\n\u003cp\u003eCaddy 不需要任何特殊兼容配置：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-caddyfile\" data-lang=\"caddyfile\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gh\"\u003eproxy.example.com\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"k\"\u003ereverse_proxy\u003c/span\u003e \u003cspan class=\"n\"\u003e127.0.0.1\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"mi\"\u003e10443\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"兼容方案caddy-设置-default_sni\"\u003e兼容方案：Caddy 设置 default_sni\u003c/h3\u003e\n\u003cp\u003e如果客户端无法调整，仍然只能使用 IP 作为节点地址：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e-F \u003cspan class=\"s2\"\u003e\u0026#34;relay+mwss://user:password@203.0.113.10:443?host=proxy.example.com\u0026amp;sni=proxy.example.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e可以在 Caddy 中配置：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-caddyfile\" data-lang=\"caddyfile\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"k\"\u003edefault_sni\u003c/span\u003e \u003cspan class=\"s\"\u003eproxy.example.com\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gh\"\u003eproxy.example.com\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"k\"\u003ereverse_proxy\u003c/span\u003e \u003cspan class=\"n\"\u003e127.0.0.1\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"mi\"\u003e10443\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003ccode\u003edefault_sni\u003c/code\u003e 的作用是：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e当客户端完全没有发送 SNI 时，\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCaddy 将连接按 proxy.example.com 处理。\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e这样即使客户端 ClientHello 中的 SNI 为空，Caddy 仍可以选择对应证书并完成 TLS 握手。\u003c/p\u003e\n\u003cp\u003e不过，这种方式更适合作为旧客户端或特殊客户端的兼容方案。\u003c/p\u003e\n\u003cp\u003e注意：通过 default_sni 的方式兼容，则不能开启 strict_sni_host 校验，否则会导致校验失败出现TLS错误。\u003c/p\u003e\n\u003ch2 id=\"总结\"\u003e总结\u003c/h2\u003e\n\u003cp\u003e这次故障的直接原因是：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGOST 客户端使用服务器 IP 作为 relay+mwss 节点地址时，\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e配置中的 sni 参数没有真正进入 TLS ClientHello。\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e抓包结果显示：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eTLS SNI：空\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eTLS Alert：Fatal Internal Error\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGOST 后端 10443：没有任何请求\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e因此可以排除：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eGOST 后端监听异常；\u003c/li\u003e\n\u003cli\u003eCaddy 到 GOST 的反向代理异常；\u003c/li\u003e\n\u003cli\u003eWebSocket Host 或路径异常；\u003c/li\u003e\n\u003cli\u003e用户名密码错误。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e请求在进入这些阶段之前，就已经在 Caddy 的 TLS 握手处失败。\u003c/p\u003e\n\u003cp\u003e两种架构表现不同，关键在于谁负责处理公网 TLS。\u003c/p\u003e\n\u003cp\u003e在 GOST 客户端直连 GOST 服务端的架构中：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e客户端\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e→ GOST :443\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e公网 \u003ccode\u003e443\u003c/code\u003e 只有一个 GOST TLS 监听器。\u003c/p\u003e\n\u003cp\u003eGOST 不需要根据 SNI 区分多个 HTTPS 站点，即使客户端不发送 SNI，请求也仍然会进入这个唯一监听器，因此连接可以成功。\u003c/p\u003e\n\u003cp\u003e而在 Caddy 转发 GOST 的架构中：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e客户端\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e→ Caddy :443\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e→ GOST 127.0.0.1:10443\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e公网 TLS 由 Caddy 处理。\u003c/p\u003e\n\u003cp\u003eCaddy 需要在 TLS ClientHello 阶段根据 SNI 选择：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e对应的站点；\u003c/li\u003e\n\u003cli\u003e对应的 TLS 证书；\u003c/li\u003e\n\u003cli\u003e后续的 HTTP 路由。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e当客户端没有发送 SNI 时，Caddy 无法正常完成对应域名的 TLS 处理，于是在 WebSocket Host、Relay 认证和反向代理发生之前，直接返回：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eFatal Internal Error\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","date_published":"2026-07-30T10:30:00+08:00","tags":["Caddy","GOST","TLS","SNI","WebSocket","tshark"]},{"title":"2026年对口型视频合成方案对比：Wav2Lip、VideoReTalking、MuseTalk 部署与实测","id":"https://liudon.com/posts/lip-sync-video-synthesis-comparison/","url":"https://liudon.com/posts/lip-sync-video-synthesis-comparison/","summary":"实测对比 Wav2Lip、VideoReTalking 和 MuseTalk 三种对口型视频合成方案，分析部署难度、推理速度、画面质量和适用场景。","content_html":"\u003cp\u003e朋友有个口播视频合成的需求，这段时间做了些调研，核心是两个能力：\u003ca href=\"https://liudon.com/posts/voice-cloning-solution-comparison/\"\u003e音色克隆\u003c/a\u003e和对口型视频合成。\u003c/p\u003e\n\u003cp\u003e上一篇我们已经讲了音色克隆，今天我们来看一下对口型视频合成的实现。\u003c/p\u003e\n\u003ch2 id=\"方案总结\"\u003e方案总结\u003c/h2\u003e\n\u003ctable\u003e\n\t\u003cthead\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003cth\u003e方案\u003c/th\u003e\n\t\t\t\t\t\u003cth\u003e部署难度\u003c/th\u003e\n\t\t\t\t\t\u003cth\u003e推理速度\u003c/th\u003e\n\t\t\t\t\t\u003cth\u003e画面质量\u003c/th\u003e\n\t\t\t\t\t\u003cth\u003e适合场景\u003c/th\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/thead\u003e\n\t\u003ctbody\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eWav2Lip / Easy-Wav2Lip\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e中等\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eFast 模式最快，Enhanced 模式最慢\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e一般，嘴部和脸部容易模糊，可以引入 \u003cstrong\u003eGFPGAN\u003c/strong\u003e 进行后处理优化\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e快速验证、低成本批量测试\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eVideo-ReTalking\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e较高\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e中等偏慢\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e较好，带人脸增强流程\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e高质量离线视频合成\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eMuseTalk\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e较高\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e较快\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e本次测试最好\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e数字人、实时或准实时口型驱动\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e从本次测试结果看，如果只是快速验证流程，Wav2Lip / Easy-Wav2Lip 成本最低；如果更重视最终观感，可以考虑 Video-ReTalking；如果希望在速度和效果之间取得更好的平衡，MuseTalk 是目前更推荐的方案。\u003c/p\u003e\n\u003ch2 id=\"部署验证\"\u003e部署验证\u003c/h2\u003e\n\u003cblockquote\u003e\n\u003cp\u003e本次所有测试全部在\u003ca href=\"https://autodl.com/\"\u003eAutoDL\u003c/a\u003e平台进行。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e测试机器规格如下：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGPU RTX 4090(24GB) * 1\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCPU 16 vCPU Intel(R) Xeon(R) Platinum 8352V CPU @ 2.10GHz\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e内存 120GB\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e硬盘 系统盘:30 GB\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    数据盘:免费:50GB SSD  付费:0GB\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cstrong\u003e省钱提示：\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eAutoDL有开机和无卡开机两种模式，无卡开机每小时0.1元，在环境部署阶段使用无卡开机模式，部署完成后再切换到正常开机模式测试。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch3 id=\"wav2lip\"\u003eWav2Lip\u003c/h3\u003e\n\u003cp\u003e基于2020年的\u003ca href=\"https://arxiv.org/abs/2008.10010\"\u003eA Lip Sync Expert Is All You Need for Speech to Lip Generation In the Wild\u003c/a\u003e论文实现，最经典的对口型方案，项目资料多、社区使用经验丰富。\u003c/p\u003e\n\u003cp\u003e项目地址：\n\u003ca href=\"https://github.com/Rudrabha/Wav2Lip\"\u003ehttps://github.com/Rudrabha/Wav2Lip\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/anothermartz/Easy-Wav2Lip\"\u003ehttps://github.com/anothermartz/Easy-Wav2Lip\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e本次使用Easy-Wav2Lip进行部署验证。\u003c/p\u003e\n\u003ch4 id=\"部署测试\"\u003e部署测试\u003c/h4\u003e\n\u003col\u003e\n\u003cli\u003e创建虚拟环境\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003econda create -n wav2lip python=3.10 -y\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003econda activate wav2lip\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"2\"\u003e\n\u003cli\u003e克隆代码\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit clone https://github.com/anothermartz/Easy-Wav2Lip.git\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecd Easy-Wav2Lip\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"3\"\u003e\n\u003cli\u003e安装依赖\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epip install -r requirements.txt\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"4\"\u003e\n\u003cli\u003e下载模型\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epython install.py\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"5\"\u003e\n\u003cli\u003e合成测试\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epython inference.py \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    --checkpoint_path checkpoints/Wav2Lip.pth \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    --face input.mp4 \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    --audio input.wav \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    --outfile output.mp4 \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    --out_height 1608\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e默认合成的视频分辨率较低，可以通过 \u003ccode\u003e--out_height\u003c/code\u003e 指定输出视频高度，这里设置为原视频高度，以尽量保持输出分辨率。\u003c/p\u003e\n\u003cp\u003e支持三档质量模式：\u003c/p\u003e\n\u003ctable\u003e\n\t\u003cthead\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003cth\u003e模式\u003c/th\u003e\n\t\t\t\t\t\u003cth\u003e说明\u003c/th\u003e\n\t\t\t\t\t\u003cth\u003e速度\u003c/th\u003e\n\t\t\t\t\t\u003cth\u003e质量\u003c/th\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/thead\u003e\n\t\u003ctbody\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003eFast\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e原始 Wav2Lip\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e最快\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e基础\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003eImproved\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eWav2Lip + 嘴部羽化遮罩\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e快\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e较好，去除嘴部方块感\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003e\u003cstrong\u003eEnhanced\u003c/strong\u003e\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eWav2Lip + 遮罩 + GFPGAN 超分辨率\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e较慢\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e最好，面部清晰度大幅提升\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e实际耗时如下：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# 不指定--quality参数，默认为 Fast\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ereal    0m23.950s\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003euser    1m13.251s\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esys     1m1.965s\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# --quality Enhanced\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ereal    13m55.324s\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003euser    196m45.613s\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esys     6m58.818s\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e实际测试指定 \u003cstrong\u003eImproved\u003c/strong\u003e 或者 \u003cstrong\u003eEnhanced\u003c/strong\u003e 档质量，效果反而不如 \u003cstrong\u003eFast\u003c/strong\u003e档；切换使用 \u003cstrong\u003eWav2Lip_GAN.pth\u003c/strong\u003e 模型，效果也没有提升。\u003c/p\u003e\n\u003cp\u003e默认合成后的视频嘴部模糊抖动明显，可以引入 \u003cstrong\u003eGFPGAN\u003c/strong\u003e 进行面部增强。\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e安装 \u003cstrong\u003eGFPGAN\u003c/strong\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit clone https://github.com/TencentARC/GFPGAN.git\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecd GFPGAN\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epip install -r requirements.txt\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epython setup.py develop\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"2\"\u003e\n\u003cli\u003e拆帧\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emkdir -p /tmp/wav2lip_frames /tmp/wav2lip_enhanced\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003effmpeg -i output.mp4 /tmp/wav2lip_frames/%05d.png\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"3\"\u003e\n\u003cli\u003eGFPGAN 逐帧增强\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epython inference_gfpgan.py \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    -i /tmp/wav2lip_frames \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    -o /tmp/wav2lip_enhanced \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    -v 1.4 \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    -s 2 \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    --bg_upsampler none\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"4\"\u003e\n\u003cli\u003e合回视频（保留原音频）\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003effmpeg -framerate 25 -i /tmp/wav2lip_enhanced/restored_imgs/%05d.png \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    -i output.mp4 \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    -map 0:v -map 1:a \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    -c:v libx264 -crf 18 output_enhanced.mp4\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"5\"\u003e\n\u003cli\u003e清理临时文件\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003erm -rf /tmp/wav2lip_frames /tmp/wav2lip_enhanced\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"video-retalking\"\u003eVideo-ReTalking\u003c/h3\u003e\n\u003cp\u003e基于2022年的\u003ca href=\"https://arxiv.org/abs/2211.14758\"\u003eAudio-based Lip Synchronization for Talking Head Video Editing In the Wild\u003c/a\u003e论文实现，由西安电子科技大学、腾讯 AI Lab、清华大学等机构提出的口型同步与表情编辑方案。\u003c/p\u003e\n\u003cp\u003e项目地址：\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/opentalker/video-retalking\"\u003ehttps://github.com/opentalker/video-retalking\u003c/a\u003e\u003c/p\u003e\n\u003ch4 id=\"部署测试-1\"\u003e部署测试\u003c/h4\u003e\n\u003col\u003e\n\u003cli\u003e准备系统依赖\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo apt update\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo apt install -y git wget curl build-essential cmake ffmpeg\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003envidia-smi\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003econda --version\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"2\"\u003e\n\u003cli\u003e克隆项目\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003ecd\u003c/span\u003e ~\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit clone https://github.com/OpenTalker/video-retalking.git --recursive\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003ecd\u003c/span\u003e video-retalking\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"3\"\u003e\n\u003cli\u003e创建环境并安装依赖\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003econda create -n video_retalking \u003cspan class=\"nv\"\u003epython\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e3.8 -y\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003econda activate video_retalking\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epip install \u003cspan class=\"nv\"\u003etorch\u003c/span\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e2.0.1 \u003cspan class=\"nv\"\u003etorchvision\u003c/span\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e0.15.2 \u003cspan class=\"nv\"\u003etorchaudio\u003c/span\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e2.0.2 \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    --index-url https://download.pytorch.org/whl/cu118\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epip install -r requirements.txt\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"4\"\u003e\n\u003cli\u003e下载权重\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003ecd\u003c/span\u003e ~/video-retalking\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emkdir -p checkpoints\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003ecd\u003c/span\u003e checkpoints\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eBASE\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003ehttps://github.com/vinthony/video_retalking/releases/download/v0.0.1\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e f in \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  30_net_gen.pth \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  BFM.zip \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  DNet.pt \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  ENet.pth \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  expression.mat \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  face3d.pth \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  GFPGANv1.3.pth \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  GPEN-BFR-512.pth \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  LNet.pth \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  ParseNet-latest.pth \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  RetinaFace-R50.pth \u003cspan class=\"se\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  shape_predictor_68_face_landmarks.dat\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003edo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  wget -c \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"nv\"\u003e$BASE\u003c/span\u003e\u003cspan class=\"s2\"\u003e/\u003c/span\u003e\u003cspan class=\"nv\"\u003e$f\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003edone\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eunzip -o BFM.zip -d BFM\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003erm BFM.zip\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e权重总大小约 4GB。缺任何一个文件，都可能在加载 checkpoint 阶段报错。\u003c/p\u003e\n\u003col start=\"5\"\u003e\n\u003cli\u003e合成测试\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epython3 inference.py \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --face input.mp4 \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --audio input.wav \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --outfile ./result.mp4\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e实际耗时如下：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ereal    6m13.248s\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003euser    11m8.239s\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esys     1m17.590s\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"musetalk\"\u003eMuseTalk\u003c/h3\u003e\n\u003cp\u003e基于2024年的\u003ca href=\"https://arxiv.org/abs/2410.10122v2\"\u003eReal-Time High Quality Lip Synchronization with Latent Space Inpainting\u003c/a\u003e论文实现，由腾讯音乐天琴实验室开源的实时高质量唇形同步模型。\u003c/p\u003e\n\u003cp\u003e它走潜在空间 inpainting 路线，v1.5 相比早期版本提升了清晰度和唇语同步效果。\u003c/p\u003e\n\u003cp\u003e项目地址：\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/TMElyralab/MuseTalk\"\u003ehttps://github.com/TMElyralab/MuseTalk\u003c/a\u003e\u003c/p\u003e\n\u003ch4 id=\"部署测试-2\"\u003e部署测试\u003c/h4\u003e\n\u003col\u003e\n\u003cli\u003e安装系统依赖\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003envidia-smi\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003econda --version\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo apt update\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo apt install -y git ffmpeg build-essential\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"2\"\u003e\n\u003cli\u003e创建环境\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003econda\u003c/span\u003e \u003cspan class=\"n\"\u003ecreate\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003en\u003c/span\u003e \u003cspan class=\"n\"\u003emusetalk\u003c/span\u003e \u003cspan class=\"n\"\u003epython\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"mf\"\u003e3.10\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ey\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003econda\u003c/span\u003e \u003cspan class=\"n\"\u003eactivate\u003c/span\u003e \u003cspan class=\"n\"\u003emusetalk\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003epip\u003c/span\u003e \u003cspan class=\"n\"\u003einstall\u003c/span\u003e \u003cspan class=\"n\"\u003etorch\u003c/span\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u003cspan class=\"mf\"\u003e2.0\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e \u003cspan class=\"n\"\u003etorchvision\u003c/span\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u003cspan class=\"mf\"\u003e0.15\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mi\"\u003e2\u003c/span\u003e \u003cspan class=\"n\"\u003etorchaudio\u003c/span\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u003cspan class=\"mf\"\u003e2.0\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mi\"\u003e2\u003c/span\u003e \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003eindex\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eurl\u003c/span\u003e \u003cspan class=\"n\"\u003ehttps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e//\u003c/span\u003e\u003cspan class=\"n\"\u003edownload\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epytorch\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eorg\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003ewhl\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003ecu118\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"3\"\u003e\n\u003cli\u003e克隆项目并安装依赖\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003egit\u003c/span\u003e \u003cspan class=\"n\"\u003eclone\u003c/span\u003e \u003cspan class=\"n\"\u003ehttps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e//\u003c/span\u003e\u003cspan class=\"n\"\u003egithub\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecom\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eTMElyralab\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eMuseTalk\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003egit\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ecd\u003c/span\u003e \u003cspan class=\"n\"\u003eMuseTalk\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003epip\u003c/span\u003e \u003cspan class=\"n\"\u003einstall\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003er\u003c/span\u003e \u003cspan class=\"n\"\u003erequirements\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003etxt\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003epip\u003c/span\u003e \u003cspan class=\"n\"\u003einstall\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003eno\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ecache\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003edir\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eU\u003c/span\u003e \u003cspan class=\"n\"\u003eopenmim\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003emim\u003c/span\u003e \u003cspan class=\"n\"\u003einstall\u003c/span\u003e \u003cspan class=\"n\"\u003emmengine\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003emim\u003c/span\u003e \u003cspan class=\"n\"\u003einstall\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;mmcv==2.0.1\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003emim\u003c/span\u003e \u003cspan class=\"n\"\u003einstall\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;mmdet==3.1.0\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003emim\u003c/span\u003e \u003cspan class=\"n\"\u003einstall\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;mmpose==1.1.0\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003epip\u003c/span\u003e \u003cspan class=\"n\"\u003einstall\u003c/span\u003e \u003cspan class=\"n\"\u003emunkres\u003c/span\u003e \u003cspan class=\"n\"\u003ejson_tricks\u003c/span\u003e \u003cspan class=\"n\"\u003extcocotools\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"4\"\u003e\n\u003cli\u003e配置 FFmpeg\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eexport\u003c/span\u003e \u003cspan class=\"n\"\u003eFFMPEG_PATH\u003c/span\u003e\u003cspan class=\"o\"\u003e=$\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ewhich\u003c/span\u003e \u003cspan class=\"n\"\u003effmpeg\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eecho\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;export FFMPEG_PATH=$(which ffmpeg)\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e~/.\u003c/span\u003e\u003cspan class=\"n\"\u003ebashrc\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003esource\u003c/span\u003e \u003cspan class=\"o\"\u003e~/.\u003c/span\u003e\u003cspan class=\"n\"\u003ebashrc\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"5\"\u003e\n\u003cli\u003e下载模型\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eexport\u003c/span\u003e \u003cspan class=\"n\"\u003eHF_ENDPOINT\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003ehttps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e//\u003c/span\u003e\u003cspan class=\"n\"\u003ehf\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003emirror\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecom\u003c/span\u003e \u003cspan class=\"c1\"\u003e# 国内网络可以先设置 HuggingFace 镜像\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ecd\u003c/span\u003e \u003cspan class=\"o\"\u003e~/\u003c/span\u003e\u003cspan class=\"n\"\u003eMuseTalk\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ehf\u003c/span\u003e \u003cspan class=\"n\"\u003edownload\u003c/span\u003e \u003cspan class=\"n\"\u003eTMElyralab\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eMuseTalk\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003elocal\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003edir\u003c/span\u003e \u003cspan class=\"n\"\u003emodels\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ehf\u003c/span\u003e \u003cspan class=\"n\"\u003edownload\u003c/span\u003e \u003cspan class=\"n\"\u003estabilityai\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003esd\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003evae\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eft\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003emse\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003elocal\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003edir\u003c/span\u003e \u003cspan class=\"n\"\u003emodels\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003esd\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003evae\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eft\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003emse\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ehf\u003c/span\u003e \u003cspan class=\"n\"\u003edownload\u003c/span\u003e \u003cspan class=\"n\"\u003eopenai\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003ewhisper\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003etiny\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003elocal\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003edir\u003c/span\u003e \u003cspan class=\"n\"\u003emodels\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003ewhisper\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ehf\u003c/span\u003e \u003cspan class=\"n\"\u003edownload\u003c/span\u003e \u003cspan class=\"n\"\u003eyzd\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ev\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eDWPose\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003einclude\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;dw-ll_ucoco_384.pth\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003elocal\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003edir\u003c/span\u003e \u003cspan class=\"n\"\u003emodels\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003edwpose\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ehf\u003c/span\u003e \u003cspan class=\"n\"\u003edownload\u003c/span\u003e \u003cspan class=\"n\"\u003eByteDance\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eLatentSync\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003einclude\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;latentsync_syncnet.pt\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003elocal\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003edir\u003c/span\u003e \u003cspan class=\"n\"\u003emodels\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003esyncnet\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ehf\u003c/span\u003e \u003cspan class=\"n\"\u003edownload\u003c/span\u003e \u003cspan class=\"n\"\u003eafrizalha\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003emusetalk\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003emodels\u003c/span\u003e \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003einclude\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;face-parse-bisent/79999_iter.pth\u0026#34;\u003c/span\u003e \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003elocal\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003edir\u003c/span\u003e \u003cspan class=\"n\"\u003emodels\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ewget\u003c/span\u003e \u003cspan class=\"n\"\u003ehttps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e//\u003c/span\u003e\u003cspan class=\"n\"\u003edownload\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epytorch\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eorg\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003emodels\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eresnet18\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e5\u003c/span\u003e\u003cspan class=\"n\"\u003ec106cde\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epth\u003c/span\u003e \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eO\u003c/span\u003e \u003cspan class=\"n\"\u003emodels\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eface\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eparse\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ebisent\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eresnet18\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e5\u003c/span\u003e\u003cspan class=\"n\"\u003ec106cde\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epth\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e模型目录大致应包含：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emodels/\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├── musetalk/\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├── musetalkV15/\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├── syncnet/\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├── dwpose/\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├── face-parse-bisent/\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├── sd-vae-ft-mse/\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e└── whisper/\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"6\"\u003e\n\u003cli\u003e合成测试\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epython -m scripts.inference \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    --inference_config configs/inference/my_task.yaml \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    --result_dir results/my_output \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    --unet_model_path models/musetalkV15/unet.pth \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    --unet_config models/musetalkV15/musetalk.json \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    --version v15 \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    --use_float16\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e输出文件会保存在 \u003ccode\u003eresults/my_output/\u003c/code\u003e目录下。\u003c/p\u003e\n\u003cp\u003e实际耗时如下：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ereal    2m54.050s\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003euser    8m12.693s\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esys     0m59.808s\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"效果对比\"\u003e效果对比\u003c/h2\u003e\n\u003ch3 id=\"wav2lip-1\"\u003eWav2Lip\u003c/h3\u003e\n\u003cfigure\u003e\u003cvideo\n        controls\n        playsinline\n        preload=\"none\"\n        poster=\"/posts/lip-sync-video-synthesis-comparison/wav2lip.mp4.poster.webp\"\n        width=\"574\"\n        height=\"1280\"\n        style=\"--video-ratio: 574 / 1280\"\n    \u003e\n        \u003csource\n            src=\"/posts/lip-sync-video-synthesis-comparison/wav2lip.mp4\"\n            type=\"video/mp4\"\n        /\u003e\n\n        您的浏览器不支持 HTML5 视频。\n    \u003c/video\u003e\n\n\u003c/figure\u003e\n\u003ch3 id=\"wav2lip--gfpgan面部增强\"\u003eWav2Lip + GFPGAN面部增强\u003c/h3\u003e\n\u003cfigure\u003e\u003cvideo\n        controls\n        playsinline\n        preload=\"none\"\n        poster=\"/posts/lip-sync-video-synthesis-comparison/wav2lip_gfpgan.mp4.poster.webp\"\n        width=\"574\"\n        height=\"1280\"\n        style=\"--video-ratio: 574 / 1280\"\n    \u003e\n        \u003csource\n            src=\"/posts/lip-sync-video-synthesis-comparison/wav2lip_gfpgan.mp4\"\n            type=\"video/mp4\"\n        /\u003e\n\n        您的浏览器不支持 HTML5 视频。\n    \u003c/video\u003e\n\n\u003c/figure\u003e\n\u003ch3 id=\"video-retalking-1\"\u003eVideo-ReTalking\u003c/h3\u003e\n\u003cfigure\u003e\u003cvideo\n        controls\n        playsinline\n        preload=\"none\"\n        poster=\"/posts/lip-sync-video-synthesis-comparison/video-retalking.mp4.poster.webp\"\n        width=\"574\"\n        height=\"1280\"\n        style=\"--video-ratio: 574 / 1280\"\n    \u003e\n        \u003csource\n            src=\"/posts/lip-sync-video-synthesis-comparison/video-retalking.mp4\"\n            type=\"video/mp4\"\n        /\u003e\n\n        您的浏览器不支持 HTML5 视频。\n    \u003c/video\u003e\n\n\u003c/figure\u003e\n\u003ch3 id=\"musetalk-1\"\u003eMuseTalk\u003c/h3\u003e\n\u003cfigure\u003e\u003cvideo\n        controls\n        playsinline\n        preload=\"none\"\n        poster=\"/posts/lip-sync-video-synthesis-comparison/musetalk.mp4.poster.webp\"\n        width=\"574\"\n        height=\"1280\"\n        style=\"--video-ratio: 574 / 1280\"\n    \u003e\n        \u003csource\n            src=\"/posts/lip-sync-video-synthesis-comparison/musetalk.mp4\"\n            type=\"video/mp4\"\n        /\u003e\n\n        您的浏览器不支持 HTML5 视频。\n    \u003c/video\u003e\n\n\u003c/figure\u003e\n\u003cp\u003e基于本次测试素材来看，MuseTalk 的画面质量最优，Video-ReTalking次之，隐约看见嘴部抖动，Wav2Lip最差，抖动最明显，可以通过 \u003cstrong\u003eGFPGAN\u003c/strong\u003e 进行后处理优化。\u003c/p\u003e\n\u003cp\u003e从合成速度来看，从快到慢依次为：Wav2Lip Fast、MuseTalk、Video-ReTalking、Wav2Lip Enhanced。\u003c/p\u003e\n\u003ch2 id=\"musetalk-vs-wav2lip应该怎么选\"\u003eMuseTalk vs Wav2Lip：应该怎么选？\u003c/h2\u003e\n\u003cp\u003e如果只是快速验证流程或低成本批量测试，Wav2Lip 仍有明显优势：本次 RTX 4090 测试中，Fast 模式单次耗时约 24 秒。若更看重最终画面的清晰度、嘴部稳定性和整体观感，MuseTalk 更值得优先尝试；同一轮测试中其耗时约 2 分 54 秒，画面质量优于 Wav2Lip。\u003c/p\u003e\n\u003cp\u003e这不是不同项目间的绝对性能结论。实际速度和效果还会受到输入视频、音频长度、分辨率、质量模式和硬件环境影响；本文的对比仅对应上述 AutoDL RTX 4090 测试环境与素材。\u003c/p\u003e\n\u003ch2 id=\"结论\"\u003e结论\u003c/h2\u003e\n\u003cp\u003e整体来看，MuseTalk 在本次测试中速度和效果都比较均衡，是三个方案里我目前最推荐继续深入尝试的方案。\u003c/p\u003e\n\u003cp\u003e如果想了解音色克隆与对口型能力如何组合成完整的口播视频流程，可以继续阅读\u003ca href=\"https://liudon.com/posts/video-remaker-talking-head-video/\"\u003e口播短视频二创工具 VideoRemaker\u003c/a\u003e。\u003c/p\u003e\n","date_published":"2026-06-17T15:45:03+08:00","tags":["Wav2Lip","VideoReTalking","MuseTalk","Lip Sync","对口型","AI视频"]},{"title":"2026年音色克隆方案对比：IndexTTS-2、CosyVoice、GPT-SoVITS、Fish Speech、VoxCPM 部署与实测","id":"https://liudon.com/posts/voice-cloning-solution-comparison/","url":"https://liudon.com/posts/voice-cloning-solution-comparison/","summary":"系统对比 IndexTTS-2、CosyVoice、GPT-SoVITS、Fish Speech、VoxCPM 五大音色克隆方案，详解部署步骤、测试方法、硬件要求、CPU 支持、优缺点与选型建议。","content_html":"\u003cp\u003e随着大模型和语音生成技术的发展，音色克隆（Voice Cloning） 已经成为当前 TTS 领域最受关注的方向之一。\u003c/p\u003e\n\u003cp\u003e无论是数字人、AI 配音、语音助手，还是内容生产和个性化交互，越来越多团队开始关注开源音色克隆方案在实际业务中的落地表现。\u003c/p\u003e\n\u003cp\u003e但真正进入部署和测试阶段后，问题往往并不只是“能不能出声音”，而是：哪套方案更容易部署，哪套方案语言混合更稳定，哪套方案的音色相似度更高。\u003c/p\u003e\n\u003cp\u003e本文将围绕 \u003cstrong\u003eIndexTTS-2\u003c/strong\u003e、\u003cstrong\u003eCosyVoice\u003c/strong\u003e、\u003cstrong\u003eGPT-SoVITS\u003c/strong\u003e、\u003cstrong\u003eFish Speech\u003c/strong\u003e、\u003cstrong\u003eVoxCPM\u003c/strong\u003e 五套主流开源音色克隆方案，结合实际部署与测试过程，分析它们在部署复杂度、零样本效果、中英混合能力、服务化支持和后续训练价值上的差异，帮助你更快找到适合自己业务场景的方案。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2026年6月12日更新，添加VoxCPM方案。\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"部署验证\"\u003e部署验证\u003c/h2\u003e\n\u003cblockquote\u003e\n\u003cp\u003e本次所有测试全部在\u003ca href=\"https://autodl.com/\"\u003eAutoDL\u003c/a\u003e平台进行。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e测试机器规格如下：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGPU RTX 4090(24GB) * 1\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCPU 16 vCPU Intel(R) Xeon(R) Platinum 8352V CPU @ 2.10GHz\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e内存 120GB\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e硬盘 系统盘:30 GB\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    数据盘:免费:50GB SSD  付费:0GB\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cstrong\u003e省钱提示：\u003c/strong\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eAutoDL有开机和无卡开机两种模式，无卡开机每小时0.1元，在环境部署阶段使用无卡开机模式，部署完成后再切换到正常开机模式测试。\u003c/p\u003e\n\u003cp\u003e来自亲身的血泪教训，IndexTTS部署的时候用的正常模式，小半天干下去几十块钱。 😭😭😭\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e源音频为我家娃读的一段音频，合成后音频文本内容为“Welcome to Beijing, President Trump.北京欢迎你，特朗普总统”。\u003c/p\u003e\n\u003ch3 id=\"indextts-2\"\u003eIndexTTS-2\u003c/h3\u003e\n\u003cp\u003e项目地址：\u003ca href=\"https://github.com/index-tts/index-tts\"\u003ehttps://github.com/index-tts/index-tts\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIndex-TTS2是一款突破性的自回归零样本文本转语音模型，专为精确时长控制而设计，这对于视频配音等应用至关重要。它实现了情感表达和说话者身份之间的解耦，从而能够独立控制音色和情感。该模型融合了GPT潜在表示，并具有基于文本描述的软指令机制，以增强情感控制。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch4 id=\"部署测试\"\u003e部署测试\u003c/h4\u003e\n\u003col\u003e\n\u003cli\u003e克隆代码\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit lfs install\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit clone https://github.com/index-tts/index-tts.git\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecd index-tts\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit lfs pull\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"2\"\u003e\n\u003cli\u003e安装依赖\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl -LsSf https://astral.sh/uv/install.sh | sh\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esource ~/.bashrc\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003euv sync --all-extras\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# 国内可换镜像\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# uv sync --all-extras --default-index \u0026#34;https://mirrors.aliyun.com/pypi/simple\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"3\"\u003e\n\u003cli\u003e下载模型\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e方式一：huggingface\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# 国内可设置HF镜像\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# export HF_ENDPOINT=\u0026#34;https://hf-mirror.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euv\u003c/span\u003e \u003cspan class=\"k\"\u003etool\u003c/span\u003e \u003cspan class=\"n\"\u003einstall\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;huggingface-hub[cli,hf_xet]\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ehf\u003c/span\u003e \u003cspan class=\"n\"\u003edownload\u003c/span\u003e \u003cspan class=\"n\"\u003eIndexTeam\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eIndexTTS\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e2\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003elocal\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003edir\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003echeckpoints\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e方式二：modelscope\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euv\u003c/span\u003e \u003cspan class=\"k\"\u003etool\u003c/span\u003e \u003cspan class=\"n\"\u003einstall\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;modelscope\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003emodelscope\u003c/span\u003e \u003cspan class=\"n\"\u003edownload\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003emodel\u003c/span\u003e \u003cspan class=\"n\"\u003eIndexTeam\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eIndexTTS\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e2\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003elocal_dir\u003c/span\u003e \u003cspan class=\"n\"\u003echeckpoints\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"4\"\u003e\n\u003cli\u003e环境检测\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euv\u003c/span\u003e \u003cspan class=\"n\"\u003erun\u003c/span\u003e \u003cspan class=\"n\"\u003etools\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003egpu_check\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epy\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eScanning\u003c/span\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003ePyTorch\u003c/span\u003e \u003cspan class=\"n\"\u003ehardware\u003c/span\u003e \u003cspan class=\"n\"\u003eacceleration\u003c/span\u003e \u003cspan class=\"n\"\u003edevices\u003c/span\u003e\u003cspan class=\"o\"\u003e...\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e...\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eHardware\u003c/span\u003e \u003cspan class=\"n\"\u003eacceleration\u003c/span\u003e \u003cspan class=\"n\"\u003edetected\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e \u003cspan class=\"n\"\u003eYour\u003c/span\u003e \u003cspan class=\"n\"\u003esystem\u003c/span\u003e \u003cspan class=\"n\"\u003eis\u003c/span\u003e \u003cspan class=\"n\"\u003eready\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e看到这个表示环境已经部署好了，可以开始合成测试了。\u003c/p\u003e\n\u003col start=\"5\"\u003e\n\u003cli\u003e合成测试\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e修改项目默认的inter_v2.py文件代码：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e将834行\u003ccode\u003eprompt_wav = \u0026quot;examples/voice_01.wav\u0026quot;\u003c/code\u003e中的文件路径改为实际测试音频文件路径。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e将835行\u003ccode\u003etext = '欢迎大家来体验indextts2，并给予我们意见与反馈，谢谢大家。'\u003c/code\u003e中的内容改为你自定义的文本。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e将842行\u003ccode\u003etts.infer(spk_audio_prompt=prompt_wav, text=text, output_path=\u0026quot;gen.wav\u0026quot;, verbose=True)\u003c/code\u003e下面的代码全部删掉。\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e执行合成脚本：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePYTHONPATH=\u0026#34;$PYTHONPATH:.\u0026#34; uv run indextts/infer_v2.py\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e合成耗时在\u003cstrong\u003e2min+\u003c/strong\u003e，合成后的音频效果：\u003c/p\u003e\n\u003cfigure\u003e\n    \u003caudio controls preload=\"none\"\u003e\n      \u003csource src=\"indextts.wav\"\u003e\n      Your browser does not support the audio element.\n    \u003c/audio\u003e\n\u003c/figure\u003e\n\u003cp\u003e我把这段合成音频发给我老婆后，她在第一时间并没有察觉这是 AI 生成的。对于零样本合成来说，这个效果是非常好了。\u003c/p\u003e\n\u003ch4 id=\"问题整理\"\u003e问题整理\u003c/h4\u003e\n\u003col\u003e\n\u003cli\u003eLFS拉取失败，报错信息如下：\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit lfs pull\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eError updating the Git index: (0/1), 0 B | 0 B/s\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eerror: indextts/BigVGAN/__init__.py: cannot add to the index - missing --add option?\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003efatal: Unable to process path indextts/BigVGAN/__init__.py\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eErrors logged to \u0026#39;/root/index-tts/.git/lfs/logs/20260513T105919.131495169.log\u0026#39;.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUse git lfs logs last to view the log.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebatch response: This repository exceeded its LFS budget. The account responsible for the budget should increase it to restore access.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eFailed to fetch some objects from \u0026#39;https://github.com/index-tts/index-tts.git/info/lfs\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e执行下面命令替代第一步的命令。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003erm -rf index-tts\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGIT_LFS_SKIP_SMUDGE=1 git clone https://github.com/index-tts/index-tts.git\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecd index-tts\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"2\"\u003e\n\u003cli\u003e合成测试报错\u003c/li\u003e\n\u003c/ol\u003e\n\u003cul\u003e\n\u003cli\u003eOSError: We couldn\u0026rsquo;t connect to \u0026lsquo;\u003ca href=\"https://hf-mirror.com\"\u003ehttps://hf-mirror.com\u003c/a\u003e\u0026rsquo; to load the files, and couldn\u0026rsquo;t find them in the cached files.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e具体报错信息如下：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-mysql\" data-lang=\"mysql\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ePYTHONPATH\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;$PYTHONPATH:.\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003euv\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003erun\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eindextts\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003einfer_v2\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epy\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eGPT\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eweights\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003erestored\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003efrom\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003echeckpoints\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003egpt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epth\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eGPT2InferenceModel\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ehas\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003egenerative\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ecapabilities\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eas\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e`\u003c/span\u003e\u003cspan class=\"n\"\u003eprepare_inputs_for_generation\u003c/span\u003e\u003cspan class=\"o\"\u003e`\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eis\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eexplicitly\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eoverwritten\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eHowever\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eit\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003edoesn\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;t directly inherit from `GenerationMixin`. From 👉v4.50👈 onwards, `PreTrainedModel` will NOT inherit from `GenerationMixin`, and this model will lose the ability to call `generate` and other related functions.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e  - If you\u0026#39;\u003c/span\u003e\u003cspan class=\"n\"\u003ere\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eusing\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e`\u003c/span\u003e\u003cspan class=\"n\"\u003etrust_remote_code\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"no\"\u003eTrue\u003c/span\u003e\u003cspan class=\"o\"\u003e`\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eyou\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ecan\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eget\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003erid\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eof\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ewarning\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eby\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eloading\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ethe\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003emodel\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003ewith\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ean\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eauto\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eclass\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eSee\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ehttps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e//\u003c/span\u003e\u003cspan class=\"n\"\u003ehuggingface\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eco\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003edocs\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003etransformers\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003een\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003emodel_doc\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eauto\u003c/span\u003e\u003cspan class=\"c1\"\u003e#auto-classes\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eIf\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eyou\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eare\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ethe\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eowner\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eof\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ethe\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003emodel\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003earchitecture\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ecode\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eplease\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003emodify\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eyour\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003emodel\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eclass\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003esuch\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ethat\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eit\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003einherits\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003efrom\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e`\u003c/span\u003e\u003cspan class=\"n\"\u003eGenerationMixin\u003c/span\u003e\u003cspan class=\"o\"\u003e`\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eafter\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e`\u003c/span\u003e\u003cspan class=\"n\"\u003ePreTrainedModel\u003c/span\u003e\u003cspan class=\"o\"\u003e`\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eotherwise\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eyou\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;ll get an exception).\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e  - If you are not the owner of the model architecture class, please contact the model code owner to update it.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003eTraceback (most recent call last):\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e  File \u0026#34;/Users/liudon/index-tts/.venv/lib/python3.10/site-packages/huggingface_hub/file_download.py\u0026#34;, line 1568, in _get_metadata_or_catch_error\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e    raise FileMetadataError(\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003ehuggingface_hub.errors.FileMetadataError: Distant resource does not seem to be on huggingface.co. It is possible that a configuration issue prevents you from downloading resources from https://huggingface.co. Please check your firewall and proxy settings and make sure your SSL certificates are updated.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003eThe above exception was the direct cause of the following exception:\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003eTraceback (most recent call last):\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e  File \u0026#34;/Users/liudon/index-tts/.venv/lib/python3.10/site-packages/transformers/utils/hub.py\u0026#34;, line 470, in cached_files\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e    hf_hub_download(\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e  File \u0026#34;/Users/liudon/index-tts/.venv/lib/python3.10/site-packages/huggingface_hub/utils/_validators.py\u0026#34;, line 114, in _inner_fn\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e    return fn(*args, **kwargs)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e  File \u0026#34;/Users/liudon/index-tts/.venv/lib/python3.10/site-packages/huggingface_hub/file_download.py\u0026#34;, line 1010, in hf_hub_download\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e    return _hf_hub_download_to_cache_dir(\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e  File \u0026#34;/Users/liudon/index-tts/.venv/lib/python3.10/site-packages/huggingface_hub/file_download.py\u0026#34;, line 1117, in _hf_hub_download_to_cache_dir\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e    _raise_on_head_call_error(head_call_error, force_download, local_files_only)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e  File \u0026#34;/Users/liudon/index-tts/.venv/lib/python3.10/site-packages/huggingface_hub/file_download.py\u0026#34;, line 1661, in _raise_on_head_call_error\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e    raise LocalEntryNotFoundError(\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003ehuggingface_hub.errors.LocalEntryNotFoundError: An error happened while trying to locate the file on the Hub and we cannot find the requested files in the local cache. Please check your connection and try again or make sure your Internet connection is on.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003eThe above exception was the direct cause of the following exception:\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003eTraceback (most recent call last):\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e  File \u0026#34;/Users/liudon/index-tts/indextts/infer_v2.py\u0026#34;, line 836, in \u0026lt;module\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e    tts = IndexTTS2(\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e  File \u0026#34;/Users/liudon/index-tts/indextts/infer_v2.py\u0026#34;, line 115, in __init__\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e    self.extract_features = SeamlessM4TFeatureExtractor.from_pretrained(\u0026#34;facebook/w2v-bert-2.0\u0026#34;)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e  File \u0026#34;/Users/liudon/index-tts/.venv/lib/python3.10/site-packages/transformers/feature_extraction_utils.py\u0026#34;, line 384, in from_pretrained\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e    feature_extractor_dict, kwargs = cls.get_feature_extractor_dict(pretrained_model_name_or_path, **kwargs)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e  File \u0026#34;/Users/liudon/index-tts/.venv/lib/python3.10/site-packages/transformers/feature_extraction_utils.py\u0026#34;, line 510, in get_feature_extractor_dict\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e    resolved_feature_extractor_file = cached_file(\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e  File \u0026#34;/Users/liudon/index-tts/.venv/lib/python3.10/site-packages/transformers/utils/hub.py\u0026#34;, line 312, in cached_file\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e    file = cached_files(path_or_repo_id=path_or_repo_id, filenames=[filename], **kwargs)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e  File \u0026#34;/Users/liudon/index-tts/.venv/lib/python3.10/site-packages/transformers/utils/hub.py\u0026#34;, line 543, in cached_files\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e    raise OSError(\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003eOSError: We couldn\u0026#39;\u003c/span\u003e\u003cspan class=\"n\"\u003et\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003econnect\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eto\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;https://hf-mirror.com\u0026#39;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eto\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eload\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ethe\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003efiles\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eand\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ecouldn\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;t find them in the cached files.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003eCheckout your internet connection or see how to run the library in offline mode at \u0026#39;\u003c/span\u003e\u003cspan class=\"n\"\u003ehttps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e//\u003c/span\u003e\u003cspan class=\"n\"\u003ehuggingface\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eco\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003edocs\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003etransformers\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003einstallation\u003c/span\u003e\u003cspan class=\"c1\"\u003e#offline-mode\u0026#39;.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e这个是因为我们前面设置的\u003ccode\u003eexport HF_ENDPOINT=\u0026quot;https://hf-mirror.com\u0026quot;\u003c/code\u003e环境变量导致的，删除这个环境变量即可。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eunset HF_ENDPOINT\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e重新执行，会从huggingface下载其他模型，因为国内网络问题，预计在1小时左右。\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eOSError: Can\u0026rsquo;t load the model for \u0026lsquo;facebook/w2v-bert-2.0\u0026rsquo;. If you were trying to load it from \u0026lsquo;\u003ca href=\"https://huggingface.co/models'\"\u003ehttps://huggingface.co/models'\u003c/a\u003e, make sure you don\u0026rsquo;t have a local directory with the same name. Otherwise, make sure \u0026lsquo;facebook/w2v-bert-2.0\u0026rsquo; is the correct path to a directory containing a file named pytorch_model.bin, tf_model.h5, model.ckpt or flax_model.msgpack.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e完整报错信息如下：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-mysql\" data-lang=\"mysql\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ePYTHONPATH\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;$PYTHONPATH:.\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003euv\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003erun\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eindextts\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003einfer_v2\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epy\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eGPT\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eweights\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003erestored\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003efrom\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003echeckpoints\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003egpt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epth\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eGPT2InferenceModel\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ehas\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003egenerative\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ecapabilities\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eas\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e`\u003c/span\u003e\u003cspan class=\"n\"\u003eprepare_inputs_for_generation\u003c/span\u003e\u003cspan class=\"o\"\u003e`\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eis\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eexplicitly\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eoverwritten\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eHowever\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eit\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003edoesn\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;t directly inherit from `GenerationMixin`. From 👉v4.50👈 onwards, `PreTrainedModel` will NOT inherit from `GenerationMixin`, and this model will lose the ability to call `generate` and other related functions.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e  - If you\u0026#39;\u003c/span\u003e\u003cspan class=\"n\"\u003ere\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eusing\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e`\u003c/span\u003e\u003cspan class=\"n\"\u003etrust_remote_code\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"no\"\u003eTrue\u003c/span\u003e\u003cspan class=\"o\"\u003e`\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eyou\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ecan\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eget\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003erid\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eof\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ewarning\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eby\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eloading\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ethe\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003emodel\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003ewith\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ean\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eauto\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eclass\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eSee\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ehttps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e//\u003c/span\u003e\u003cspan class=\"n\"\u003ehuggingface\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eco\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003edocs\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003etransformers\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003een\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003emodel_doc\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eauto\u003c/span\u003e\u003cspan class=\"c1\"\u003e#auto-classes\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eIf\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eyou\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eare\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ethe\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eowner\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eof\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ethe\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003emodel\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003earchitecture\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ecode\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eplease\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003emodify\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eyour\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003emodel\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eclass\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003esuch\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ethat\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eit\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003einherits\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003efrom\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e`\u003c/span\u003e\u003cspan class=\"n\"\u003eGenerationMixin\u003c/span\u003e\u003cspan class=\"o\"\u003e`\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eafter\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e`\u003c/span\u003e\u003cspan class=\"n\"\u003ePreTrainedModel\u003c/span\u003e\u003cspan class=\"o\"\u003e`\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eotherwise\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eyou\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;ll get an exception).\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e  - If you are not the owner of the model architecture class, please contact the model code owner to update it.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003eTraceback (most recent call last):\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e  File \u0026#34;/Users/liudon/index-tts/indextts/infer_v2.py\u0026#34;, line 836, in \u0026lt;module\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e    tts = IndexTTS2(\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e  File \u0026#34;/Users/liudon/index-tts/indextts/infer_v2.py\u0026#34;, line 116, in __init__\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e    self.semantic_model, self.semantic_mean, self.semantic_std = build_semantic_model(\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e  File \u0026#34;/Users/liudon/index-tts/indextts/utils/maskgct_utils.py\u0026#34;, line 88, in build_semantic_model\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e    semantic_model = Wav2Vec2BertModel.from_pretrained(\u0026#34;facebook/w2v-bert-2.0\u0026#34;)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e  File \u0026#34;/Users/liudon/index-tts/.venv/lib/python3.10/site-packages/transformers/modeling_utils.py\u0026#34;, line 308, in _wrapper\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e    return func(*args, **kwargs)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e  File \u0026#34;/Users/liudon/index-tts/.venv/lib/python3.10/site-packages/transformers/modeling_utils.py\u0026#34;, line 4461, in from_pretrained\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e    checkpoint_files, sharded_metadata = _get_resolved_checkpoint_files(\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e  File \u0026#34;/Users/liudon/index-tts/.venv/lib/python3.10/site-packages/transformers/modeling_utils.py\u0026#34;, line 1125, in _get_resolved_checkpoint_files\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e    raise EnvironmentError(\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003eOSError: facebook/w2v-bert-2.0 does not appear to have a file named pytorch_model.bin, model.safetensors, tf_model.h5, model.ckpt or flax_model.msgpack.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e还是因为网络问题，执行下面命令手动下载模型。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ehf\u003c/span\u003e \u003cspan class=\"n\"\u003edownload\u003c/span\u003e \u003cspan class=\"n\"\u003efacebook\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003ew2v\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ebert\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mf\"\u003e2.0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ehf\u003c/span\u003e \u003cspan class=\"n\"\u003edownload\u003c/span\u003e \u003cspan class=\"n\"\u003eamphion\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eMaskGCT\u003c/span\u003e \u003cspan class=\"n\"\u003esemantic_codec\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003emodel\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esafetensors\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ehf\u003c/span\u003e \u003cspan class=\"n\"\u003edownload\u003c/span\u003e \u003cspan class=\"n\"\u003efunasr\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003ecampplus\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ehf\u003c/span\u003e \u003cspan class=\"n\"\u003edownload\u003c/span\u003e \u003cspan class=\"n\"\u003envidia\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003ebigvgan_v2_22khz_80band_256x\u003c/span\u003e \u003cspan class=\"n\"\u003ebigvgan_generator\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ept\u003c/span\u003e \u003cspan class=\"n\"\u003econfig\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ejson\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ehf\u003c/span\u003e \u003cspan class=\"n\"\u003edownload\u003c/span\u003e \u003cspan class=\"n\"\u003ePlachta\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eJDCnet\u003c/span\u003e \u003cspan class=\"n\"\u003ebst\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003et7\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"cosyvoice\"\u003eCosyVoice\u003c/h3\u003e\n\u003cp\u003e项目地址：\u003ca href=\"https://github.com/FunAudioLLM/CosyVoice\"\u003ehttps://github.com/FunAudioLLM/CosyVoice\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eCosyVoice 3.0 是一款基于大型语言模型 (LLM) 的高级文本转语音 (TTS) 系统，在内容一致性、说话人相似度和韵律自然度方面均超越了其前代产品 (CosyVoice 2.0)。它专为实际环境中的零样本多语言语音合成而设计。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e本次测试选用CosyVoice3-0.5B这个模型。\u003c/p\u003e\n\u003ch4 id=\"部署测试-1\"\u003e部署测试\u003c/h4\u003e\n\u003col\u003e\n\u003cli\u003e克隆代码\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit clone --recursive https://github.com/FunAudioLLM/CosyVoice.git\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# If you failed to clone the submodule due to network failures, please run the following command until success\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecd CosyVoice\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit submodule update --init --recursive\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"2\"\u003e\n\u003cli\u003eCreate Conda env\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003econda create -n cosyvoice -y python=3.10\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003econda activate cosyvoice\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/ --trusted-host=mirrors.aliyun.com\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"3\"\u003e\n\u003cli\u003e下载模型\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e执行下面python代码。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003efrom\u003c/span\u003e \u003cspan class=\"n\"\u003emodelscope\u003c/span\u003e \u003cspan class=\"n\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003esnapshot_download\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003esnapshot_download\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;FunAudioLLM/Fun-CosyVoice3-0.5B-2512\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003elocal_dir\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;pretrained_models/Fun-CosyVoice3-0.5B\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003esnapshot_download\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;iic/CosyVoice-ttsfrd\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003elocal_dir\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;pretrained_models/CosyVoice-ttsfrd\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"4\"\u003e\n\u003cli\u003e合成测试\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e新建测试文件demo_example.py，内容如下：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003esys\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003esys\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epath\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eappend\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;third_party/Matcha-TTS\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003efrom\u003c/span\u003e \u003cspan class=\"n\"\u003ecosyvoice\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecli\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecosyvoice\u003c/span\u003e \u003cspan class=\"n\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eAutoModel\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003etorchaudio\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003emain\u003c/span\u003e\u003cspan class=\"p\"\u003e():\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u0026#34; CosyVoice3 Usage, check https://funaudiollm.github.io/cosyvoice3/ for more details\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e    \u0026#34;\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003ecosyvoice\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eAutoModel\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003emodel_dir\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;pretrained_models/Fun-CosyVoice3-0.5B\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003etext\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;You are a helpful assistant.\u0026lt;|endofprompt|\u0026gt;Welcome to Beijing, President Trump. 北京欢迎你，特朗普总统。\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ej\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003eenumerate\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ecosyvoice\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003einference_cross_lingual\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etext\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;./child.wav\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003estream\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003eFalse\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003espeed\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"mf\"\u003e1.2\u003c/span\u003e\u003cspan class=\"p\"\u003e)):\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003etorchaudio\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esave\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ef\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;cross_lingual_{i}.wav\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ej\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;tts_speech\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e \u003cspan class=\"n\"\u003ecosyvoice\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esample_rate\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003e__name__\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;__main__\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003emain\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e执行测试脚本。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epython demo_example.py\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e合成耗时在\u003cstrong\u003e24秒\u003c/strong\u003e，合成后的音频效果：\u003c/p\u003e\n\u003cfigure\u003e\n    \u003caudio controls preload=\"none\"\u003e\n      \u003csource src=\"cosyvoice.wav\"\u003e\n      Your browser does not support the audio element.\n    \u003c/audio\u003e\n\u003c/figure\u003e\n\u003ch4 id=\"问题整理-1\"\u003e问题整理\u003c/h4\u003e\n\u003col\u003e\n\u003cli\u003eopenai-whisper安装失败No module named \u0026lsquo;pkg_resources\u0026rsquo;\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e参考https://github.com/FunAudioLLM/CosyVoice/issues/1844\u003c/p\u003e\n\u003cp\u003e创建文件build-constraints.txt，写入以下内容：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003esetuptools\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;=\u003c/span\u003e\u003cspan class=\"mi\"\u003e45\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"mi\"\u003e80\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e运行命令\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003epip\u003c/span\u003e \u003cspan class=\"n\"\u003einstall\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003ebuild\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003econstraint\u003c/span\u003e \u003cspan class=\"n\"\u003ebuild\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003econstraints\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003etxt\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003er\u003c/span\u003e \u003cspan class=\"n\"\u003erequirements\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003etxt\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"gpt-sovits\"\u003eGPT-SoVITS\u003c/h3\u003e\n\u003cp\u003e项目地址：\u003ca href=\"https://github.com/RVC-Boss/GPT-SoVITS\"\u003ehttps://github.com/RVC-Boss/GPT-SoVITS\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e强大的少样本语音转换与语音合成Web用户界面.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch4 id=\"部署测试-2\"\u003e部署测试\u003c/h4\u003e\n\u003col\u003e\n\u003cli\u003e克隆代码\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit clone https://github.com/RVC-Boss/GPT-SoVITS.git\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecd GPT-SoVITS\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"2\"\u003e\n\u003cli\u003eCreate Conda env\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003econda create -n GPTSoVits python=3.10\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003econda activate GPTSoVits\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"3\"\u003e\n\u003cli\u003e下载模型\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebash install.sh --device CU128 --source HF-Mirror\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"4\"\u003e\n\u003cli\u003e启动API服务\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epython api_v2.py -a 127.0.0.1 -p 9880 -c GPT_SoVITS/configs/tts_infer.yaml\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"5\"\u003e\n\u003cli\u003e合成测试\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl \u0026#34;http://127.0.0.1:9880/tts?text=你好，欢迎测试音色克隆\u0026amp;text_lang=zh\u0026amp;ref_audio_path=ref.wav\u0026amp;prompt_lang=zh\u0026amp;prompt_text=这是一段参考音频\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e参数说明：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003etext：合成音频的文本内容\u003c/li\u003e\n\u003cli\u003etext_lang：合成音频语言\u003c/li\u003e\n\u003cli\u003eref_audio_path：参考音频文件路径\u003c/li\u003e\n\u003cli\u003eprompt_lang：参考音频语言\u003c/li\u003e\n\u003cli\u003eprompt_text：参考音频文本内容，需要与实际音频内容一致，否则会导致合成音频内容错误\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e合成耗时在\u003cstrong\u003e10s\u003c/strong\u003e内，合成后的音频效果：\u003c/p\u003e\n\u003cfigure\u003e\n    \u003caudio controls preload=\"none\"\u003e\n      \u003csource src=\"GPT-SoVITS.wav\"\u003e\n      Your browser does not support the audio element.\n    \u003c/audio\u003e\n\u003c/figure\u003e\n\u003ch4 id=\"问题整理-2\"\u003e问题整理\u003c/h4\u003e\n\u003col\u003e\n\u003cli\u003eReference audio is outside the 3-10 second range, please choose another one!\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e参考音频时长限制为3-10秒，使用ffmpeg对音频进行切片。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003effmpeg -i child.wav -t 10 -ar 32000 -ac 1 child_10s.wav\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"2\"\u003e\n\u003cli\u003eException\u0026quot;:\u0026ldquo;Could not load libtorchcodec.\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e完整报错信息如下：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;message\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;tts failed\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Exception\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Could not load libtorchcodec. Likely causes:\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e          1. FFmpeg is not properly installed in your environment. We support\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e             versions 4, 5, 6, 7, and 8, and we attempt to load libtorchcodec\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e             for each of those versions. Errors for versions not installed on\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e             your system are expected; only the error for your installed FFmpeg\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e             version is relevant. On Windows, ensure you\u0026#39;ve installed the\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e             \u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s2\"\u003efull-shared\u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s2\"\u003e version which ships DLLs.\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e          2. The PyTorch version (2.11.0+cu128) is not compatible with\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e             this version of TorchCodec. Refer to the version compatibility\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e             table:\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e             https://github.com/pytorch/torchcodec?tab=readme-ov-file#installing-torchcodec.\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e          3. Another runtime dependency; see exceptions below.\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e        The following exceptions were raised as we tried to load libtorchcodec:\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e        \u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e[start of libtorchcodec loading traceback]\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003eFFmpeg version 8:\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003eTraceback (most recent call last):\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e  File \u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s2\"\u003e/root/miniconda3/envs/GPTSoVits/lib/python3.10/site-packages/torch/_ops.py\u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s2\"\u003e, line 1503, in load_library\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e    ctypes.CDLL(path)\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e  File \u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s2\"\u003e/root/miniconda3/envs/GPTSoVits/lib/python3.10/ctypes/__init__.py\u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s2\"\u003e, line 374, in __init__\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e    self._handle = _dlopen(self._name, mode)\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003eOSError: libnppicc.so.12: cannot open shared object file: No such file or directory\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003eThe above exception was the direct cause of the following exception:\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003eTraceback (most recent call last):\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e  File \u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s2\"\u003e/root/miniconda3/envs/GPTSoVits/lib/python3.10/site-packages/torchcodec/_internally_replaced_utils.py\u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s2\"\u003e, line 93, in load_torchcodec_shared_libraries\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e    torch.ops.load_library(core_library_path)\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e  File \u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s2\"\u003e/root/miniconda3/envs/GPTSoVits/lib/python3.10/site-packages/torch/_ops.py\u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s2\"\u003e, line 1505, in load_library\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e    raise OSError(f\u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s2\"\u003eCould not load this library: {path}\u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s2\"\u003e) from e\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003eOSError: Could not load this library: /root/miniconda3/envs/GPTSoVits/lib/python3.10/site-packages/torchcodec/libtorchcodec_core8.so\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003eFFmpeg version 7:\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003eTraceback (most recent call last):\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e  File \u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s2\"\u003e/root/miniconda3/envs/GPTSoVits/lib/python3.10/site-packages/torch/_ops.py\u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s2\"\u003e, line 1503, in load_library\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e    ctypes.CDLL(path)\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e  File \u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s2\"\u003e/root/miniconda3/envs/GPTSoVits/lib/python3.10/ctypes/__init__.py\u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s2\"\u003e, line 374, in __init__\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e    self._handle = _dlopen(self._name, mode)\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003eOSError: libnppicc.so.12: cannot open shared object file: No such file or directory\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003eThe above exception was the direct cause of the following exception:\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003eTraceback (most recent call last):\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e  File \u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s2\"\u003e/root/miniconda3/envs/GPTSoVits/lib/python3.10/site-packages/torchcodec/_internally_replaced_utils.py\u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s2\"\u003e, line 93, in load_torchcodec_shared_libraries\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e    torch.ops.load_library(core_library_path)\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e  File \u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s2\"\u003e/root/miniconda3/envs/GPTSoVits/lib/python3.10/site-packages/torch/_ops.py\u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s2\"\u003e, line 1505, in load_library\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e    raise OSError(f\u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s2\"\u003eCould not load this library: {path}\u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s2\"\u003e) from e\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003eOSError: Could not load this library: /root/miniconda3/envs/GPTSoVits/lib/python3.10/site-packages/torchcodec/libtorchcodec_core7.so\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003eFFmpeg version 6:\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003eTraceback (most recent call last):\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e  File \u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s2\"\u003e/root/miniconda3/envs/GPTSoVits/lib/python3.10/site-packages/torch/_ops.py\u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s2\"\u003e, line 1503, in load_library\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e    ctypes.CDLL(path)\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e  File \u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s2\"\u003e/root/miniconda3/envs/GPTSoVits/lib/python3.10/ctypes/__init__.py\u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s2\"\u003e, line 374, in __init__\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e    self._handle = _dlopen(self._name, mode)\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003eOSError: libnppicc.so.12: cannot open shared object file: No such file or directory\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003eThe above exception was the direct cause of the following exception:\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003eTraceback (most recent call last):\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e  File \u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s2\"\u003e/root/miniconda3/envs/GPTSoVits/lib/python3.10/site-packages/torchcodec/_internally_replaced_utils.py\u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s2\"\u003e, line 93, in load_torchcodec_shared_libraries\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e    torch.ops.load_library(core_library_path)\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e  File \u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s2\"\u003e/root/miniconda3/envs/GPTSoVits/lib/python3.10/site-packages/torch/_ops.py\u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s2\"\u003e, line 1505, in load_library\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e    raise OSError(f\u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s2\"\u003eCould not load this library: {path}\u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s2\"\u003e) from e\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003eOSError: Could not load this library: /root/miniconda3/envs/GPTSoVits/lib/python3.10/site-packages/torchcodec/libtorchcodec_core6.so\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003eFFmpeg version 5:\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003eTraceback (most recent call last):\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e  File \u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s2\"\u003e/root/miniconda3/envs/GPTSoVits/lib/python3.10/site-packages/torch/_ops.py\u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s2\"\u003e, line 1503, in load_library\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e    ctypes.CDLL(path)\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e  File \u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s2\"\u003e/root/miniconda3/envs/GPTSoVits/lib/python3.10/ctypes/__init__.py\u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s2\"\u003e, line 374, in __init__\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e    self._handle = _dlopen(self._name, mode)\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003eOSError: libnppicc.so.12: cannot open shared object file: No such file or directory\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003eThe above exception was the direct cause of the following exception:\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003eTraceback (most recent call last):\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e  File \u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s2\"\u003e/root/miniconda3/envs/GPTSoVits/lib/python3.10/site-packages/torchcodec/_internally_replaced_utils.py\u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s2\"\u003e, line 93, in load_torchcodec_shared_libraries\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e    torch.ops.load_library(core_library_path)\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e  File \u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s2\"\u003e/root/miniconda3/envs/GPTSoVits/lib/python3.10/site-packages/torch/_ops.py\u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s2\"\u003e, line 1505, in load_library\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e    raise OSError(f\u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s2\"\u003eCould not load this library: {path}\u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s2\"\u003e) from e\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003eOSError: Could not load this library: /root/miniconda3/envs/GPTSoVits/lib/python3.10/site-packages/torchcodec/libtorchcodec_core5.so\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003eFFmpeg version 4:\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003eTraceback (most recent call last):\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e  File \u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s2\"\u003e/root/miniconda3/envs/GPTSoVits/lib/python3.10/site-packages/torch/_ops.py\u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s2\"\u003e, line 1503, in load_library\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e    ctypes.CDLL(path)\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e  File \u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s2\"\u003e/root/miniconda3/envs/GPTSoVits/lib/python3.10/ctypes/__init__.py\u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s2\"\u003e, line 374, in __init__\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e    self._handle = _dlopen(self._name, mode)\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003eOSError: libnppicc.so.12: cannot open shared object file: No such file or directory\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003eThe above exception was the direct cause of the following exception:\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003eTraceback (most recent call last):\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e  File \u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s2\"\u003e/root/miniconda3/envs/GPTSoVits/lib/python3.10/site-packages/torchcodec/_internally_replaced_utils.py\u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s2\"\u003e, line 93, in load_torchcodec_shared_libraries\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e    torch.ops.load_library(core_library_path)\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e  File \u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s2\"\u003e/root/miniconda3/envs/GPTSoVits/lib/python3.10/site-packages/torch/_ops.py\u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s2\"\u003e, line 1505, in load_library\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e    raise OSError(f\u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s2\"\u003eCould not load this library: {path}\u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s2\"\u003e) from e\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003eOSError: Could not load this library: /root/miniconda3/envs/GPTSoVits/lib/python3.10/site-packages/torchcodec/libtorchcodec_core4.so\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e[end of libtorchcodec loading traceback].\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003e解决torchcodec版本错误\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eGPTSoVits\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003eroot\u003c/span\u003e\u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eautodl\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003econtainer\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e1421458302\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003efdce35d0\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e~/\u003c/span\u003e\u003cspan class=\"n\"\u003eautodl\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003etmp\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eGPT\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eSoVITS\u003c/span\u003e\u003cspan class=\"c1\"\u003e# python -m pip show torchcodec\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eName\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003etorchcodec\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eVersion\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.11\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"o\"\u003e+\u003c/span\u003e\u003cspan class=\"n\"\u003ecu128\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eSummary\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eA\u003c/span\u003e \u003cspan class=\"n\"\u003evideo\u003c/span\u003e \u003cspan class=\"n\"\u003edecoder\u003c/span\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003ePyTorch\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eHome\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003epage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eAuthor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eAuthor\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eemail\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003ePyTorch\u003c/span\u003e \u003cspan class=\"n\"\u003eTeam\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003epackages\u003c/span\u003e\u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003epytorch\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eorg\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eLicense\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eBSD\u003c/span\u003e \u003cspan class=\"mi\"\u003e3\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eClause\u003c/span\u003e \u003cspan class=\"n\"\u003eLicense\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eCopyright\u003c/span\u003e \u003cspan class=\"mi\"\u003e2024\u003c/span\u003e \u003cspan class=\"n\"\u003eMeta\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eRedistribution\u003c/span\u003e \u003cspan class=\"ow\"\u003eand\u003c/span\u003e \u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003esource\u003c/span\u003e \u003cspan class=\"ow\"\u003eand\u003c/span\u003e \u003cspan class=\"n\"\u003ebinary\u003c/span\u003e \u003cspan class=\"n\"\u003eforms\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ewith\u003c/span\u003e \u003cspan class=\"ow\"\u003eor\u003c/span\u003e \u003cspan class=\"n\"\u003ewithout\u003c/span\u003e \u003cspan class=\"n\"\u003emodification\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eare\u003c/span\u003e \u003cspan class=\"n\"\u003epermitted\u003c/span\u003e \u003cspan class=\"n\"\u003eprovided\u003c/span\u003e \u003cspan class=\"n\"\u003ethat\u003c/span\u003e \u003cspan class=\"n\"\u003ethe\u003c/span\u003e \u003cspan class=\"n\"\u003efollowing\u003c/span\u003e \u003cspan class=\"n\"\u003econditions\u003c/span\u003e \u003cspan class=\"n\"\u003eare\u003c/span\u003e \u003cspan class=\"n\"\u003emet\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"mf\"\u003e1.\u003c/span\u003e \u003cspan class=\"n\"\u003eRedistributions\u003c/span\u003e \u003cspan class=\"n\"\u003eof\u003c/span\u003e \u003cspan class=\"n\"\u003esource\u003c/span\u003e \u003cspan class=\"n\"\u003ecode\u003c/span\u003e \u003cspan class=\"n\"\u003emust\u003c/span\u003e \u003cspan class=\"n\"\u003eretain\u003c/span\u003e \u003cspan class=\"n\"\u003ethe\u003c/span\u003e \u003cspan class=\"n\"\u003eabove\u003c/span\u003e \u003cspan class=\"n\"\u003ecopyright\u003c/span\u003e \u003cspan class=\"n\"\u003enotice\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e \u003cspan class=\"n\"\u003elist\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eof\u003c/span\u003e \u003cspan class=\"n\"\u003econditions\u003c/span\u003e \u003cspan class=\"ow\"\u003eand\u003c/span\u003e \u003cspan class=\"n\"\u003ethe\u003c/span\u003e \u003cspan class=\"n\"\u003efollowing\u003c/span\u003e \u003cspan class=\"n\"\u003edisclaimer\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"mf\"\u003e2.\u003c/span\u003e \u003cspan class=\"n\"\u003eRedistributions\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003ebinary\u003c/span\u003e \u003cspan class=\"n\"\u003eform\u003c/span\u003e \u003cspan class=\"n\"\u003emust\u003c/span\u003e \u003cspan class=\"n\"\u003ereproduce\u003c/span\u003e \u003cspan class=\"n\"\u003ethe\u003c/span\u003e \u003cspan class=\"n\"\u003eabove\u003c/span\u003e \u003cspan class=\"n\"\u003ecopyright\u003c/span\u003e \u003cspan class=\"n\"\u003enotice\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ethis\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003elist\u003c/span\u003e \u003cspan class=\"n\"\u003eof\u003c/span\u003e \u003cspan class=\"n\"\u003econditions\u003c/span\u003e \u003cspan class=\"ow\"\u003eand\u003c/span\u003e \u003cspan class=\"n\"\u003ethe\u003c/span\u003e \u003cspan class=\"n\"\u003efollowing\u003c/span\u003e \u003cspan class=\"n\"\u003edisclaimer\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003ethe\u003c/span\u003e \u003cspan class=\"n\"\u003edocumentation\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"ow\"\u003eand\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"ow\"\u003eor\u003c/span\u003e \u003cspan class=\"n\"\u003eother\u003c/span\u003e \u003cspan class=\"n\"\u003ematerials\u003c/span\u003e \u003cspan class=\"n\"\u003eprovided\u003c/span\u003e \u003cspan class=\"n\"\u003ewith\u003c/span\u003e \u003cspan class=\"n\"\u003ethe\u003c/span\u003e \u003cspan class=\"n\"\u003edistribution\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"mf\"\u003e3.\u003c/span\u003e \u003cspan class=\"n\"\u003eNeither\u003c/span\u003e \u003cspan class=\"n\"\u003ethe\u003c/span\u003e \u003cspan class=\"n\"\u003ename\u003c/span\u003e \u003cspan class=\"n\"\u003eof\u003c/span\u003e \u003cspan class=\"n\"\u003ethe\u003c/span\u003e \u003cspan class=\"n\"\u003ecopyright\u003c/span\u003e \u003cspan class=\"n\"\u003eholder\u003c/span\u003e \u003cspan class=\"n\"\u003enor\u003c/span\u003e \u003cspan class=\"n\"\u003ethe\u003c/span\u003e \u003cspan class=\"n\"\u003enames\u003c/span\u003e \u003cspan class=\"n\"\u003eof\u003c/span\u003e \u003cspan class=\"n\"\u003eits\u003c/span\u003e \u003cspan class=\"n\"\u003econtributors\u003c/span\u003e \u003cspan class=\"n\"\u003emay\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003ebe\u003c/span\u003e \u003cspan class=\"n\"\u003eused\u003c/span\u003e \u003cspan class=\"n\"\u003eto\u003c/span\u003e \u003cspan class=\"n\"\u003eendorse\u003c/span\u003e \u003cspan class=\"ow\"\u003eor\u003c/span\u003e \u003cspan class=\"n\"\u003epromote\u003c/span\u003e \u003cspan class=\"n\"\u003eproducts\u003c/span\u003e \u003cspan class=\"n\"\u003ederived\u003c/span\u003e \u003cspan class=\"n\"\u003efrom\u003c/span\u003e \u003cspan class=\"n\"\u003ethis\u003c/span\u003e \u003cspan class=\"n\"\u003esoftware\u003c/span\u003e \u003cspan class=\"n\"\u003ewithout\u003c/span\u003e \u003cspan class=\"n\"\u003especific\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eprior\u003c/span\u003e \u003cspan class=\"n\"\u003ewritten\u003c/span\u003e \u003cspan class=\"n\"\u003epermission\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eTHIS\u003c/span\u003e \u003cspan class=\"n\"\u003eSOFTWARE\u003c/span\u003e \u003cspan class=\"n\"\u003eIS\u003c/span\u003e \u003cspan class=\"n\"\u003ePROVIDED\u003c/span\u003e \u003cspan class=\"n\"\u003eBY\u003c/span\u003e \u003cspan class=\"n\"\u003eTHE\u003c/span\u003e \u003cspan class=\"n\"\u003eCOPYRIGHT\u003c/span\u003e \u003cspan class=\"n\"\u003eHOLDERS\u003c/span\u003e \u003cspan class=\"n\"\u003eAND\u003c/span\u003e \u003cspan class=\"n\"\u003eCONTRIBUTORS\u003c/span\u003e \u003cspan class=\"err\"\u003e“\u003c/span\u003e\u003cspan class=\"n\"\u003eAS\u003c/span\u003e \u003cspan class=\"n\"\u003eIS\u003c/span\u003e\u003cspan class=\"err\"\u003e”\u003c/span\u003e \u003cspan class=\"n\"\u003eAND\u003c/span\u003e \u003cspan class=\"n\"\u003eANY\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eEXPRESS\u003c/span\u003e \u003cspan class=\"n\"\u003eOR\u003c/span\u003e \u003cspan class=\"n\"\u003eIMPLIED\u003c/span\u003e \u003cspan class=\"n\"\u003eWARRANTIES\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eINCLUDING\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eBUT\u003c/span\u003e \u003cspan class=\"n\"\u003eNOT\u003c/span\u003e \u003cspan class=\"n\"\u003eLIMITED\u003c/span\u003e \u003cspan class=\"n\"\u003eTO\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eTHE\u003c/span\u003e \u003cspan class=\"n\"\u003eIMPLIED\u003c/span\u003e \u003cspan class=\"n\"\u003eWARRANTIES\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eOF\u003c/span\u003e \u003cspan class=\"n\"\u003eMERCHANTABILITY\u003c/span\u003e \u003cspan class=\"n\"\u003eAND\u003c/span\u003e \u003cspan class=\"n\"\u003eFITNESS\u003c/span\u003e \u003cspan class=\"n\"\u003eFOR\u003c/span\u003e \u003cspan class=\"n\"\u003eA\u003c/span\u003e \u003cspan class=\"n\"\u003ePARTICULAR\u003c/span\u003e \u003cspan class=\"n\"\u003ePURPOSE\u003c/span\u003e \u003cspan class=\"n\"\u003eARE\u003c/span\u003e \u003cspan class=\"n\"\u003eDISCLAIMED\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e \u003cspan class=\"n\"\u003eIN\u003c/span\u003e \u003cspan class=\"n\"\u003eNO\u003c/span\u003e \u003cspan class=\"n\"\u003eEVENT\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eSHALL\u003c/span\u003e \u003cspan class=\"n\"\u003eTHE\u003c/span\u003e \u003cspan class=\"n\"\u003eCOPYRIGHT\u003c/span\u003e \u003cspan class=\"n\"\u003eHOLDER\u003c/span\u003e \u003cspan class=\"n\"\u003eOR\u003c/span\u003e \u003cspan class=\"n\"\u003eCONTRIBUTORS\u003c/span\u003e \u003cspan class=\"n\"\u003eBE\u003c/span\u003e \u003cspan class=\"n\"\u003eLIABLE\u003c/span\u003e \u003cspan class=\"n\"\u003eFOR\u003c/span\u003e \u003cspan class=\"n\"\u003eANY\u003c/span\u003e \u003cspan class=\"n\"\u003eDIRECT\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eINDIRECT\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eINCIDENTAL\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eSPECIAL\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eEXEMPLARY\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eOR\u003c/span\u003e \u003cspan class=\"n\"\u003eCONSEQUENTIAL\u003c/span\u003e \u003cspan class=\"n\"\u003eDAMAGES\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eINCLUDING\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eBUT\u003c/span\u003e \u003cspan class=\"n\"\u003eNOT\u003c/span\u003e \u003cspan class=\"n\"\u003eLIMITED\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eTO\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ePROCUREMENT\u003c/span\u003e \u003cspan class=\"n\"\u003eOF\u003c/span\u003e \u003cspan class=\"n\"\u003eSUBSTITUTE\u003c/span\u003e \u003cspan class=\"n\"\u003eGOODS\u003c/span\u003e \u003cspan class=\"n\"\u003eOR\u003c/span\u003e \u003cspan class=\"n\"\u003eSERVICES\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"n\"\u003eLOSS\u003c/span\u003e \u003cspan class=\"n\"\u003eOF\u003c/span\u003e \u003cspan class=\"n\"\u003eUSE\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eDATA\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eOR\u003c/span\u003e \u003cspan class=\"n\"\u003ePROFITS\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"n\"\u003eOR\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eBUSINESS\u003c/span\u003e \u003cspan class=\"n\"\u003eINTERRUPTION\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003eHOWEVER\u003c/span\u003e \u003cspan class=\"n\"\u003eCAUSED\u003c/span\u003e \u003cspan class=\"n\"\u003eAND\u003c/span\u003e \u003cspan class=\"n\"\u003eON\u003c/span\u003e \u003cspan class=\"n\"\u003eANY\u003c/span\u003e \u003cspan class=\"n\"\u003eTHEORY\u003c/span\u003e \u003cspan class=\"n\"\u003eOF\u003c/span\u003e \u003cspan class=\"n\"\u003eLIABILITY\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eWHETHER\u003c/span\u003e \u003cspan class=\"n\"\u003eIN\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eCONTRACT\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eSTRICT\u003c/span\u003e \u003cspan class=\"n\"\u003eLIABILITY\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eOR\u003c/span\u003e \u003cspan class=\"n\"\u003eTORT\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eINCLUDING\u003c/span\u003e \u003cspan class=\"n\"\u003eNEGLIGENCE\u003c/span\u003e \u003cspan class=\"n\"\u003eOR\u003c/span\u003e \u003cspan class=\"n\"\u003eOTHERWISE\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003eARISING\u003c/span\u003e \u003cspan class=\"n\"\u003eIN\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eANY\u003c/span\u003e \u003cspan class=\"n\"\u003eWAY\u003c/span\u003e \u003cspan class=\"n\"\u003eOUT\u003c/span\u003e \u003cspan class=\"n\"\u003eOF\u003c/span\u003e \u003cspan class=\"n\"\u003eTHE\u003c/span\u003e \u003cspan class=\"n\"\u003eUSE\u003c/span\u003e \u003cspan class=\"n\"\u003eOF\u003c/span\u003e \u003cspan class=\"n\"\u003eTHIS\u003c/span\u003e \u003cspan class=\"n\"\u003eSOFTWARE\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eEVEN\u003c/span\u003e \u003cspan class=\"n\"\u003eIF\u003c/span\u003e \u003cspan class=\"n\"\u003eADVISED\u003c/span\u003e \u003cspan class=\"n\"\u003eOF\u003c/span\u003e \u003cspan class=\"n\"\u003eTHE\u003c/span\u003e \u003cspan class=\"n\"\u003ePOSSIBILITY\u003c/span\u003e \u003cspan class=\"n\"\u003eOF\u003c/span\u003e \u003cspan class=\"n\"\u003eSUCH\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eDAMAGE\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eLocation\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eroot\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eminiconda3\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eenvs\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eGPTSoVits\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003elib\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003epython3\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mi\"\u003e10\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003esite\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003epackages\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eRequires\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eRequired\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eby\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eGPTSoVits\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003eroot\u003c/span\u003e\u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eautodl\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003econtainer\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e1421458302\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003efdce35d0\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e~/\u003c/span\u003e\u003cspan class=\"n\"\u003eautodl\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003etmp\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eGPT\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eSoVITS\u003c/span\u003e\u003cspan class=\"c1\"\u003e#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eGPTSoVits\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003eroot\u003c/span\u003e\u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eautodl\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003econtainer\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e1421458302\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003efdce35d0\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e~/\u003c/span\u003e\u003cspan class=\"n\"\u003eautodl\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003etmp\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eGPT\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eSoVITS\u003c/span\u003e\u003cspan class=\"c1\"\u003e#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eGPTSoVits\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003eroot\u003c/span\u003e\u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eautodl\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003econtainer\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e1421458302\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003efdce35d0\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e~/\u003c/span\u003e\u003cspan class=\"n\"\u003eautodl\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003etmp\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eGPT\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eSoVITS\u003c/span\u003e\u003cspan class=\"c1\"\u003e# python -m pip uninstall -y torchcodec\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eFound\u003c/span\u003e \u003cspan class=\"n\"\u003eexisting\u003c/span\u003e \u003cspan class=\"n\"\u003einstallation\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003etorchcodec\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.11\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"o\"\u003e+\u003c/span\u003e\u003cspan class=\"n\"\u003ecu128\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eUninstalling\u003c/span\u003e \u003cspan class=\"n\"\u003etorchcodec\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mf\"\u003e0.11\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"o\"\u003e+\u003c/span\u003e\u003cspan class=\"n\"\u003ecu128\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"n\"\u003eSuccessfully\u003c/span\u003e \u003cspan class=\"n\"\u003euninstalled\u003c/span\u003e \u003cspan class=\"n\"\u003etorchcodec\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mf\"\u003e0.11\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"o\"\u003e+\u003c/span\u003e\u003cspan class=\"n\"\u003ecu128\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eWARNING\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eRunning\u003c/span\u003e \u003cspan class=\"n\"\u003epip\u003c/span\u003e \u003cspan class=\"n\"\u003eas\u003c/span\u003e \u003cspan class=\"n\"\u003ethe\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;root\u0026#39;\u003c/span\u003e \u003cspan class=\"n\"\u003euser\u003c/span\u003e \u003cspan class=\"n\"\u003ecan\u003c/span\u003e \u003cspan class=\"n\"\u003eresult\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003ebroken\u003c/span\u003e \u003cspan class=\"n\"\u003epermissions\u003c/span\u003e \u003cspan class=\"ow\"\u003eand\u003c/span\u003e \u003cspan class=\"n\"\u003econflicting\u003c/span\u003e \u003cspan class=\"n\"\u003ebehaviour\u003c/span\u003e \u003cspan class=\"n\"\u003ewith\u003c/span\u003e \u003cspan class=\"n\"\u003ethe\u003c/span\u003e \u003cspan class=\"n\"\u003esystem\u003c/span\u003e \u003cspan class=\"n\"\u003epackage\u003c/span\u003e \u003cspan class=\"n\"\u003emanager\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003epossibly\u003c/span\u003e \u003cspan class=\"n\"\u003erendering\u003c/span\u003e \u003cspan class=\"n\"\u003eyour\u003c/span\u003e \u003cspan class=\"n\"\u003esystem\u003c/span\u003e \u003cspan class=\"n\"\u003eunusable\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e \u003cspan class=\"n\"\u003eIt\u003c/span\u003e \u003cspan class=\"n\"\u003eis\u003c/span\u003e \u003cspan class=\"n\"\u003erecommended\u003c/span\u003e \u003cspan class=\"n\"\u003eto\u003c/span\u003e \u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003ea\u003c/span\u003e \u003cspan class=\"n\"\u003evirtual\u003c/span\u003e \u003cspan class=\"n\"\u003eenvironment\u003c/span\u003e \u003cspan class=\"n\"\u003einstead\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003ehttps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e//\u003c/span\u003e\u003cspan class=\"n\"\u003epip\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epypa\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eio\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003ewarnings\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003evenv\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e \u003cspan class=\"n\"\u003eUse\u003c/span\u003e \u003cspan class=\"n\"\u003ethe\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003eroot\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003euser\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eaction\u003c/span\u003e \u003cspan class=\"n\"\u003eoption\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003eyou\u003c/span\u003e \u003cspan class=\"n\"\u003eknow\u003c/span\u003e \u003cspan class=\"n\"\u003ewhat\u003c/span\u003e \u003cspan class=\"n\"\u003eyou\u003c/span\u003e \u003cspan class=\"n\"\u003eare\u003c/span\u003e \u003cspan class=\"n\"\u003edoing\u003c/span\u003e \u003cspan class=\"ow\"\u003eand\u003c/span\u003e \u003cspan class=\"n\"\u003ewant\u003c/span\u003e \u003cspan class=\"n\"\u003eto\u003c/span\u003e \u003cspan class=\"n\"\u003esuppress\u003c/span\u003e \u003cspan class=\"n\"\u003ethis\u003c/span\u003e \u003cspan class=\"n\"\u003ewarning\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eGPTSoVits\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003eroot\u003c/span\u003e\u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eautodl\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003econtainer\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e1421458302\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003efdce35d0\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e~/\u003c/span\u003e\u003cspan class=\"n\"\u003eautodl\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003etmp\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eGPT\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eSoVITS\u003c/span\u003e\u003cspan class=\"c1\"\u003e#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eGPTSoVits\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003eroot\u003c/span\u003e\u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eautodl\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003econtainer\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e1421458302\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003efdce35d0\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e~/\u003c/span\u003e\u003cspan class=\"n\"\u003eautodl\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003etmp\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eGPT\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eSoVITS\u003c/span\u003e\u003cspan class=\"c1\"\u003e#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eGPTSoVits\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003eroot\u003c/span\u003e\u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eautodl\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003econtainer\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e1421458302\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003efdce35d0\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e~/\u003c/span\u003e\u003cspan class=\"n\"\u003eautodl\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003etmp\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eGPT\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eSoVITS\u003c/span\u003e\u003cspan class=\"c1\"\u003e# python -m pip install --no-cache-dir --force-reinstall \\\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e   \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003eindex\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eurl\u003c/span\u003e \u003cspan class=\"n\"\u003ehttps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e//\u003c/span\u003e\u003cspan class=\"n\"\u003edownload\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epytorch\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eorg\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003ewhl\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003ecpu\u003c/span\u003e \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e   \u003cspan class=\"n\"\u003etorchcodec\u003c/span\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u003cspan class=\"mf\"\u003e0.11\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eLooking\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003eindexes\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003ehttps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e//\u003c/span\u003e\u003cspan class=\"n\"\u003edownload\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epytorch\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eorg\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003ewhl\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003ecpu\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eCollecting\u003c/span\u003e \u003cspan class=\"n\"\u003etorchcodec\u003c/span\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u003cspan class=\"mf\"\u003e0.11\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"n\"\u003eDownloading\u003c/span\u003e \u003cspan class=\"n\"\u003ehttps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e//\u003c/span\u003e\u003cspan class=\"n\"\u003edownload\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epytorch\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eorg\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003ewhl\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003ecpu\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003etorchcodec\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mf\"\u003e0.11\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"o\"\u003e%\u003c/span\u003e\u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"n\"\u003eBcpu\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ecp310\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ecp310\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003emanylinux_2_28_x86_64\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ewhl\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003emetadata\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e11\u003c/span\u003e \u003cspan class=\"n\"\u003ekB\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eDownloading\u003c/span\u003e \u003cspan class=\"n\"\u003ehttps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e//\u003c/span\u003e\u003cspan class=\"n\"\u003edownload\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epytorch\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eorg\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003ewhl\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003ecpu\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003etorchcodec\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mf\"\u003e0.11\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"o\"\u003e%\u003c/span\u003e\u003cspan class=\"mi\"\u003e2\u003c/span\u003e\u003cspan class=\"n\"\u003eBcpu\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ecp310\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ecp310\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003emanylinux_2_28_x86_64\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ewhl\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mf\"\u003e2.3\u003c/span\u003e \u003cspan class=\"n\"\u003eMB\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   \u003cspan class=\"err\"\u003e━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u003c/span\u003e \u003cspan class=\"mf\"\u003e2.3\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"mf\"\u003e2.3\u003c/span\u003e \u003cspan class=\"n\"\u003eMB\u003c/span\u003e \u003cspan class=\"mf\"\u003e3.2\u003c/span\u003e \u003cspan class=\"n\"\u003eMB\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e  \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"mi\"\u003e00\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"mi\"\u003e01\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eInstalling\u003c/span\u003e \u003cspan class=\"n\"\u003ecollected\u003c/span\u003e \u003cspan class=\"n\"\u003epackages\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003etorchcodec\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eSuccessfully\u003c/span\u003e \u003cspan class=\"n\"\u003einstalled\u003c/span\u003e \u003cspan class=\"n\"\u003etorchcodec\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mf\"\u003e0.11\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"o\"\u003e+\u003c/span\u003e\u003cspan class=\"n\"\u003ecpu\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eWARNING\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eRunning\u003c/span\u003e \u003cspan class=\"n\"\u003epip\u003c/span\u003e \u003cspan class=\"n\"\u003eas\u003c/span\u003e \u003cspan class=\"n\"\u003ethe\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;root\u0026#39;\u003c/span\u003e \u003cspan class=\"n\"\u003euser\u003c/span\u003e \u003cspan class=\"n\"\u003ecan\u003c/span\u003e \u003cspan class=\"n\"\u003eresult\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003ebroken\u003c/span\u003e \u003cspan class=\"n\"\u003epermissions\u003c/span\u003e \u003cspan class=\"ow\"\u003eand\u003c/span\u003e \u003cspan class=\"n\"\u003econflicting\u003c/span\u003e \u003cspan class=\"n\"\u003ebehaviour\u003c/span\u003e \u003cspan class=\"n\"\u003ewith\u003c/span\u003e \u003cspan class=\"n\"\u003ethe\u003c/span\u003e \u003cspan class=\"n\"\u003esystem\u003c/span\u003e \u003cspan class=\"n\"\u003epackage\u003c/span\u003e \u003cspan class=\"n\"\u003emanager\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003epossibly\u003c/span\u003e \u003cspan class=\"n\"\u003erendering\u003c/span\u003e \u003cspan class=\"n\"\u003eyour\u003c/span\u003e \u003cspan class=\"n\"\u003esystem\u003c/span\u003e \u003cspan class=\"n\"\u003eunusable\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e \u003cspan class=\"n\"\u003eIt\u003c/span\u003e \u003cspan class=\"n\"\u003eis\u003c/span\u003e \u003cspan class=\"n\"\u003erecommended\u003c/span\u003e \u003cspan class=\"n\"\u003eto\u003c/span\u003e \u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003ea\u003c/span\u003e \u003cspan class=\"n\"\u003evirtual\u003c/span\u003e \u003cspan class=\"n\"\u003eenvironment\u003c/span\u003e \u003cspan class=\"n\"\u003einstead\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003ehttps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e//\u003c/span\u003e\u003cspan class=\"n\"\u003epip\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epypa\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eio\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003ewarnings\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003evenv\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e \u003cspan class=\"n\"\u003eUse\u003c/span\u003e \u003cspan class=\"n\"\u003ethe\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003eroot\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003euser\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eaction\u003c/span\u003e \u003cspan class=\"n\"\u003eoption\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003eyou\u003c/span\u003e \u003cspan class=\"n\"\u003eknow\u003c/span\u003e \u003cspan class=\"n\"\u003ewhat\u003c/span\u003e \u003cspan class=\"n\"\u003eyou\u003c/span\u003e \u003cspan class=\"n\"\u003eare\u003c/span\u003e \u003cspan class=\"n\"\u003edoing\u003c/span\u003e \u003cspan class=\"ow\"\u003eand\u003c/span\u003e \u003cspan class=\"n\"\u003ewant\u003c/span\u003e \u003cspan class=\"n\"\u003eto\u003c/span\u003e \u003cspan class=\"n\"\u003esuppress\u003c/span\u003e \u003cspan class=\"n\"\u003ethis\u003c/span\u003e \u003cspan class=\"n\"\u003ewarning\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eGPTSoVits\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003eroot\u003c/span\u003e\u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eautodl\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003econtainer\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e1421458302\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003efdce35d0\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e~/\u003c/span\u003e\u003cspan class=\"n\"\u003eautodl\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003etmp\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eGPT\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eSoVITS\u003c/span\u003e\u003cspan class=\"c1\"\u003e#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eGPTSoVits\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003eroot\u003c/span\u003e\u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eautodl\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003econtainer\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e1421458302\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003efdce35d0\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e~/\u003c/span\u003e\u003cspan class=\"n\"\u003eautodl\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003etmp\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eGPT\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eSoVITS\u003c/span\u003e\u003cspan class=\"c1\"\u003e#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eGPTSoVits\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003eroot\u003c/span\u003e\u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eautodl\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003econtainer\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e1421458302\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003efdce35d0\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e~/\u003c/span\u003e\u003cspan class=\"n\"\u003eautodl\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003etmp\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eGPT\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eSoVITS\u003c/span\u003e\u003cspan class=\"c1\"\u003e# python -m pip show torchcodec\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eName\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003etorchcodec\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eVersion\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.11\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"o\"\u003e+\u003c/span\u003e\u003cspan class=\"n\"\u003ecpu\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eSummary\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eA\u003c/span\u003e \u003cspan class=\"n\"\u003evideo\u003c/span\u003e \u003cspan class=\"n\"\u003edecoder\u003c/span\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003ePyTorch\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eHome\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003epage\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eAuthor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eAuthor\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eemail\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003ePyTorch\u003c/span\u003e \u003cspan class=\"n\"\u003eTeam\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003epackages\u003c/span\u003e\u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003epytorch\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eorg\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eLicense\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eBSD\u003c/span\u003e \u003cspan class=\"mi\"\u003e3\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eClause\u003c/span\u003e \u003cspan class=\"n\"\u003eLicense\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eCopyright\u003c/span\u003e \u003cspan class=\"mi\"\u003e2024\u003c/span\u003e \u003cspan class=\"n\"\u003eMeta\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eRedistribution\u003c/span\u003e \u003cspan class=\"ow\"\u003eand\u003c/span\u003e \u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003esource\u003c/span\u003e \u003cspan class=\"ow\"\u003eand\u003c/span\u003e \u003cspan class=\"n\"\u003ebinary\u003c/span\u003e \u003cspan class=\"n\"\u003eforms\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ewith\u003c/span\u003e \u003cspan class=\"ow\"\u003eor\u003c/span\u003e \u003cspan class=\"n\"\u003ewithout\u003c/span\u003e \u003cspan class=\"n\"\u003emodification\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eare\u003c/span\u003e \u003cspan class=\"n\"\u003epermitted\u003c/span\u003e \u003cspan class=\"n\"\u003eprovided\u003c/span\u003e \u003cspan class=\"n\"\u003ethat\u003c/span\u003e \u003cspan class=\"n\"\u003ethe\u003c/span\u003e \u003cspan class=\"n\"\u003efollowing\u003c/span\u003e \u003cspan class=\"n\"\u003econditions\u003c/span\u003e \u003cspan class=\"n\"\u003eare\u003c/span\u003e \u003cspan class=\"n\"\u003emet\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"mf\"\u003e1.\u003c/span\u003e \u003cspan class=\"n\"\u003eRedistributions\u003c/span\u003e \u003cspan class=\"n\"\u003eof\u003c/span\u003e \u003cspan class=\"n\"\u003esource\u003c/span\u003e \u003cspan class=\"n\"\u003ecode\u003c/span\u003e \u003cspan class=\"n\"\u003emust\u003c/span\u003e \u003cspan class=\"n\"\u003eretain\u003c/span\u003e \u003cspan class=\"n\"\u003ethe\u003c/span\u003e \u003cspan class=\"n\"\u003eabove\u003c/span\u003e \u003cspan class=\"n\"\u003ecopyright\u003c/span\u003e \u003cspan class=\"n\"\u003enotice\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e \u003cspan class=\"n\"\u003elist\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eof\u003c/span\u003e \u003cspan class=\"n\"\u003econditions\u003c/span\u003e \u003cspan class=\"ow\"\u003eand\u003c/span\u003e \u003cspan class=\"n\"\u003ethe\u003c/span\u003e \u003cspan class=\"n\"\u003efollowing\u003c/span\u003e \u003cspan class=\"n\"\u003edisclaimer\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"mf\"\u003e2.\u003c/span\u003e \u003cspan class=\"n\"\u003eRedistributions\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003ebinary\u003c/span\u003e \u003cspan class=\"n\"\u003eform\u003c/span\u003e \u003cspan class=\"n\"\u003emust\u003c/span\u003e \u003cspan class=\"n\"\u003ereproduce\u003c/span\u003e \u003cspan class=\"n\"\u003ethe\u003c/span\u003e \u003cspan class=\"n\"\u003eabove\u003c/span\u003e \u003cspan class=\"n\"\u003ecopyright\u003c/span\u003e \u003cspan class=\"n\"\u003enotice\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ethis\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003elist\u003c/span\u003e \u003cspan class=\"n\"\u003eof\u003c/span\u003e \u003cspan class=\"n\"\u003econditions\u003c/span\u003e \u003cspan class=\"ow\"\u003eand\u003c/span\u003e \u003cspan class=\"n\"\u003ethe\u003c/span\u003e \u003cspan class=\"n\"\u003efollowing\u003c/span\u003e \u003cspan class=\"n\"\u003edisclaimer\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003ethe\u003c/span\u003e \u003cspan class=\"n\"\u003edocumentation\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"ow\"\u003eand\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"ow\"\u003eor\u003c/span\u003e \u003cspan class=\"n\"\u003eother\u003c/span\u003e \u003cspan class=\"n\"\u003ematerials\u003c/span\u003e \u003cspan class=\"n\"\u003eprovided\u003c/span\u003e \u003cspan class=\"n\"\u003ewith\u003c/span\u003e \u003cspan class=\"n\"\u003ethe\u003c/span\u003e \u003cspan class=\"n\"\u003edistribution\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"mf\"\u003e3.\u003c/span\u003e \u003cspan class=\"n\"\u003eNeither\u003c/span\u003e \u003cspan class=\"n\"\u003ethe\u003c/span\u003e \u003cspan class=\"n\"\u003ename\u003c/span\u003e \u003cspan class=\"n\"\u003eof\u003c/span\u003e \u003cspan class=\"n\"\u003ethe\u003c/span\u003e \u003cspan class=\"n\"\u003ecopyright\u003c/span\u003e \u003cspan class=\"n\"\u003eholder\u003c/span\u003e \u003cspan class=\"n\"\u003enor\u003c/span\u003e \u003cspan class=\"n\"\u003ethe\u003c/span\u003e \u003cspan class=\"n\"\u003enames\u003c/span\u003e \u003cspan class=\"n\"\u003eof\u003c/span\u003e \u003cspan class=\"n\"\u003eits\u003c/span\u003e \u003cspan class=\"n\"\u003econtributors\u003c/span\u003e \u003cspan class=\"n\"\u003emay\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003ebe\u003c/span\u003e \u003cspan class=\"n\"\u003eused\u003c/span\u003e \u003cspan class=\"n\"\u003eto\u003c/span\u003e \u003cspan class=\"n\"\u003eendorse\u003c/span\u003e \u003cspan class=\"ow\"\u003eor\u003c/span\u003e \u003cspan class=\"n\"\u003epromote\u003c/span\u003e \u003cspan class=\"n\"\u003eproducts\u003c/span\u003e \u003cspan class=\"n\"\u003ederived\u003c/span\u003e \u003cspan class=\"n\"\u003efrom\u003c/span\u003e \u003cspan class=\"n\"\u003ethis\u003c/span\u003e \u003cspan class=\"n\"\u003esoftware\u003c/span\u003e \u003cspan class=\"n\"\u003ewithout\u003c/span\u003e \u003cspan class=\"n\"\u003especific\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eprior\u003c/span\u003e \u003cspan class=\"n\"\u003ewritten\u003c/span\u003e \u003cspan class=\"n\"\u003epermission\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eTHIS\u003c/span\u003e \u003cspan class=\"n\"\u003eSOFTWARE\u003c/span\u003e \u003cspan class=\"n\"\u003eIS\u003c/span\u003e \u003cspan class=\"n\"\u003ePROVIDED\u003c/span\u003e \u003cspan class=\"n\"\u003eBY\u003c/span\u003e \u003cspan class=\"n\"\u003eTHE\u003c/span\u003e \u003cspan class=\"n\"\u003eCOPYRIGHT\u003c/span\u003e \u003cspan class=\"n\"\u003eHOLDERS\u003c/span\u003e \u003cspan class=\"n\"\u003eAND\u003c/span\u003e \u003cspan class=\"n\"\u003eCONTRIBUTORS\u003c/span\u003e \u003cspan class=\"err\"\u003e“\u003c/span\u003e\u003cspan class=\"n\"\u003eAS\u003c/span\u003e \u003cspan class=\"n\"\u003eIS\u003c/span\u003e\u003cspan class=\"err\"\u003e”\u003c/span\u003e \u003cspan class=\"n\"\u003eAND\u003c/span\u003e \u003cspan class=\"n\"\u003eANY\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eEXPRESS\u003c/span\u003e \u003cspan class=\"n\"\u003eOR\u003c/span\u003e \u003cspan class=\"n\"\u003eIMPLIED\u003c/span\u003e \u003cspan class=\"n\"\u003eWARRANTIES\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eINCLUDING\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eBUT\u003c/span\u003e \u003cspan class=\"n\"\u003eNOT\u003c/span\u003e \u003cspan class=\"n\"\u003eLIMITED\u003c/span\u003e \u003cspan class=\"n\"\u003eTO\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eTHE\u003c/span\u003e \u003cspan class=\"n\"\u003eIMPLIED\u003c/span\u003e \u003cspan class=\"n\"\u003eWARRANTIES\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eOF\u003c/span\u003e \u003cspan class=\"n\"\u003eMERCHANTABILITY\u003c/span\u003e \u003cspan class=\"n\"\u003eAND\u003c/span\u003e \u003cspan class=\"n\"\u003eFITNESS\u003c/span\u003e \u003cspan class=\"n\"\u003eFOR\u003c/span\u003e \u003cspan class=\"n\"\u003eA\u003c/span\u003e \u003cspan class=\"n\"\u003ePARTICULAR\u003c/span\u003e \u003cspan class=\"n\"\u003ePURPOSE\u003c/span\u003e \u003cspan class=\"n\"\u003eARE\u003c/span\u003e \u003cspan class=\"n\"\u003eDISCLAIMED\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e \u003cspan class=\"n\"\u003eIN\u003c/span\u003e \u003cspan class=\"n\"\u003eNO\u003c/span\u003e \u003cspan class=\"n\"\u003eEVENT\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eSHALL\u003c/span\u003e \u003cspan class=\"n\"\u003eTHE\u003c/span\u003e \u003cspan class=\"n\"\u003eCOPYRIGHT\u003c/span\u003e \u003cspan class=\"n\"\u003eHOLDER\u003c/span\u003e \u003cspan class=\"n\"\u003eOR\u003c/span\u003e \u003cspan class=\"n\"\u003eCONTRIBUTORS\u003c/span\u003e \u003cspan class=\"n\"\u003eBE\u003c/span\u003e \u003cspan class=\"n\"\u003eLIABLE\u003c/span\u003e \u003cspan class=\"n\"\u003eFOR\u003c/span\u003e \u003cspan class=\"n\"\u003eANY\u003c/span\u003e \u003cspan class=\"n\"\u003eDIRECT\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eINDIRECT\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eINCIDENTAL\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eSPECIAL\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eEXEMPLARY\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eOR\u003c/span\u003e \u003cspan class=\"n\"\u003eCONSEQUENTIAL\u003c/span\u003e \u003cspan class=\"n\"\u003eDAMAGES\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eINCLUDING\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eBUT\u003c/span\u003e \u003cspan class=\"n\"\u003eNOT\u003c/span\u003e \u003cspan class=\"n\"\u003eLIMITED\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eTO\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ePROCUREMENT\u003c/span\u003e \u003cspan class=\"n\"\u003eOF\u003c/span\u003e \u003cspan class=\"n\"\u003eSUBSTITUTE\u003c/span\u003e \u003cspan class=\"n\"\u003eGOODS\u003c/span\u003e \u003cspan class=\"n\"\u003eOR\u003c/span\u003e \u003cspan class=\"n\"\u003eSERVICES\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"n\"\u003eLOSS\u003c/span\u003e \u003cspan class=\"n\"\u003eOF\u003c/span\u003e \u003cspan class=\"n\"\u003eUSE\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eDATA\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eOR\u003c/span\u003e \u003cspan class=\"n\"\u003ePROFITS\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"n\"\u003eOR\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eBUSINESS\u003c/span\u003e \u003cspan class=\"n\"\u003eINTERRUPTION\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003eHOWEVER\u003c/span\u003e \u003cspan class=\"n\"\u003eCAUSED\u003c/span\u003e \u003cspan class=\"n\"\u003eAND\u003c/span\u003e \u003cspan class=\"n\"\u003eON\u003c/span\u003e \u003cspan class=\"n\"\u003eANY\u003c/span\u003e \u003cspan class=\"n\"\u003eTHEORY\u003c/span\u003e \u003cspan class=\"n\"\u003eOF\u003c/span\u003e \u003cspan class=\"n\"\u003eLIABILITY\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eWHETHER\u003c/span\u003e \u003cspan class=\"n\"\u003eIN\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eCONTRACT\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eSTRICT\u003c/span\u003e \u003cspan class=\"n\"\u003eLIABILITY\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eOR\u003c/span\u003e \u003cspan class=\"n\"\u003eTORT\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eINCLUDING\u003c/span\u003e \u003cspan class=\"n\"\u003eNEGLIGENCE\u003c/span\u003e \u003cspan class=\"n\"\u003eOR\u003c/span\u003e \u003cspan class=\"n\"\u003eOTHERWISE\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003eARISING\u003c/span\u003e \u003cspan class=\"n\"\u003eIN\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eANY\u003c/span\u003e \u003cspan class=\"n\"\u003eWAY\u003c/span\u003e \u003cspan class=\"n\"\u003eOUT\u003c/span\u003e \u003cspan class=\"n\"\u003eOF\u003c/span\u003e \u003cspan class=\"n\"\u003eTHE\u003c/span\u003e \u003cspan class=\"n\"\u003eUSE\u003c/span\u003e \u003cspan class=\"n\"\u003eOF\u003c/span\u003e \u003cspan class=\"n\"\u003eTHIS\u003c/span\u003e \u003cspan class=\"n\"\u003eSOFTWARE\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eEVEN\u003c/span\u003e \u003cspan class=\"n\"\u003eIF\u003c/span\u003e \u003cspan class=\"n\"\u003eADVISED\u003c/span\u003e \u003cspan class=\"n\"\u003eOF\u003c/span\u003e \u003cspan class=\"n\"\u003eTHE\u003c/span\u003e \u003cspan class=\"n\"\u003ePOSSIBILITY\u003c/span\u003e \u003cspan class=\"n\"\u003eOF\u003c/span\u003e \u003cspan class=\"n\"\u003eSUCH\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eDAMAGE\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eLocation\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eroot\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eminiconda3\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eenvs\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eGPTSoVits\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003elib\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003epython3\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mi\"\u003e10\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003esite\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003epackages\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eRequires\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eRequired\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eby\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eGPTSoVits\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003eroot\u003c/span\u003e\u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eautodl\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003econtainer\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e1421458302\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003efdce35d0\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e~/\u003c/span\u003e\u003cspan class=\"n\"\u003eautodl\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003etmp\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eGPT\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eSoVITS\u003c/span\u003e\u003cspan class=\"c1\"\u003e#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003e解决ffmpeg错误\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eGPTSoVits\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003eroot\u003c/span\u003e\u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eautodl\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003econtainer\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e1421458302\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003efdce35d0\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e~/\u003c/span\u003e\u003cspan class=\"n\"\u003eautodl\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003etmp\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eGPT\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eSoVITS\u003c/span\u003e\u003cspan class=\"c1\"\u003e# ffmpeg -version\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003effmpeg\u003c/span\u003e \u003cspan class=\"n\"\u003eversion\u003c/span\u003e \u003cspan class=\"mf\"\u003e8.0\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e \u003cspan class=\"n\"\u003eCopyright\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ec\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"mi\"\u003e2000\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e2025\u003c/span\u003e \u003cspan class=\"n\"\u003ethe\u003c/span\u003e \u003cspan class=\"n\"\u003eFFmpeg\u003c/span\u003e \u003cspan class=\"n\"\u003edevelopers\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ebuilt\u003c/span\u003e \u003cspan class=\"n\"\u003ewith\u003c/span\u003e \u003cspan class=\"n\"\u003egcc\u003c/span\u003e \u003cspan class=\"mf\"\u003e14.3\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eGCC\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003econfiguration\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003eprefix\u003c/span\u003e\u003cspan class=\"o\"\u003e=/\u003c/span\u003e\u003cspan class=\"n\"\u003ehome\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003etask_177790567462050\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003ecroot\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003effmpeg_1777905727578\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003e_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_plac\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003ecc\u003c/span\u003e\u003cspan class=\"o\"\u003e=/\u003c/span\u003e\u003cspan class=\"n\"\u003ehome\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003etask_177790567462050\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003ecroot\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003effmpeg_1777905727578\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003e_build_env\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003ebin\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003ex86_64\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003econda\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003elinux\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003egnu\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ecc\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003ecxx\u003c/span\u003e\u003cspan class=\"o\"\u003e=/\u003c/span\u003e\u003cspan class=\"n\"\u003ehome\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003etask_177790567462050\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003ecroot\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003effmpeg_1777905727578\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003e_build_env\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003ebin\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003ex86_64\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003econda\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003elinux\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003egnu\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ec\u003c/span\u003e\u003cspan class=\"o\"\u003e++\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003enm\u003c/span\u003e\u003cspan class=\"o\"\u003e=/\u003c/span\u003e\u003cspan class=\"n\"\u003ehome\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003etask_177790567462050\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003ecroot\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003effmpeg_1777905727578\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003e_build_env\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003ebin\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003ex86_64\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003econda\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003elinux\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003egnu\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003enm\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003ear\u003c/span\u003e\u003cspan class=\"o\"\u003e=/\u003c/span\u003e\u003cspan class=\"n\"\u003ehome\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003etask_177790567462050\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003ecroot\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003effmpeg_1777905727578\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003e_build_env\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003ebin\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003ex86_64\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003econda\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003elinux\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003egnu\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ear\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003eenable\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eopenssl\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003eenable\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003edemuxer\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003edash\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003eenable\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ehardcoded\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003etables\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003eenable\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003elibfreetype\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003eenable\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003elibharfbuzz\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003eenable\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003elibfontconfig\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003eenable\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003elibopenh264\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003eenable\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003elibdav1d\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003eenable\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003elibmp3lame\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003eenable\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003elibaom\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003eenable\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003elibsvtav1\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003eenable\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003elibxml2\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003eenable\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003epic\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003eenable\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eshared\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003eenable\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eversion3\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003eenable\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ezlib\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003eenable\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003elibvorbis\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003eenable\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003elibopus\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003eenable\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003elibwebp\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003eenable\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003elibshaderc\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003edisable\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003effplay\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003edisable\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"k\"\u003estatic\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003edisable\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003egpl\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003edisable\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003edoc\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003epkg\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003econfig\u003c/span\u003e\u003cspan class=\"o\"\u003e=/\u003c/span\u003e\u003cspan class=\"n\"\u003ehome\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003etask_177790567462050\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003ecroot\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003effmpeg_1777905727578\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003e_build_env\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003ebin\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003epkg\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003econfig\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003earch\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003ex86_64\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003etarget\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eos\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003elinux\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003ecross\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eprefix\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003ex86_64\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003econda\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003elinux\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003egnu\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003ehost\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ecc\u003c/span\u003e\u003cspan class=\"o\"\u003e=/\u003c/span\u003e\u003cspan class=\"n\"\u003ehome\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003etask_177790567462050\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003ecroot\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003effmpeg_1777905727578\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003e_build_env\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003ebin\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003ex86_64\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003econda\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003elinux\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003egnu\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ecc\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003edisable\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003egnutls\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003eenable\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003elibvpx\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003eenable\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003epthreads\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003eenable\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ealsa\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003eenable\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003elibpulse\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003eenable\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003elibdrm\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003eenable\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003elibvpl\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003eenable\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003evaapi\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003eenable\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003elibtesseract\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003eenable\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003elibvpx\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003eenable\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003elibass\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003eenable\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003elibrsvg\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003elibavutil\u003c/span\u003e      \u003cspan class=\"mf\"\u003e60.\u003c/span\u003e  \u003cspan class=\"mf\"\u003e8.100\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u003c/span\u003e \u003cspan class=\"mf\"\u003e60.\u003c/span\u003e  \u003cspan class=\"mf\"\u003e8.100\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003elibavcodec\u003c/span\u003e     \u003cspan class=\"mf\"\u003e62.\u003c/span\u003e \u003cspan class=\"mf\"\u003e11.100\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u003c/span\u003e \u003cspan class=\"mf\"\u003e62.\u003c/span\u003e \u003cspan class=\"mf\"\u003e11.100\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003elibavformat\u003c/span\u003e    \u003cspan class=\"mf\"\u003e62.\u003c/span\u003e  \u003cspan class=\"mf\"\u003e3.100\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u003c/span\u003e \u003cspan class=\"mf\"\u003e62.\u003c/span\u003e  \u003cspan class=\"mf\"\u003e3.100\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003elibavdevice\u003c/span\u003e    \u003cspan class=\"mf\"\u003e62.\u003c/span\u003e  \u003cspan class=\"mf\"\u003e1.100\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u003c/span\u003e \u003cspan class=\"mf\"\u003e62.\u003c/span\u003e  \u003cspan class=\"mf\"\u003e1.100\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003elibavfilter\u003c/span\u003e    \u003cspan class=\"mf\"\u003e11.\u003c/span\u003e  \u003cspan class=\"mf\"\u003e4.100\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u003c/span\u003e \u003cspan class=\"mf\"\u003e11.\u003c/span\u003e  \u003cspan class=\"mf\"\u003e4.100\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003elibswscale\u003c/span\u003e      \u003cspan class=\"mf\"\u003e9.\u003c/span\u003e  \u003cspan class=\"mf\"\u003e1.100\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u003c/span\u003e  \u003cspan class=\"mf\"\u003e9.\u003c/span\u003e  \u003cspan class=\"mf\"\u003e1.100\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003elibswresample\u003c/span\u003e   \u003cspan class=\"mf\"\u003e6.\u003c/span\u003e  \u003cspan class=\"mf\"\u003e1.100\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u003c/span\u003e  \u003cspan class=\"mf\"\u003e6.\u003c/span\u003e  \u003cspan class=\"mf\"\u003e1.100\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eExiting\u003c/span\u003e \u003cspan class=\"n\"\u003ewith\u003c/span\u003e \u003cspan class=\"n\"\u003eexit\u003c/span\u003e \u003cspan class=\"n\"\u003ecode\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eGPTSoVits\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003eroot\u003c/span\u003e\u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eautodl\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003econtainer\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e1421458302\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003efdce35d0\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e~/\u003c/span\u003e\u003cspan class=\"n\"\u003eautodl\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003etmp\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eGPT\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eSoVITS\u003c/span\u003e\u003cspan class=\"c1\"\u003e#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eGPTSoVits\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003eroot\u003c/span\u003e\u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eautodl\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003econtainer\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e1421458302\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003efdce35d0\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e~/\u003c/span\u003e\u003cspan class=\"n\"\u003eautodl\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003etmp\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eGPT\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eSoVITS\u003c/span\u003e\u003cspan class=\"c1\"\u003e#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eGPTSoVits\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003eroot\u003c/span\u003e\u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eautodl\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003econtainer\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e1421458302\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003efdce35d0\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e~/\u003c/span\u003e\u003cspan class=\"n\"\u003eautodl\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003etmp\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eGPT\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eSoVITS\u003c/span\u003e\u003cspan class=\"c1\"\u003e# ls $CONDA_PREFIX/lib/libavutil.so*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eroot\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eminiconda3\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eenvs\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eGPTSoVits\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003elib\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003elibavutil\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eso\u003c/span\u003e  \u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eroot\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eminiconda3\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eenvs\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eGPTSoVits\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003elib\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003elibavutil\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eso\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mi\"\u003e60\u003c/span\u003e  \u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eroot\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eminiconda3\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eenvs\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eGPTSoVits\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003elib\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003elibavutil\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eso\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mf\"\u003e60.8\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mi\"\u003e100\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eGPTSoVits\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003eroot\u003c/span\u003e\u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eautodl\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003econtainer\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e1421458302\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003efdce35d0\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e~/\u003c/span\u003e\u003cspan class=\"n\"\u003eautodl\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003etmp\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eGPT\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eSoVITS\u003c/span\u003e\u003cspan class=\"c1\"\u003e# ls $CONDA_PREFIX/lib/libavcodec.so*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eroot\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eminiconda3\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eenvs\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eGPTSoVits\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003elib\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003elibavcodec\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eso\u003c/span\u003e  \u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eroot\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eminiconda3\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eenvs\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eGPTSoVits\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003elib\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003elibavcodec\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eso\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mi\"\u003e62\u003c/span\u003e  \u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eroot\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eminiconda3\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eenvs\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eGPTSoVits\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003elib\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003elibavcodec\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eso\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mf\"\u003e62.11\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mi\"\u003e100\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eGPTSoVits\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003eroot\u003c/span\u003e\u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eautodl\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003econtainer\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e1421458302\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003efdce35d0\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e~/\u003c/span\u003e\u003cspan class=\"n\"\u003eautodl\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003etmp\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eGPT\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eSoVITS\u003c/span\u003e\u003cspan class=\"c1\"\u003e# ls $CONDA_PREFIX/lib/libavformat.so*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eroot\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eminiconda3\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eenvs\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eGPTSoVits\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003elib\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003elibavformat\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eso\u003c/span\u003e  \u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eroot\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eminiconda3\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eenvs\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eGPTSoVits\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003elib\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003elibavformat\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eso\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mi\"\u003e62\u003c/span\u003e  \u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eroot\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eminiconda3\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eenvs\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eGPTSoVits\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003elib\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003elibavformat\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eso\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mf\"\u003e62.3\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mi\"\u003e100\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eGPTSoVits\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003eroot\u003c/span\u003e\u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eautodl\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003econtainer\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e1421458302\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003efdce35d0\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e~/\u003c/span\u003e\u003cspan class=\"n\"\u003eautodl\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003etmp\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eGPT\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eSoVITS\u003c/span\u003e\u003cspan class=\"c1\"\u003e# ls $CONDA_PREFIX/lib/libstdc++.so*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eroot\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eminiconda3\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eenvs\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eGPTSoVits\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003elib\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003elibstdc\u003c/span\u003e\u003cspan class=\"o\"\u003e++.\u003c/span\u003e\u003cspan class=\"n\"\u003eso\u003c/span\u003e  \u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eroot\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eminiconda3\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eenvs\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eGPTSoVits\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003elib\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003elibstdc\u003c/span\u003e\u003cspan class=\"o\"\u003e++.\u003c/span\u003e\u003cspan class=\"n\"\u003eso\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mi\"\u003e6\u003c/span\u003e  \u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eroot\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eminiconda3\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eenvs\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eGPTSoVits\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003elib\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003elibstdc\u003c/span\u003e\u003cspan class=\"o\"\u003e++.\u003c/span\u003e\u003cspan class=\"n\"\u003eso\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mf\"\u003e6.0\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mi\"\u003e34\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eGPTSoVits\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003eroot\u003c/span\u003e\u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eautodl\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003econtainer\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e1421458302\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003efdce35d0\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e~/\u003c/span\u003e\u003cspan class=\"n\"\u003eautodl\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003etmp\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eGPT\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eSoVITS\u003c/span\u003e\u003cspan class=\"c1\"\u003e#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eGPTSoVits\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003eroot\u003c/span\u003e\u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eautodl\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003econtainer\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e1421458302\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003efdce35d0\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e~/\u003c/span\u003e\u003cspan class=\"n\"\u003eautodl\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003etmp\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eGPT\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eSoVITS\u003c/span\u003e\u003cspan class=\"c1\"\u003e# echo $LD_LIBRARY_PATH\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eGPTSoVits\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003eroot\u003c/span\u003e\u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eautodl\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003econtainer\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e1421458302\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003efdce35d0\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e~/\u003c/span\u003e\u003cspan class=\"n\"\u003eautodl\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003etmp\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eGPT\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eSoVITS\u003c/span\u003e\u003cspan class=\"c1\"\u003e#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eGPTSoVits\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003eroot\u003c/span\u003e\u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eautodl\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003econtainer\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e1421458302\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003efdce35d0\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e~/\u003c/span\u003e\u003cspan class=\"n\"\u003eautodl\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003etmp\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eGPT\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eSoVITS\u003c/span\u003e\u003cspan class=\"c1\"\u003e# export LD_LIBRARY_PATH=\u0026#34;$CONDA_PREFIX/lib:$LD_LIBRARY_PATH\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eGPTSoVits\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003eroot\u003c/span\u003e\u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eautodl\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003econtainer\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e1421458302\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003efdce35d0\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e~/\u003c/span\u003e\u003cspan class=\"n\"\u003eautodl\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003etmp\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eGPT\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eSoVITS\u003c/span\u003e\u003cspan class=\"c1\"\u003e#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eGPTSoVits\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003eroot\u003c/span\u003e\u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eautodl\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003econtainer\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e1421458302\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003efdce35d0\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e~/\u003c/span\u003e\u003cspan class=\"n\"\u003eautodl\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003etmp\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eGPT\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eSoVITS\u003c/span\u003e\u003cspan class=\"c1\"\u003e# echo $LD_LIBRARY_PATH\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eroot\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eminiconda3\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eenvs\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eGPTSoVits\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003elib\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eGPTSoVits\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003eroot\u003c/span\u003e\u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eautodl\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003econtainer\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e1421458302\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003efdce35d0\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e~/\u003c/span\u003e\u003cspan class=\"n\"\u003eautodl\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003etmp\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eGPT\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eSoVITS\u003c/span\u003e\u003cspan class=\"c1\"\u003e#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"fish-speech\"\u003eFish Speech\u003c/h3\u003e\n\u003cp\u003e项目地址：\u003ca href=\"https://github.com/fishaudio/fish-speech\"\u003ehttps://github.com/fishaudio/fish-speech\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eFish Audio S2 Pro 是 Fish Audio 开发的最先进的多模态模型。S2 Pro 训练自超过 1000 万小时 的海量音频数据，覆盖全球 80 多种语言。通过创新的 双自回归 (Dual-AR) 架构与强化学习 (RL) 对齐技术，S2 Pro 能生成极具自然感、真实感且情感饱满的语音，在开源与闭源竞争中均处于领先地位。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch4 id=\"部署测试-3\"\u003e部署测试\u003c/h4\u003e\n\u003col\u003e\n\u003cli\u003e安装系统依赖\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eapt-get update\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eapt install portaudio19-dev libsox-dev ffmpeg\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"2\"\u003e\n\u003cli\u003e克隆代码\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egit clone https://github.com/fishaudio/fish-speech.git\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecd fish-speech\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"3\"\u003e\n\u003cli\u003eCreate Conda env\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003econda create -n fish-speech python=3.12 -y\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003econda activate fish-speech\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"4\"\u003e\n\u003cli\u003e安装依赖\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epip install -e .[cu128]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"5\"\u003e\n\u003cli\u003e下载模型\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# 国内可以配置这个镜像\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# export HF_ENDPOINT=\u0026#34;https://hf-mirror.com\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ehf\u003c/span\u003e \u003cspan class=\"n\"\u003edownload\u003c/span\u003e \u003cspan class=\"n\"\u003efishaudio\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003es2\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003epro\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003elocal\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003edir\u003c/span\u003e \u003cspan class=\"n\"\u003echeckpoints\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003es2\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003epro\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"6\"\u003e\n\u003cli\u003e合成测试\u003c/li\u003e\n\u003c/ol\u003e\n\u003cul\u003e\n\u003cli\u003e方式一：命令行\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epython fish_speech/models/dac/inference.py \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -i \u0026#34;test.wav\u0026#34; \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --checkpoint-path \u0026#34;checkpoints/s2-pro/codec.pth\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# test.wav为参考音频，执行后会得到fake.npy和fake.wav两个文件。\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epython fish_speech/models/text2semantic/inference.py \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --text \u0026#34;这是要合成的目标文本\u0026#34; \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --prompt-text \u0026#34;这里填写参考音频对应的真实文本\u0026#34; \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --prompt-tokens \u0026#34;fake.npy\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# 执行后，在output目录下会生成codes_0.npy文件。\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epython fish_speech/models/dac/inference.py \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -i \u0026#34;./output/codes_0.npy\u0026#34; \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --checkpoint-path \u0026#34;checkpoints/s2-pro/codec.pth\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# 最终得到合成后的fake.wav文件。\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003e方式二：API调用\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e启动API服务\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003epython\u003c/span\u003e \u003cspan class=\"n\"\u003etools\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eapi_server\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epy\u003c/span\u003e \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003ellama\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003echeckpoint\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003epath\u003c/span\u003e \u003cspan class=\"n\"\u003echeckpoints\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003es2\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003epro\u003c/span\u003e \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003edecoder\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003echeckpoint\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003epath\u003c/span\u003e \u003cspan class=\"n\"\u003echeckpoints\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003es2\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003epro\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003ecodec\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epth\u003c/span\u003e \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003elisten\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.0\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mf\"\u003e0.0\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"mi\"\u003e8080\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e调用API触发音频合成\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003epython\u003c/span\u003e \u003cspan class=\"n\"\u003etools\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eapi_client\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epy\u003c/span\u003e \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003eurl\u003c/span\u003e \u003cspan class=\"n\"\u003ehttp\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e//\u003c/span\u003e\u003cspan class=\"mf\"\u003e127.0\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mf\"\u003e0.1\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"mi\"\u003e8080\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003ev1\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003etts\u003c/span\u003e \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003ereference_audio\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;参考音频文件路径\u0026#34;\u003c/span\u003e \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003ereference_text\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;参考音频的文本内容\u0026#34;\u003c/span\u003e \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003etext\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;合成音频的文本内容\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003eno\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eplay\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e合成的音频文件默认为generated_audio.wav文件。\u003c/p\u003e\n\u003cp\u003e命令行合成耗时在\u003cstrong\u003e1min+\u003c/strong\u003e，API合成耗时在\u003cstrong\u003e30s+\u003c/strong\u003e，合成后的音频效果：\u003c/p\u003e\n\u003cfigure\u003e\n    \u003caudio controls preload=\"none\"\u003e\n      \u003csource src=\"fish-speech.wav\"\u003e\n      Your browser does not support the audio element.\n    \u003c/audio\u003e\n\u003c/figure\u003e\n\u003ch4 id=\"问题整理-3\"\u003e问题整理\u003c/h4\u003e\n\u003col\u003e\n\u003cli\u003efatal error: portaudio.h: No such file or directory\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003econda install -y -c conda-forge portaudio\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e装完后先验证头文件是否存在：\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003efind $CONDA_PREFIX -name portaudio.h\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e再重试安装：\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epip install -e .[cu128]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"2\"\u003e\n\u003cli\u003epython tools/api_client.py报错“OSError: [Errno -9996] Invalid output device (no default output device)”\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e增加\u0026ndash;no-play参数即可。\u003c/p\u003e\n\u003ch3 id=\"voxcpm\"\u003eVoxCPM\u003c/h3\u003e\n\u003cp\u003e项目地址：\u003ca href=\"https://github.com/OpenBMB/VoxCPM\"\u003ehttps://github.com/OpenBMB/VoxCPM\u003c/a\u003e\u003c/p\u003e\n\u003ch4 id=\"部署测试-4\"\u003e部署测试\u003c/h4\u003e\n\u003col\u003e\n\u003cli\u003e安装服务\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epip install voxcpm\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"2\"\u003e\n\u003cli\u003e合成测试\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003evoxcpm clone \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    --text \u0026#34;This is a cloned voice sample.\u0026#34; \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    --reference-audio path/to/voice.wav \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    --output out.wav\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e使用命令行方式，\u003ccode\u003e--text\u003c/code\u003e为克隆后的音频内容，\u003ccode\u003e--reference-audio\u003c/code\u003e为参考音频，\u003ccode\u003e--output\u003c/code\u003e为生成后的音频文件。\u003c/p\u003e\n\u003cp\u003e第一次执行需要下载模型，会慢一些，合成耗时在\u003cstrong\u003e7s\u003c/strong\u003e左右，合成后的音频效果：\u003c/p\u003e\n\u003cfigure\u003e\n    \u003caudio controls preload=\"none\"\u003e\n      \u003csource src=\"voxcpm.wav\"\u003e\n      Your browser does not support the audio element.\n    \u003c/audio\u003e\n\u003c/figure\u003e\n\u003ch2 id=\"效果对比\"\u003e效果对比\u003c/h2\u003e\n\u003ch3 id=\"参考音频\"\u003e参考音频\u003c/h3\u003e\n\u003cfigure\u003e\n    \u003caudio controls preload=\"none\"\u003e\n      \u003csource src=\"child.wav\"\u003e\n      Your browser does not support the audio element.\n    \u003c/audio\u003e\n\u003c/figure\u003e\n\u003ch3 id=\"indextts-2-1\"\u003eIndexTTS-2\u003c/h3\u003e\n\u003cfigure\u003e\n    \u003caudio controls preload=\"none\"\u003e\n      \u003csource src=\"indextts.wav\"\u003e\n      Your browser does not support the audio element.\n    \u003c/audio\u003e\n\u003c/figure\u003e\n\u003ch3 id=\"cosyvoice-1\"\u003eCosyVoice\u003c/h3\u003e\n\u003cfigure\u003e\n    \u003caudio controls preload=\"none\"\u003e\n      \u003csource src=\"cosyvoice.wav\"\u003e\n      Your browser does not support the audio element.\n    \u003c/audio\u003e\n\u003c/figure\u003e\n\u003ch3 id=\"gpt-sovits-1\"\u003eGPT-SoVITS\u003c/h3\u003e\n\u003cfigure\u003e\n    \u003caudio controls preload=\"none\"\u003e\n      \u003csource src=\"GPT-SoVITS.wav\"\u003e\n      Your browser does not support the audio element.\n    \u003c/audio\u003e\n\u003c/figure\u003e\n\u003ch3 id=\"fish-speech-1\"\u003eFish Speech\u003c/h3\u003e\n\u003cfigure\u003e\n    \u003caudio controls preload=\"none\"\u003e\n      \u003csource src=\"fish-speech.wav\"\u003e\n      Your browser does not support the audio element.\n    \u003c/audio\u003e\n\u003c/figure\u003e\n\u003ch3 id=\"voxcpm-1\"\u003eVoxCPM\u003c/h3\u003e\n\u003cfigure\u003e\n    \u003caudio controls preload=\"none\"\u003e\n      \u003csource src=\"voxcpm.wav\"\u003e\n      Your browser does not support the audio element.\n    \u003c/audio\u003e\n\u003c/figure\u003e\n\u003cp\u003e从试听结果来看，IndexTTS-2、CosyVoice、Fish Speech 和 VoxCPM 的整体完成度更高，但IndexTTS-2的合成耗时明显更长。\u003c/p\u003e\n\u003ch2 id=\"方案总结\"\u003e方案总结\u003c/h2\u003e\n\u003cp\u003e以下结论基于同一测试环境、同一参考音频和同一目标文本下的部署与试听结果，只用于本次选型记录：\u003c/p\u003e\n\u003ctable\u003e\n\t\u003cthead\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003cth\u003e方案\u003c/th\u003e\n\t\t\t\t\t\u003cth\u003e本文实测耗时\u003c/th\u003e\n\t\t\t\t\t\u003cth\u003e本次测试记录\u003c/th\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/thead\u003e\n\t\u003ctbody\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eIndexTTS-2\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e2 分钟以上\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e试听完成度较高，但合成耗时明显更长。\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eCosyVoice\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e约 24 秒\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e试听完成度较高。\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eGPT-SoVITS\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e10 秒内\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e已完成部署与试听验证。\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eFish Speech\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e命令行 1 分钟以上；API 30 秒以上\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e试听完成度较高。\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eVoxCPM\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e约 7 秒\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e部署简单、试听效果很好，并支持 CPU、CUDA、MPS 运行。\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e如果只推荐一个用于快速上手，我目前更推荐 \u003cstrong\u003eVoxCPM\u003c/strong\u003e：它在本次测试中部署简单、效果符合预期，并且运行方式覆盖 CPU、CUDA、MPS。具体效果仍应以自己的参考音频、目标文本和硬件环境复测为准。\u003c/p\u003e\n\u003cp\u003e如果要把生成的配音进一步制作成真人口播视频，还需要处理音频与嘴型的同步；可继续阅读\u003ca href=\"https://liudon.com/posts/lip-sync-video-synthesis-comparison/\"\u003e对口型视频合成方案对比\u003c/a\u003e。这两类能力串联后的实际应用，可以参考我做的\u003ca href=\"https://liudon.com/posts/video-remaker-talking-head-video/\"\u003e口播短视频二创工具 VideoRemaker\u003c/a\u003e。\u003c/p\u003e\n","date_published":"2026-05-18T15:19:23+08:00","tags":["音色克隆","voice-cloning","TTS","语音合成","IndexTTS-2","CosyVoice","GPT-SoVITS","Fish Speech","VoxCPM"]},{"title":"AI Agent折腾记（OpenClaw / Hermes Agent）","id":"https://liudon.com/posts/deploy-ai-agent/","url":"https://liudon.com/posts/deploy-ai-agent/","summary":"记录在 2 核 4G 云服务器上部署和使用 OpenClaw、Hermes Agent 的过程，以及内存、定时任务和辅助模型计费问题。","content_html":"\u003cblockquote\u003e\n\u003cp\u003eAI 智能体（AI Agent）是一种能够感知环境、进行推理并自主行动以实现特定目标的智能系统。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e本文记录我在一台 2 核 4G 云服务器上部署 OpenClaw 和 Hermes Agent 的过程，以及实际遇到的问题。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003e版本说明\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e本文命令和现象基于 2026 年 4 月的实际部署环境。两个项目更新较快，当前安装方式请优先参考 \u003ca href=\"https://docs.openclaw.ai/install/docker\"\u003eOpenClaw Docker 文档\u003c/a\u003e和 \u003ca href=\"https://hermes-agent.nousresearch.com/docs/getting-started/installation\"\u003eHermes Agent 安装文档\u003c/a\u003e，本文保留当时的命令用于说明问题复现环境。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e两次体验没有做标准化性能测试，下面只是同一台低配服务器上的实际感受：\u003c/p\u003e\n\u003ctable\u003e\n\t\u003cthead\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003cth\u003e项目\u003c/th\u003e\n\t\t\t\t\t\u003cth\u003e本次部署体验\u003c/th\u003e\n\t\t\t\t\t\u003cth\u003e实际遇到的问题\u003c/th\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/thead\u003e\n\t\u003ctbody\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eOpenClaw\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eDocker 部署，安装微信插件时出现明显内存压力\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e插件安装中断；Gateway 偶发连接失败，Cron 未按时执行\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\t\t\u003ctr\u003e\n\t\t\t\t\t\u003ctd\u003eHermes Agent\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003eDocker 部署，交互响应主观上更快\u003c/td\u003e\n\t\t\t\t\t\u003ctd\u003e辅助模型默认配置可能调用与主模型不同的收费模型\u003c/td\u003e\n\t\t\t\u003c/tr\u003e\n\t\u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch2 id=\"openclaw小龙虾\"\u003eOpenClaw（小龙虾）\u003c/h2\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWhat is OpenClaw?\u003c/p\u003e\n\u003cp\u003eOpenClaw is a self-hosted gateway that connects your favorite chat apps and channel surfaces — built-in channels plus bundled or external channel plugins such as Discord, Google Chat, iMessage, Matrix, Microsoft Teams, Signal, Slack, Telegram, WhatsApp, Zalo, and more — to AI coding agents like Pi. You run a single Gateway process on your own machine (or a server), and it becomes the bridge between your messaging apps and an always-available AI assistant.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch3 id=\"安装\"\u003e安装\u003c/h3\u003e\n\u003cp\u003e本着方便重置环境的想法，当时直接使用 Docker 容器部署。OpenClaw 当前官方 Docker 文档使用 Docker Compose 和安装脚本，下面保留的是我测试时使用的单容器命令：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# 创建根目录\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emkdir -p ~/.openclaw\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# 启动openclaw容器\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker run -d \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --name openclaw \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --restart unless-stopped \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --memory=\u0026#34;3g\u0026#34; \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --memory-swap=\u0026#34;6g\u0026#34; \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --memory-reservation=\u0026#34;1g\u0026#34; \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --shm-size=\u0026#34;2gb\u0026#34; \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -e TZ=Asia/Shanghai \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -v ~/.openclaw:/home/node/.openclaw \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -p 3000:3000 \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  ghcr.io/openclaw/openclaw:latest\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# 进行openclaw配置\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker exec -it openclaw openclaw onboard\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# 安装微信插件\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker exec -it -u node openclaw npx -y @tencent-weixin/openclaw-weixin-cli@latest install\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"问题\"\u003e问题\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e安装微信插件失败，到最后一步输出二维码时中断退出。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/deploy-ai-agent/monitor.png_320x.avif 320w, https://liudon.com/posts/deploy-ai-agent/monitor.png_480x.avif 480w, https://liudon.com/posts/deploy-ai-agent/monitor.png_720x.avif 720w, https://liudon.com/posts/deploy-ai-agent/monitor.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/deploy-ai-agent/monitor.png_320x.webp 320w, https://liudon.com/posts/deploy-ai-agent/monitor.png_480x.webp 480w, https://liudon.com/posts/deploy-ai-agent/monitor.png_720x.webp 720w, https://liudon.com/posts/deploy-ai-agent/monitor.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/deploy-ai-agent/monitor.png\" alt=\"\"\n         width=\"1080\" height=\"226\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e查看机器监控，看到内存基本满了。\u003c/p\u003e\n\u003cp\u003e我这是一台Lighthouse主机，2核4G，配置较低。\u003c/p\u003e\n\u003cp\u003e结合监控中的内存占用，我为机器增加了 Swap，避免安装过程再次因可用内存不足而中断。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# 1. 创建一个 2GB 的交换文件 (可以根据需要把 2G 改为 4G)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo fallocate -l 2G /swapfile\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# 2. 设置正确的权限（仅 root 可读写，出于安全考虑）\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo chmod 600 /swapfile\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# 3. 将文件格式化为交换分区\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo mkswap /swapfile\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# 4. 启用交换文件\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo swapon /swapfile\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# 5. 验证是否成功\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo swapon --show\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# 6. 设置开机自动挂载\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eecho \u0026#39;/swapfile none swap sw 0 0\u0026#39; | sudo tee -a /etc/fstab\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"2\"\u003e\n\u003cli\u003e配置cron任务，经常无法按时执行。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egateway connect failed: Error: gateway closed (1000): \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e◇  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGateway not reachable. Is it running and accessible?\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGateway target: ws://127.0.0.1:18789\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSource: local loopback\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eConfig: /home/node/.openclaw/openclaw.json\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eBind: loopback\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e检查发现有时gateway会连接失败，这个问题时好时坏，怀疑可能还是机器配置较低引起的。\u003c/p\u003e\n\u003ch2 id=\"hermes-agent\"\u003eHermes Agent\u003c/h2\u003e\n\u003cblockquote\u003e\n\u003cp\u003eWhat is Hermes Agent?\u003c/p\u003e\n\u003cp\u003eIt\u0026rsquo;s not a coding copilot tethered to an IDE or a chatbot wrapper around a single API. It\u0026rsquo;s an autonomous agent that gets more capable the longer it runs. It lives wherever you put it — a $5 VPS, a GPU cluster, or serverless infrastructure (Daytona, Modal) that costs nearly nothing when idle. Talk to it from Telegram while it works on a cloud VM you never SSH into yourself. It\u0026rsquo;s not tied to your laptop.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e在这台 2 核 4G 服务器上的实际使用中，Hermes Agent 的运行体感更轻一些。\u003c/p\u003e\n\u003ch3 id=\"安装-1\"\u003e安装\u003c/h3\u003e\n\u003cp\u003e当时依旧使用 Docker 部署。Hermes Agent 当前官方文档推荐使用安装脚本，下面是本文测试时的容器命令：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl -fsSL https://hermes-agent.nousresearch.com/install.sh \u003cspan class=\"p\"\u003e|\u003c/span\u003e bash\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e如果要复现本文的 Docker 环境，可以继续使用下面的命令，但参数应以当前项目文档为准。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# 创建根目录\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emkdir -p ~/.hermes\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# 启动容器，配置模型/消息通道\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker run -it --rm \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -v ~/.hermes:/opt/data \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  nousresearch/hermes-agent setup\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# 启动gateway\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker run -d \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --name hermes \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  --restart unless-stopped \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  -v ~/.hermes:/opt/data \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  nousresearch/hermes-agent gateway run\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e模型我选择了OpenRouter，输入API Key，选择\u003ccode\u003envidia/nemotron-3-super-120b-a12b:free\u003c/code\u003e免费模型。\u003c/p\u003e\n\u003cp\u003e消息通道选择weixin，模式选择pairing，扫描二维码进行绑定。\u003c/p\u003e\n\u003cp\u003e启动gateway后，微信Clawbot会收到一个配对消息，类似如下：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-mysql\" data-lang=\"mysql\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eHi\u003c/span\u003e\u003cspan class=\"o\"\u003e~\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eI\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003edon\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;t recognize you yet!\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s1\"\u003eHere\u0026#39;\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eyour\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003epairing\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ecode\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e`\u003c/span\u003e\u003cspan class=\"n\"\u003eRLU2WUYX\u003c/span\u003e\u003cspan class=\"o\"\u003e`\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eAsk\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ethe\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ebot\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eowner\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eto\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e`\u003c/span\u003e\u003cspan class=\"n\"\u003ehermes\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003epairing\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eapprove\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eweixin\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eRLU2WUYX\u003c/span\u003e\u003cspan class=\"o\"\u003e`\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e进入hermes镜像里执行最后这个命令，之后就可以通过微信Clawbot控制了。\u003c/p\u003e\n\u003ch3 id=\"问题-1\"\u003e问题\u003c/h3\u003e\n\u003cp\u003e\u003cimg src=\"hermes%20agent%20cost.png\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/p\u003e\n\u003cp\u003e我配置的是免费模型，但是看OpenRouter的Logs，时不时会有\u003ccode\u003eGemini 3 Flash Preview\u003c/code\u003e模型的调用，产生费用。\u003c/p\u003e\n\u003cp\u003e通过走读代码，终于发现问题所在了，hermes agent有主模型和辅助模型两类。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eHermes uses lightweight \u0026ldquo;auxiliary\u0026rdquo; models for side tasks like image analysis, web page summarization, and browser screenshot analysis. By default, these use Gemini Flash via auto-detection — you don\u0026rsquo;t need to configure anything.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e这里以\u003ccode\u003evision\u003c/code\u003e图像识别举例：\u003c/p\u003e\n\u003cp\u003econfig.yaml文件里\u003ccode\u003evision\u003c/code\u003e配置默认如下，provider为auto：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eauxiliary\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"c1\"\u003e# Image analysis (vision_analyze tool + browser screenshots)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"n\"\u003evision\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eprovider\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;auto\u0026#34;\u003c/span\u003e           \u003cspan class=\"c1\"\u003e# \u0026#34;auto\u0026#34;, \u0026#34;openrouter\u0026#34;, \u0026#34;nous\u0026#34;, \u0026#34;codex\u0026#34;, \u0026#34;main\u0026#34;, etc.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003emodel\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e                  \u003cspan class=\"c1\"\u003e# e.g. \u0026#34;openai/gpt-4o\u0026#34;, \u0026#34;google/gemini-2.5-flash\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003ebase_url\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e               \u003cspan class=\"c1\"\u003e# Custom OpenAI-compatible endpoint (overrides provider)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eapi_key\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e                \u003cspan class=\"c1\"\u003e# API key for base_url (falls back to OPENAI_API_KEY)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003etimeout\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e120\u003c/span\u003e               \u003cspan class=\"c1\"\u003e# seconds — LLM API call timeout; vision payloads need generous timeout\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003edownload_timeout\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e30\u003c/span\u003e       \u003cspan class=\"c1\"\u003e# seconds — image HTTP download; increase for slow connections\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e工具入口文件，tools/vision_tools.py\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003e_handle_vision_analyze\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eargs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eDict\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nb\"\u003estr\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eAny\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e \u003cspan class=\"o\"\u003e**\u003c/span\u003e\u003cspan class=\"n\"\u003ekw\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eAny\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003eAwaitable\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nb\"\u003estr\u003c/span\u003e\u003cspan class=\"p\"\u003e]:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eimage_url\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eargs\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;image_url\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003equestion\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eargs\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;question\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003efull_prompt\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"s2\"\u003e\u0026#34;Fully describe and explain everything about this image, then answer the \u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003ef\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;following question:\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e{question}\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"err\"\u003e从\u003c/span\u003e\u003cspan class=\"n\"\u003eenv文件获取vision模型\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003emodel\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eos\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003egetenv\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;AUXILIARY_VISION_MODEL\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003estrip\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"ow\"\u003eor\u003c/span\u003e \u003cspan class=\"n\"\u003eNone\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003evision_analyze_tool\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eimage_url\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003efull_prompt\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003emodel\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"err\"\u003e注册工具\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eregistry\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eregister\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;vision_analyze\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003etoolset\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;vision\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eschema\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003eVISION_ANALYZE_SCHEMA\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003ehandler\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003e_handle_vision_analyze\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003echeck_fn\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003echeck_vision_requirements\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eis_async\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003eTrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eemoji\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;👁️\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e通过registry.register注册\u003ccode\u003evision_analyze\u003c/code\u003e工具，处理逻辑在\u003ccode\u003e_handle_vision_analyze\u003c/code\u003e方法，从env文件里获取\u003ccode\u003eAUXILIARY_VISION_MODEL\u003c/code\u003e变量值作为vision模型，最终调用\u003ccode\u003evision_analyze_tool\u003c/code\u003e方法。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e    Analyze an image from a URL or local file path using vision AI.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e    This tool accepts either an HTTP/HTTPS URL or a local file path. For URLs,\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e    it downloads the image first. In both cases, the image is converted to base64\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e    and processed using Gemini 3 Flash Preview via OpenRouter API.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e    The user_prompt parameter is expected to be pre-formatted by the calling\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e    function (typically model_tools.py) to include both full description\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e    requests and specific questions.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e    Args:\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e        image_url (str): The URL or local file path of the image to analyze.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e                         Accepts http://, https:// URLs or absolute/relative file paths.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e        user_prompt (str): The pre-formatted prompt for the vision model\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e        model (str): The vision model to use (default: google/gemini-3-flash-preview)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e    Returns:\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e        str: JSON string containing the analysis results with the following structure:\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e             {\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e                 \u0026#34;success\u0026#34;: bool,\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e                 \u0026#34;analysis\u0026#34;: str (defaults to error message if None)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e             }\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e    Raises:\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e        Exception: If download fails, analysis fails, or API key is not set\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e        \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e    Note:\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e        - For URLs, temporary images are stored in ./temp_vision_images/ and cleaned up\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e        - For local file paths, the file is used directly and NOT deleted\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e        - Supports common image formats (JPEG, PNG, GIF, WebP, etc.)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e    \u0026#34;\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e根据\u003ccode\u003evision_analyze_tool\u003c/code\u003e方法参数说明，model默认为google/gemini-3-flash-preview。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/deploy-ai-agent/AgAABTwTDPwq00eJycVBYbAU8MGGrx_8.png_320x.avif 320w, https://liudon.com/posts/deploy-ai-agent/AgAABTwTDPwq00eJycVBYbAU8MGGrx_8.png_480x.avif 480w, https://liudon.com/posts/deploy-ai-agent/AgAABTwTDPwq00eJycVBYbAU8MGGrx_8.png_720x.avif 720w, https://liudon.com/posts/deploy-ai-agent/AgAABTwTDPwq00eJycVBYbAU8MGGrx_8.png_799x.avif 799w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/deploy-ai-agent/AgAABTwTDPwq00eJycVBYbAU8MGGrx_8.png_320x.webp 320w, https://liudon.com/posts/deploy-ai-agent/AgAABTwTDPwq00eJycVBYbAU8MGGrx_8.png_480x.webp 480w, https://liudon.com/posts/deploy-ai-agent/AgAABTwTDPwq00eJycVBYbAU8MGGrx_8.png_720x.webp 720w, https://liudon.com/posts/deploy-ai-agent/AgAABTwTDPwq00eJycVBYbAU8MGGrx_8.png_799x.webp 799w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/deploy-ai-agent/AgAABTwTDPwq00eJycVBYbAU8MGGrx_8.png\" alt=\"\"\n         width=\"799\" height=\"809\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003eenv文件指定了模型的话，使用指定的模型，调用了\u003ccode\u003easync_call_llm\u003c/code\u003e方法。\u003c/p\u003e\n\u003cp\u003e注意，这里没有指定provider参数。\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003easync_call_llm\u003c/code\u003e方法如下：\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/deploy-ai-agent/AgAABTwTDPxxgCZdHOtLk6ZjkkU7Sk_m.png_320x.avif 320w, https://liudon.com/posts/deploy-ai-agent/AgAABTwTDPxxgCZdHOtLk6ZjkkU7Sk_m.png_480x.avif 480w, https://liudon.com/posts/deploy-ai-agent/AgAABTwTDPxxgCZdHOtLk6ZjkkU7Sk_m.png_720x.avif 720w, https://liudon.com/posts/deploy-ai-agent/AgAABTwTDPxxgCZdHOtLk6ZjkkU7Sk_m.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/deploy-ai-agent/AgAABTwTDPxxgCZdHOtLk6ZjkkU7Sk_m.png_320x.webp 320w, https://liudon.com/posts/deploy-ai-agent/AgAABTwTDPxxgCZdHOtLk6ZjkkU7Sk_m.png_480x.webp 480w, https://liudon.com/posts/deploy-ai-agent/AgAABTwTDPxxgCZdHOtLk6ZjkkU7Sk_m.png_720x.webp 720w, https://liudon.com/posts/deploy-ai-agent/AgAABTwTDPxxgCZdHOtLk6ZjkkU7Sk_m.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/deploy-ai-agent/AgAABTwTDPxxgCZdHOtLk6ZjkkU7Sk_m.png\" alt=\"\"\n         width=\"1080\" height=\"885\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e先看\u003ccode\u003e_resolve_task_provider_model\u003c/code\u003e方法实现。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/deploy-ai-agent/AgAABTwTDPyovMGw6SlFcr1DWS43cEPu.png_320x.avif 320w, https://liudon.com/posts/deploy-ai-agent/AgAABTwTDPyovMGw6SlFcr1DWS43cEPu.png_480x.avif 480w, https://liudon.com/posts/deploy-ai-agent/AgAABTwTDPyovMGw6SlFcr1DWS43cEPu.png_720x.avif 720w, https://liudon.com/posts/deploy-ai-agent/AgAABTwTDPyovMGw6SlFcr1DWS43cEPu.png_1013x.avif 1013w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/deploy-ai-agent/AgAABTwTDPyovMGw6SlFcr1DWS43cEPu.png_320x.webp 320w, https://liudon.com/posts/deploy-ai-agent/AgAABTwTDPyovMGw6SlFcr1DWS43cEPu.png_480x.webp 480w, https://liudon.com/posts/deploy-ai-agent/AgAABTwTDPyovMGw6SlFcr1DWS43cEPu.png_720x.webp 720w, https://liudon.com/posts/deploy-ai-agent/AgAABTwTDPyovMGw6SlFcr1DWS43cEPu.png_1013x.webp 1013w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/deploy-ai-agent/AgAABTwTDPyovMGw6SlFcr1DWS43cEPu.png\" alt=\"\"\n         width=\"1013\" height=\"1040\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e指定了task的情况，会从config.yaml里读取对应的配置，模型会优先使用env文件的配置，为空的话使用config.yaml文件里的配置。\u003c/p\u003e\n\u003cp\u003e如果config.yaml里指定了provider，则使用对应的provider，否则返回auto。\u003c/p\u003e\n\u003cp\u003e再来看\u003ccode\u003eresolve_vision_provider_client\u003c/code\u003e方法实现。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/deploy-ai-agent/AgAABTwTDPzLDU1IdRpBx5cZ9rtIzFb0.png_320x.avif 320w, https://liudon.com/posts/deploy-ai-agent/AgAABTwTDPzLDU1IdRpBx5cZ9rtIzFb0.png_480x.avif 480w, https://liudon.com/posts/deploy-ai-agent/AgAABTwTDPzLDU1IdRpBx5cZ9rtIzFb0.png_720x.avif 720w, https://liudon.com/posts/deploy-ai-agent/AgAABTwTDPzLDU1IdRpBx5cZ9rtIzFb0.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/deploy-ai-agent/AgAABTwTDPzLDU1IdRpBx5cZ9rtIzFb0.png_320x.webp 320w, https://liudon.com/posts/deploy-ai-agent/AgAABTwTDPzLDU1IdRpBx5cZ9rtIzFb0.png_480x.webp 480w, https://liudon.com/posts/deploy-ai-agent/AgAABTwTDPzLDU1IdRpBx5cZ9rtIzFb0.png_720x.webp 720w, https://liudon.com/posts/deploy-ai-agent/AgAABTwTDPzLDU1IdRpBx5cZ9rtIzFb0.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/deploy-ai-agent/AgAABTwTDPzLDU1IdRpBx5cZ9rtIzFb0.png\" alt=\"\"\n         width=\"1080\" height=\"998\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e_read_main_provider/_read_main_model为读取config.yaml里配置。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003e_read_main_model\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e \u003cspan class=\"nb\"\u003estr\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u0026#34;Read the user\u0026#39;s configured main model from config.yaml.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e    config.yaml model.default is the single source of truth for the active\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e    model. Environment variables are no longer consulted.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e    \u0026#34;\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003etry\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003efrom\u003c/span\u003e \u003cspan class=\"n\"\u003ehermes_cli\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003econfig\u003c/span\u003e \u003cspan class=\"n\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eload_config\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003ecfg\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eload_config\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003emodel_cfg\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ecfg\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;model\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e{})\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003eisinstance\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003emodel_cfg\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nb\"\u003estr\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"ow\"\u003eand\u003c/span\u003e \u003cspan class=\"n\"\u003emodel_cfg\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003estrip\u003c/span\u003e\u003cspan class=\"p\"\u003e():\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003emodel_cfg\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003estrip\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003eisinstance\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003emodel_cfg\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003edict\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003edefault\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003emodel_cfg\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;default\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003eisinstance\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edefault\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nb\"\u003estr\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"ow\"\u003eand\u003c/span\u003e \u003cspan class=\"n\"\u003edefault\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003estrip\u003c/span\u003e\u003cspan class=\"p\"\u003e():\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003edefault\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003estrip\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eexcept\u003c/span\u003e \u003cspan class=\"n\"\u003eException\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003epass\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003edef\u003c/span\u003e \u003cspan class=\"nf\"\u003e_read_main_provider\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e \u003cspan class=\"nb\"\u003estr\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u0026#34;Read the user\u0026#39;s configured main provider from config.yaml.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e    Returns the lowercase provider id (e.g. \u0026#34;alibaba\u0026#34;, \u0026#34;openrouter\u0026#34;) or \u0026#34;\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e    if not configured.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"s2\"\u003e    \u0026#34;\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003etry\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003efrom\u003c/span\u003e \u003cspan class=\"n\"\u003ehermes_cli\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003econfig\u003c/span\u003e \u003cspan class=\"n\"\u003eimport\u003c/span\u003e \u003cspan class=\"n\"\u003eload_config\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003ecfg\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eload_config\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003emodel_cfg\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ecfg\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;model\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e{})\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003eisinstance\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003emodel_cfg\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003edict\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eprovider\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003emodel_cfg\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;provider\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003eisinstance\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eprovider\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nb\"\u003estr\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"ow\"\u003eand\u003c/span\u003e \u003cspan class=\"n\"\u003eprovider\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003estrip\u003c/span\u003e\u003cspan class=\"p\"\u003e():\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003eprovider\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003estrip\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003elower\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eexcept\u003c/span\u003e \u003cspan class=\"n\"\u003eException\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003epass\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e_VISION_AUTO_PROVIDER_ORDER = (\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u0026#34;openrouter\u0026#34;,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u0026#34;nous\u0026#34;,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eauto模式会依次尝试openrouter和nous两个提供商。\u003c/p\u003e\n\u003cp\u003e查看\u003ccode\u003e_resolve_strict_vision_backend\u003c/code\u003e方法实现：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edef _resolve_strict_vision_backend(provider: str) -\u0026gt; Tuple[Optional[Any], Optional[str]]:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    provider = _normalize_vision_provider(provider)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    if provider == \u0026#34;openrouter\u0026#34;:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        return _try_openrouter()\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    if provider == \u0026#34;nous\u0026#34;:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        return _try_nous(vision=True)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    if provider == \u0026#34;openai-codex\u0026#34;:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        return _try_codex()\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    if provider == \u0026#34;anthropic\u0026#34;:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        return _try_anthropic()\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    if provider == \u0026#34;custom\u0026#34;:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        return _try_custom_endpoint()\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    return None, None\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e我配置的是openrouter，查看\u003ccode\u003e_try_openrouter\u003c/code\u003e方法实现。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edef _try_openrouter() -\u0026gt; Tuple[Optional[OpenAI], Optional[str]]:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    pool_present, entry = _select_pool_entry(\u0026#34;openrouter\u0026#34;)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    if pool_present:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        or_key = _pool_runtime_api_key(entry)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        if not or_key:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            return None, None\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        base_url = _pool_runtime_base_url(entry, OPENROUTER_BASE_URL) or OPENROUTER_BASE_URL\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        logger.debug(\u0026#34;Auxiliary client: OpenRouter via pool\u0026#34;)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        return OpenAI(api_key=or_key, base_url=base_url,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                       default_headers=_OR_HEADERS), _OPENROUTER_MODEL\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    or_key = os.getenv(\u0026#34;OPENROUTER_API_KEY\u0026#34;)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    if not or_key:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        return None, None\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    logger.debug(\u0026#34;Auxiliary client: OpenRouter\u0026#34;)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    return OpenAI(api_key=or_key, base_url=OPENROUTER_BASE_URL,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                   default_headers=_OR_HEADERS), _OPENROUTER_MODEL\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e注意这里调用接口时传入的model为**_OPENROUTER_MODEL**常量。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# Default auxiliary models per provider\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e_OPENROUTER_MODEL = \u0026#34;google/gemini-3-flash-preview\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e_NOUS_MODEL = \u0026#34;google/gemini-3-flash-preview\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e_NOUS_FREE_TIER_VISION_MODEL = \u0026#34;xiaomi/mimo-v2-omni\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e_NOUS_FREE_TIER_AUX_MODEL = \u0026#34;xiaomi/mimo-v2-pro\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e_NOUS_DEFAULT_BASE_URL = \u0026#34;https://inference-api.nousresearch.com/v1\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e_ANTHROPIC_DEFAULT_BASE_URL = \u0026#34;https://api.anthropic.com\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e_AUTH_JSON_PATH = get_hermes_home() / \u0026#34;auth.json\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eauto模式下，不指定model的情况下，主provider为openrouter时，使用的是\u003ccode\u003egoogle/gemini-3-flash-preview\u003c/code\u003e模型，这就是为什么配置的免费模型，但仍产生了\u003ccode\u003egoogle/gemini-3-flash-preview\u003c/code\u003e收费模型的调用。\u003c/p\u003e\n\u003cp\u003e将配置里的\u003ccode\u003eprovider: \u0026quot;auto\u0026quot;\u003c/code\u003e改为\u003ccode\u003eprovider: \u0026quot;main\u0026quot;\u003c/code\u003e，使辅助模型也走主模型配置。\u003c/p\u003e\n\u003ch2 id=\"总结\"\u003e总结\u003c/h2\u003e\n\u003cp\u003e在这台 2 核 4G 服务器上，Hermes Agent 的响应体感更快，占用资源也更适合我的环境。这个结论来自个人使用体验，不是标准化性能测试。\u003c/p\u003e\n\u003cp\u003e把 OpenClaw 的 Cron 任务迁移到 Hermes Agent 后，我在本文测试期间没有再遇到未执行的问题。\u003c/p\u003e\n","date_published":"2026-04-14T22:12:17+08:00","tags":["ai agent","openclaw","hermes agent"]},{"title":"我的2025年","id":"https://liudon.com/posts/review-2025/","url":"https://liudon.com/posts/review-2025/","summary":"\u003cp\u003e2025年，会是我人生的一个重要节点。\u003c/p\u003e\n\u003ch3 id=\"工作\"\u003e工作\u003c/h3\u003e\n\u003cp\u003e这一年，处于一种持续性、高强度的加班状态，晚上9点算是早下班了。\u003c/p\u003e\n\u003cp\u003e24年底，接手了一个历史模块，对于一直在做运营开发的我来说，算是一个不小的挑战。\u003c/p\u003e","content_html":"\u003cp\u003e2025年，会是我人生的一个重要节点。\u003c/p\u003e\n\u003ch3 id=\"工作\"\u003e工作\u003c/h3\u003e\n\u003cp\u003e这一年，处于一种持续性、高强度的加班状态，晚上9点算是早下班了。\u003c/p\u003e\n\u003cp\u003e24年底，接手了一个历史模块，对于一直在做运营开发的我来说，算是一个不小的挑战。\u003c/p\u003e\n\u003cp\u003e梳理已有问题，设计优化方案，新方案开发实施。\u003c/p\u003e\n\u003cp\u003e今年大部分时间都投入在了这个新模块上，到年底，基本上把现网老系统的问题，全部定位解决掉了。\u003c/p\u003e\n\u003cp\u003e为了解决老系统的现网问题，有一段时间持续加班到10点以后，经常是办公区最后一个走的。\u003c/p\u003e\n\u003cp\u003e以至于每天到家娃早就睡觉了，只能早上见一面，每天上学的时候娃都会提醒我，“早点下班”。\u003c/p\u003e\n\u003cp\u003e虽然投入了巨大的精力，但是却没有收获到该有的结果，属实有些寒心。\u003c/p\u003e\n\u003ch3 id=\"生活\"\u003e生活\u003c/h3\u003e\n\u003cp\u003e趁着假期休息的时候，带家人出去走了走：\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://liudon.com/posts/the-trip-of-tianjin/\"\u003e春节天津一日游\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://liudon.com/posts/hiking-great-wall-childrens-day/\"\u003e六一爬长城\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://liudon.com/posts/dalian-trip/\"\u003e暑假大连行\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e偶尔的出行，换一下生活的节奏，放松一下自己。\u003c/p\u003e\n\u003cp\u003e希望之后能走的越来越远，走遍中国的大好河山。\u003c/p\u003e\n\u003ch3 id=\"博客\"\u003e博客\u003c/h3\u003e\n\u003cp\u003e今年产出较少，全年更新了11篇内容，共计3687字。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/review-2025/2025-blog-analysis.png_320x.avif 320w, https://liudon.com/posts/review-2025/2025-blog-analysis.png_480x.avif 480w, https://liudon.com/posts/review-2025/2025-blog-analysis.png_720x.avif 720w, https://liudon.com/posts/review-2025/2025-blog-analysis.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/review-2025/2025-blog-analysis.png_320x.webp 320w, https://liudon.com/posts/review-2025/2025-blog-analysis.png_480x.webp 480w, https://liudon.com/posts/review-2025/2025-blog-analysis.png_720x.webp 720w, https://liudon.com/posts/review-2025/2025-blog-analysis.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/review-2025/2025-blog-analysis.png\" alt=\"全年访问趋势\"\n         width=\"1080\" height=\"629\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e访问最高的文章为\u003ca href=\"https://liudon.com/posts/wrenai-local-llm-usage-guide/\"\u003ewrenAI本地LLM模型部署\u003c/a\u003e。\u003c/p\u003e\n\u003cp\u003e不得不说，今年AI真是进步神速，从年初的基本不可用，到年底已经依赖AI来写代码了。\u003c/p\u003e\n\u003cp\u003e去年加了Google Adsense的广告，一年下来有44$了。\u003c/p\u003e\n\u003ch3 id=\"财务\"\u003e财务\u003c/h3\u003e\n\u003cp\u003e买房的时候借了公司的贷款，今年还了一笔，还剩最后一笔，明年就能还清了。\u003c/p\u003e\n\u003cp\u003e在股市最低点的时候割肉躺平，一直到下半年才重新投入，总算把亏损补回来了，全年收益+4%。\u003c/p\u003e\n\u003cp\u003e不知道多年以后，自己会怎么看待2025年发生的这些事。\u003c/p\u003e\n\u003cp\u003e2026年，希望自己往前看，别回头。\u003c/p\u003e\n","date_published":"2026-04-07T21:22:38+08:00","tags":["年终总结"]},{"title":"大连之行","id":"https://liudon.com/posts/dalian-trip/","url":"https://liudon.com/posts/dalian-trip/","summary":"\u003cp\u003e6月底，趁着娃刚考完试，学校也没课了，请假带娃去大连玩了一趟。\u003c/p\u003e\n\u003cp\u003e这次是跟娃好朋友一起出行，人两口子以前做旅行社的，直接搞了一个行程表，我们就跟报了个旅行团一样。\u003c/p\u003e","content_html":"\u003cp\u003e6月底，趁着娃刚考完试，学校也没课了，请假带娃去大连玩了一趟。\u003c/p\u003e\n\u003cp\u003e这次是跟娃好朋友一起出行，人两口子以前做旅行社的，直接搞了一个行程表，我们就跟报了个旅行团一样。\u003c/p\u003e\n\u003ch3 id=\"第一天\"\u003e第一天\u003c/h3\u003e\n\u003cp\u003e下午14:13到达大连北站，当地租车然后直奔酒店。\u003c/p\u003e\n\u003cp\u003e办理入住，放下行李简单休息后，开车去赶海。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG207.jpg_320x.avif 320w, https://liudon.com/posts/dalian-trip/WechatIMG207.jpg_480x.avif 480w, https://liudon.com/posts/dalian-trip/WechatIMG207.jpg_720x.avif 720w, https://liudon.com/posts/dalian-trip/WechatIMG207.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG207.jpg_320x.webp 320w, https://liudon.com/posts/dalian-trip/WechatIMG207.jpg_480x.webp 480w, https://liudon.com/posts/dalian-trip/WechatIMG207.jpg_720x.webp 720w, https://liudon.com/posts/dalian-trip/WechatIMG207.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/dalian-trip/WechatIMG207.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG208.jpg_320x.avif 320w, https://liudon.com/posts/dalian-trip/WechatIMG208.jpg_480x.avif 480w, https://liudon.com/posts/dalian-trip/WechatIMG208.jpg_720x.avif 720w, https://liudon.com/posts/dalian-trip/WechatIMG208.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG208.jpg_320x.webp 320w, https://liudon.com/posts/dalian-trip/WechatIMG208.jpg_480x.webp 480w, https://liudon.com/posts/dalian-trip/WechatIMG208.jpg_720x.webp 720w, https://liudon.com/posts/dalian-trip/WechatIMG208.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/dalian-trip/WechatIMG208.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e一片砾石滩，找了本地人，提供装备带着进去赶海。\u003c/p\u003e\n\u003cp\u003e雨鞋就是薄薄一层，需要先走过一片海滩，特别地硌脚，路上还有特别多绿苔，非常地滑。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG13226.jpg_320x.avif 320w, https://liudon.com/posts/dalian-trip/WechatIMG13226.jpg_480x.avif 480w, https://liudon.com/posts/dalian-trip/WechatIMG13226.jpg_720x.avif 720w, https://liudon.com/posts/dalian-trip/WechatIMG13226.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG13226.jpg_320x.webp 320w, https://liudon.com/posts/dalian-trip/WechatIMG13226.jpg_480x.webp 480w, https://liudon.com/posts/dalian-trip/WechatIMG13226.jpg_720x.webp 720w, https://liudon.com/posts/dalian-trip/WechatIMG13226.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/dalian-trip/WechatIMG13226.jpg\" alt=\"\"\n         width=\"1080\" height=\"1921\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG13227.jpg_320x.avif 320w, https://liudon.com/posts/dalian-trip/WechatIMG13227.jpg_480x.avif 480w, https://liudon.com/posts/dalian-trip/WechatIMG13227.jpg_720x.avif 720w, https://liudon.com/posts/dalian-trip/WechatIMG13227.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG13227.jpg_320x.webp 320w, https://liudon.com/posts/dalian-trip/WechatIMG13227.jpg_480x.webp 480w, https://liudon.com/posts/dalian-trip/WechatIMG13227.jpg_720x.webp 720w, https://liudon.com/posts/dalian-trip/WechatIMG13227.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/dalian-trip/WechatIMG13227.jpg\" alt=\"\"\n         width=\"1080\" height=\"1921\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG13228.jpg_320x.avif 320w, https://liudon.com/posts/dalian-trip/WechatIMG13228.jpg_480x.avif 480w, https://liudon.com/posts/dalian-trip/WechatIMG13228.jpg_720x.avif 720w, https://liudon.com/posts/dalian-trip/WechatIMG13228.jpg_1024x.avif 1024w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG13228.jpg_320x.webp 320w, https://liudon.com/posts/dalian-trip/WechatIMG13228.jpg_480x.webp 480w, https://liudon.com/posts/dalian-trip/WechatIMG13228.jpg_720x.webp 720w, https://liudon.com/posts/dalian-trip/WechatIMG13228.jpg_1024x.webp 1024w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/dalian-trip/WechatIMG13228.jpg\" alt=\"\"\n         width=\"1024\" height=\"1820\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e翻石头抓螃蟹，玩的不亦乐乎。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG13229.jpg_320x.avif 320w, https://liudon.com/posts/dalian-trip/WechatIMG13229.jpg_480x.avif 480w, https://liudon.com/posts/dalian-trip/WechatIMG13229.jpg_720x.avif 720w, https://liudon.com/posts/dalian-trip/WechatIMG13229.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG13229.jpg_320x.webp 320w, https://liudon.com/posts/dalian-trip/WechatIMG13229.jpg_480x.webp 480w, https://liudon.com/posts/dalian-trip/WechatIMG13229.jpg_720x.webp 720w, https://liudon.com/posts/dalian-trip/WechatIMG13229.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/dalian-trip/WechatIMG13229.jpg\" alt=\"\"\n         width=\"1080\" height=\"1921\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e晚上小酌一下。\u003c/p\u003e\n\u003ch3 id=\"第二天\"\u003e第二天\u003c/h3\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG209.jpg_320x.avif 320w, https://liudon.com/posts/dalian-trip/WechatIMG209.jpg_480x.avif 480w, https://liudon.com/posts/dalian-trip/WechatIMG209.jpg_720x.avif 720w, https://liudon.com/posts/dalian-trip/WechatIMG209.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG209.jpg_320x.webp 320w, https://liudon.com/posts/dalian-trip/WechatIMG209.jpg_480x.webp 480w, https://liudon.com/posts/dalian-trip/WechatIMG209.jpg_720x.webp 720w, https://liudon.com/posts/dalian-trip/WechatIMG209.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/dalian-trip/WechatIMG209.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG210.jpg_320x.avif 320w, https://liudon.com/posts/dalian-trip/WechatIMG210.jpg_480x.avif 480w, https://liudon.com/posts/dalian-trip/WechatIMG210.jpg_720x.avif 720w, https://liudon.com/posts/dalian-trip/WechatIMG210.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG210.jpg_320x.webp 320w, https://liudon.com/posts/dalian-trip/WechatIMG210.jpg_480x.webp 480w, https://liudon.com/posts/dalian-trip/WechatIMG210.jpg_720x.webp 720w, https://liudon.com/posts/dalian-trip/WechatIMG210.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/dalian-trip/WechatIMG210.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e酒店就在海边，早起出来海边溜达一圈，大早起就有大爷在海里游泳了。\u003c/p\u003e\n\u003cp\u003e早上酒店吃完早餐，出发动物园。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG211.jpg_320x.avif 320w, https://liudon.com/posts/dalian-trip/WechatIMG211.jpg_480x.avif 480w, https://liudon.com/posts/dalian-trip/WechatIMG211.jpg_720x.avif 720w, https://liudon.com/posts/dalian-trip/WechatIMG211.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG211.jpg_320x.webp 320w, https://liudon.com/posts/dalian-trip/WechatIMG211.jpg_480x.webp 480w, https://liudon.com/posts/dalian-trip/WechatIMG211.jpg_720x.webp 720w, https://liudon.com/posts/dalian-trip/WechatIMG211.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/dalian-trip/WechatIMG211.jpg\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG213.jpg_320x.avif 320w, https://liudon.com/posts/dalian-trip/WechatIMG213.jpg_480x.avif 480w, https://liudon.com/posts/dalian-trip/WechatIMG213.jpg_720x.avif 720w, https://liudon.com/posts/dalian-trip/WechatIMG213.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG213.jpg_320x.webp 320w, https://liudon.com/posts/dalian-trip/WechatIMG213.jpg_480x.webp 480w, https://liudon.com/posts/dalian-trip/WechatIMG213.jpg_720x.webp 720w, https://liudon.com/posts/dalian-trip/WechatIMG213.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/dalian-trip/WechatIMG213.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG214.jpg_320x.avif 320w, https://liudon.com/posts/dalian-trip/WechatIMG214.jpg_480x.avif 480w, https://liudon.com/posts/dalian-trip/WechatIMG214.jpg_720x.avif 720w, https://liudon.com/posts/dalian-trip/WechatIMG214.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG214.jpg_320x.webp 320w, https://liudon.com/posts/dalian-trip/WechatIMG214.jpg_480x.webp 480w, https://liudon.com/posts/dalian-trip/WechatIMG214.jpg_720x.webp 720w, https://liudon.com/posts/dalian-trip/WechatIMG214.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/dalian-trip/WechatIMG214.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e今天大雾，白茫茫一片，缆车什么都看不到。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG215.jpg_320x.avif 320w, https://liudon.com/posts/dalian-trip/WechatIMG215.jpg_480x.avif 480w, https://liudon.com/posts/dalian-trip/WechatIMG215.jpg_720x.avif 720w, https://liudon.com/posts/dalian-trip/WechatIMG215.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG215.jpg_320x.webp 320w, https://liudon.com/posts/dalian-trip/WechatIMG215.jpg_480x.webp 480w, https://liudon.com/posts/dalian-trip/WechatIMG215.jpg_720x.webp 720w, https://liudon.com/posts/dalian-trip/WechatIMG215.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/dalian-trip/WechatIMG215.jpg\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG13231.jpg_320x.avif 320w, https://liudon.com/posts/dalian-trip/WechatIMG13231.jpg_480x.avif 480w, https://liudon.com/posts/dalian-trip/WechatIMG13231.jpg_720x.avif 720w, https://liudon.com/posts/dalian-trip/WechatIMG13231.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG13231.jpg_320x.webp 320w, https://liudon.com/posts/dalian-trip/WechatIMG13231.jpg_480x.webp 480w, https://liudon.com/posts/dalian-trip/WechatIMG13231.jpg_720x.webp 720w, https://liudon.com/posts/dalian-trip/WechatIMG13231.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/dalian-trip/WechatIMG13231.jpg\" alt=\"\"\n         width=\"1080\" height=\"1921\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e银沙滩喂海鸥，一根香肠直接给我叼走了。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG13234.jpg_320x.avif 320w, https://liudon.com/posts/dalian-trip/WechatIMG13234.jpg_480x.avif 480w, https://liudon.com/posts/dalian-trip/WechatIMG13234.jpg_720x.avif 720w, https://liudon.com/posts/dalian-trip/WechatIMG13234.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG13234.jpg_320x.webp 320w, https://liudon.com/posts/dalian-trip/WechatIMG13234.jpg_480x.webp 480w, https://liudon.com/posts/dalian-trip/WechatIMG13234.jpg_720x.webp 720w, https://liudon.com/posts/dalian-trip/WechatIMG13234.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/dalian-trip/WechatIMG13234.jpg\" alt=\"\"\n         width=\"1080\" height=\"1921\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e中午火锅，环境很棒，吃的很开心。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG216.jpg_320x.avif 320w, https://liudon.com/posts/dalian-trip/WechatIMG216.jpg_480x.avif 480w, https://liudon.com/posts/dalian-trip/WechatIMG216.jpg_720x.avif 720w, https://liudon.com/posts/dalian-trip/WechatIMG216.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG216.jpg_320x.webp 320w, https://liudon.com/posts/dalian-trip/WechatIMG216.jpg_480x.webp 480w, https://liudon.com/posts/dalian-trip/WechatIMG216.jpg_720x.webp 720w, https://liudon.com/posts/dalian-trip/WechatIMG216.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/dalian-trip/WechatIMG216.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG217.jpg_320x.avif 320w, https://liudon.com/posts/dalian-trip/WechatIMG217.jpg_480x.avif 480w, https://liudon.com/posts/dalian-trip/WechatIMG217.jpg_720x.avif 720w, https://liudon.com/posts/dalian-trip/WechatIMG217.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG217.jpg_320x.webp 320w, https://liudon.com/posts/dalian-trip/WechatIMG217.jpg_480x.webp 480w, https://liudon.com/posts/dalian-trip/WechatIMG217.jpg_720x.webp 720w, https://liudon.com/posts/dalian-trip/WechatIMG217.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/dalian-trip/WechatIMG217.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e大连自然博物馆，溜达一圈。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG218.jpg_320x.avif 320w, https://liudon.com/posts/dalian-trip/WechatIMG218.jpg_480x.avif 480w, https://liudon.com/posts/dalian-trip/WechatIMG218.jpg_720x.avif 720w, https://liudon.com/posts/dalian-trip/WechatIMG218.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG218.jpg_320x.webp 320w, https://liudon.com/posts/dalian-trip/WechatIMG218.jpg_480x.webp 480w, https://liudon.com/posts/dalian-trip/WechatIMG218.jpg_720x.webp 720w, https://liudon.com/posts/dalian-trip/WechatIMG218.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/dalian-trip/WechatIMG218.jpg\" alt=\"\"\n         width=\"1080\" height=\"1350\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e星海广场打卡，难得碰到了一会晴天。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG220.jpg_320x.avif 320w, https://liudon.com/posts/dalian-trip/WechatIMG220.jpg_480x.avif 480w, https://liudon.com/posts/dalian-trip/WechatIMG220.jpg_720x.avif 720w, https://liudon.com/posts/dalian-trip/WechatIMG220.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG220.jpg_320x.webp 320w, https://liudon.com/posts/dalian-trip/WechatIMG220.jpg_480x.webp 480w, https://liudon.com/posts/dalian-trip/WechatIMG220.jpg_720x.webp 720w, https://liudon.com/posts/dalian-trip/WechatIMG220.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/dalian-trip/WechatIMG220.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG221.jpg_320x.avif 320w, https://liudon.com/posts/dalian-trip/WechatIMG221.jpg_480x.avif 480w, https://liudon.com/posts/dalian-trip/WechatIMG221.jpg_720x.avif 720w, https://liudon.com/posts/dalian-trip/WechatIMG221.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG221.jpg_320x.webp 320w, https://liudon.com/posts/dalian-trip/WechatIMG221.jpg_480x.webp 480w, https://liudon.com/posts/dalian-trip/WechatIMG221.jpg_720x.webp 720w, https://liudon.com/posts/dalian-trip/WechatIMG221.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/dalian-trip/WechatIMG221.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG219.jpg_320x.avif 320w, https://liudon.com/posts/dalian-trip/WechatIMG219.jpg_480x.avif 480w, https://liudon.com/posts/dalian-trip/WechatIMG219.jpg_720x.avif 720w, https://liudon.com/posts/dalian-trip/WechatIMG219.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG219.jpg_320x.webp 320w, https://liudon.com/posts/dalian-trip/WechatIMG219.jpg_480x.webp 480w, https://liudon.com/posts/dalian-trip/WechatIMG219.jpg_720x.webp 720w, https://liudon.com/posts/dalian-trip/WechatIMG219.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/dalian-trip/WechatIMG219.jpg\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e晚上小吃街，吃到饱。\u003c/p\u003e\n\u003ch3 id=\"第三天\"\u003e第三天\u003c/h3\u003e\n\u003cp\u003e今天有雨不出门，安排在酒店水上乐园活动。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG222.jpg_320x.avif 320w, https://liudon.com/posts/dalian-trip/WechatIMG222.jpg_480x.avif 480w, https://liudon.com/posts/dalian-trip/WechatIMG222.jpg_720x.avif 720w, https://liudon.com/posts/dalian-trip/WechatIMG222.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG222.jpg_320x.webp 320w, https://liudon.com/posts/dalian-trip/WechatIMG222.jpg_480x.webp 480w, https://liudon.com/posts/dalian-trip/WechatIMG222.jpg_720x.webp 720w, https://liudon.com/posts/dalian-trip/WechatIMG222.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/dalian-trip/WechatIMG222.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG224.jpg_320x.avif 320w, https://liudon.com/posts/dalian-trip/WechatIMG224.jpg_480x.avif 480w, https://liudon.com/posts/dalian-trip/WechatIMG224.jpg_720x.avif 720w, https://liudon.com/posts/dalian-trip/WechatIMG224.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG224.jpg_320x.webp 320w, https://liudon.com/posts/dalian-trip/WechatIMG224.jpg_480x.webp 480w, https://liudon.com/posts/dalian-trip/WechatIMG224.jpg_720x.webp 720w, https://liudon.com/posts/dalian-trip/WechatIMG224.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/dalian-trip/WechatIMG224.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG223.jpg_320x.avif 320w, https://liudon.com/posts/dalian-trip/WechatIMG223.jpg_480x.avif 480w, https://liudon.com/posts/dalian-trip/WechatIMG223.jpg_720x.avif 720w, https://liudon.com/posts/dalian-trip/WechatIMG223.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG223.jpg_320x.webp 320w, https://liudon.com/posts/dalian-trip/WechatIMG223.jpg_480x.webp 480w, https://liudon.com/posts/dalian-trip/WechatIMG223.jpg_720x.webp 720w, https://liudon.com/posts/dalian-trip/WechatIMG223.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/dalian-trip/WechatIMG223.jpg\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e水上漂流，呛了几口水，总算学会漂了，真挺好玩。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG225.jpg_320x.avif 320w, https://liudon.com/posts/dalian-trip/WechatIMG225.jpg_480x.avif 480w, https://liudon.com/posts/dalian-trip/WechatIMG225.jpg_720x.avif 720w, https://liudon.com/posts/dalian-trip/WechatIMG225.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG225.jpg_320x.webp 320w, https://liudon.com/posts/dalian-trip/WechatIMG225.jpg_480x.webp 480w, https://liudon.com/posts/dalian-trip/WechatIMG225.jpg_720x.webp 720w, https://liudon.com/posts/dalian-trip/WechatIMG225.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/dalian-trip/WechatIMG225.jpg\" alt=\"\"\n         width=\"1080\" height=\"608\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e造浪池，全都玩嗨了，就往浪大的地方去。\u003c/p\u003e\n\u003ch3 id=\"第四天\"\u003e第四天\u003c/h3\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG226.jpg_320x.avif 320w, https://liudon.com/posts/dalian-trip/WechatIMG226.jpg_480x.avif 480w, https://liudon.com/posts/dalian-trip/WechatIMG226.jpg_720x.avif 720w, https://liudon.com/posts/dalian-trip/WechatIMG226.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG226.jpg_320x.webp 320w, https://liudon.com/posts/dalian-trip/WechatIMG226.jpg_480x.webp 480w, https://liudon.com/posts/dalian-trip/WechatIMG226.jpg_720x.webp 720w, https://liudon.com/posts/dalian-trip/WechatIMG226.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/dalian-trip/WechatIMG226.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG227.jpg_320x.avif 320w, https://liudon.com/posts/dalian-trip/WechatIMG227.jpg_480x.avif 480w, https://liudon.com/posts/dalian-trip/WechatIMG227.jpg_720x.avif 720w, https://liudon.com/posts/dalian-trip/WechatIMG227.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG227.jpg_320x.webp 320w, https://liudon.com/posts/dalian-trip/WechatIMG227.jpg_480x.webp 480w, https://liudon.com/posts/dalian-trip/WechatIMG227.jpg_720x.webp 720w, https://liudon.com/posts/dalian-trip/WechatIMG227.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/dalian-trip/WechatIMG227.jpg\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e早上起来去喂梅花鹿。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG228.jpg_320x.avif 320w, https://liudon.com/posts/dalian-trip/WechatIMG228.jpg_480x.avif 480w, https://liudon.com/posts/dalian-trip/WechatIMG228.jpg_720x.avif 720w, https://liudon.com/posts/dalian-trip/WechatIMG228.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG228.jpg_320x.webp 320w, https://liudon.com/posts/dalian-trip/WechatIMG228.jpg_480x.webp 480w, https://liudon.com/posts/dalian-trip/WechatIMG228.jpg_720x.webp 720w, https://liudon.com/posts/dalian-trip/WechatIMG228.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/dalian-trip/WechatIMG228.jpg\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e大连美术馆，偶遇大雨，躲在馆里避雨。\u003c/p\u003e\n\u003cp\u003e今天是妈妈们逛街日，各种商业街打卡。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG229.jpg_320x.avif 320w, https://liudon.com/posts/dalian-trip/WechatIMG229.jpg_480x.avif 480w, https://liudon.com/posts/dalian-trip/WechatIMG229.jpg_720x.avif 720w, https://liudon.com/posts/dalian-trip/WechatIMG229.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG229.jpg_320x.webp 320w, https://liudon.com/posts/dalian-trip/WechatIMG229.jpg_480x.webp 480w, https://liudon.com/posts/dalian-trip/WechatIMG229.jpg_720x.webp 720w, https://liudon.com/posts/dalian-trip/WechatIMG229.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/dalian-trip/WechatIMG229.jpg\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG13236.jpg_320x.avif 320w, https://liudon.com/posts/dalian-trip/WechatIMG13236.jpg_480x.avif 480w, https://liudon.com/posts/dalian-trip/WechatIMG13236.jpg_720x.avif 720w, https://liudon.com/posts/dalian-trip/WechatIMG13236.jpg_1024x.avif 1024w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG13236.jpg_320x.webp 320w, https://liudon.com/posts/dalian-trip/WechatIMG13236.jpg_480x.webp 480w, https://liudon.com/posts/dalian-trip/WechatIMG13236.jpg_720x.webp 720w, https://liudon.com/posts/dalian-trip/WechatIMG13236.jpg_1024x.webp 1024w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/dalian-trip/WechatIMG13236.jpg\" alt=\"\"\n         width=\"1024\" height=\"1820\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG13237.jpg_320x.avif 320w, https://liudon.com/posts/dalian-trip/WechatIMG13237.jpg_480x.avif 480w, https://liudon.com/posts/dalian-trip/WechatIMG13237.jpg_720x.avif 720w, https://liudon.com/posts/dalian-trip/WechatIMG13237.jpg_1024x.avif 1024w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG13237.jpg_320x.webp 320w, https://liudon.com/posts/dalian-trip/WechatIMG13237.jpg_480x.webp 480w, https://liudon.com/posts/dalian-trip/WechatIMG13237.jpg_720x.webp 720w, https://liudon.com/posts/dalian-trip/WechatIMG13237.jpg_1024x.webp 1024w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/dalian-trip/WechatIMG13237.jpg\" alt=\"\"\n         width=\"1024\" height=\"1820\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG13235.jpg_320x.avif 320w, https://liudon.com/posts/dalian-trip/WechatIMG13235.jpg_480x.avif 480w, https://liudon.com/posts/dalian-trip/WechatIMG13235.jpg_720x.avif 720w, https://liudon.com/posts/dalian-trip/WechatIMG13235.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG13235.jpg_320x.webp 320w, https://liudon.com/posts/dalian-trip/WechatIMG13235.jpg_480x.webp 480w, https://liudon.com/posts/dalian-trip/WechatIMG13235.jpg_720x.webp 720w, https://liudon.com/posts/dalian-trip/WechatIMG13235.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/dalian-trip/WechatIMG13235.jpg\" alt=\"\"\n         width=\"1080\" height=\"608\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e晚上吃的回勺面，超级好吃，强烈推荐。\u003c/p\u003e\n\u003cp\u003e运气好，因为今天下雨没有卖完，被我们赶上了。\u003c/p\u003e\n\u003ch3 id=\"第五天\"\u003e第五天\u003c/h3\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG230.jpg_320x.avif 320w, https://liudon.com/posts/dalian-trip/WechatIMG230.jpg_480x.avif 480w, https://liudon.com/posts/dalian-trip/WechatIMG230.jpg_720x.avif 720w, https://liudon.com/posts/dalian-trip/WechatIMG230.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG230.jpg_320x.webp 320w, https://liudon.com/posts/dalian-trip/WechatIMG230.jpg_480x.webp 480w, https://liudon.com/posts/dalian-trip/WechatIMG230.jpg_720x.webp 720w, https://liudon.com/posts/dalian-trip/WechatIMG230.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/dalian-trip/WechatIMG230.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG231.jpg_320x.avif 320w, https://liudon.com/posts/dalian-trip/WechatIMG231.jpg_480x.avif 480w, https://liudon.com/posts/dalian-trip/WechatIMG231.jpg_720x.avif 720w, https://liudon.com/posts/dalian-trip/WechatIMG231.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG231.jpg_320x.webp 320w, https://liudon.com/posts/dalian-trip/WechatIMG231.jpg_480x.webp 480w, https://liudon.com/posts/dalian-trip/WechatIMG231.jpg_720x.webp 720w, https://liudon.com/posts/dalian-trip/WechatIMG231.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/dalian-trip/WechatIMG231.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG232.jpg_320x.avif 320w, https://liudon.com/posts/dalian-trip/WechatIMG232.jpg_480x.avif 480w, https://liudon.com/posts/dalian-trip/WechatIMG232.jpg_720x.avif 720w, https://liudon.com/posts/dalian-trip/WechatIMG232.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG232.jpg_320x.webp 320w, https://liudon.com/posts/dalian-trip/WechatIMG232.jpg_480x.webp 480w, https://liudon.com/posts/dalian-trip/WechatIMG232.jpg_720x.webp 720w, https://liudon.com/posts/dalian-trip/WechatIMG232.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/dalian-trip/WechatIMG232.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e夏家河赶海，挖蛏子。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG234.jpg_320x.avif 320w, https://liudon.com/posts/dalian-trip/WechatIMG234.jpg_480x.avif 480w, https://liudon.com/posts/dalian-trip/WechatIMG234.jpg_720x.avif 720w, https://liudon.com/posts/dalian-trip/WechatIMG234.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG234.jpg_320x.webp 320w, https://liudon.com/posts/dalian-trip/WechatIMG234.jpg_480x.webp 480w, https://liudon.com/posts/dalian-trip/WechatIMG234.jpg_720x.webp 720w, https://liudon.com/posts/dalian-trip/WechatIMG234.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/dalian-trip/WechatIMG234.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG240.jpg_320x.avif 320w, https://liudon.com/posts/dalian-trip/WechatIMG240.jpg_480x.avif 480w, https://liudon.com/posts/dalian-trip/WechatIMG240.jpg_720x.avif 720w, https://liudon.com/posts/dalian-trip/WechatIMG240.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG240.jpg_320x.webp 320w, https://liudon.com/posts/dalian-trip/WechatIMG240.jpg_480x.webp 480w, https://liudon.com/posts/dalian-trip/WechatIMG240.jpg_720x.webp 720w, https://liudon.com/posts/dalian-trip/WechatIMG240.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/dalian-trip/WechatIMG240.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG233.jpg_320x.avif 320w, https://liudon.com/posts/dalian-trip/WechatIMG233.jpg_480x.avif 480w, https://liudon.com/posts/dalian-trip/WechatIMG233.jpg_720x.avif 720w, https://liudon.com/posts/dalian-trip/WechatIMG233.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG233.jpg_320x.webp 320w, https://liudon.com/posts/dalian-trip/WechatIMG233.jpg_480x.webp 480w, https://liudon.com/posts/dalian-trip/WechatIMG233.jpg_720x.webp 720w, https://liudon.com/posts/dalian-trip/WechatIMG233.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/dalian-trip/WechatIMG233.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG235.jpg_320x.avif 320w, https://liudon.com/posts/dalian-trip/WechatIMG235.jpg_480x.avif 480w, https://liudon.com/posts/dalian-trip/WechatIMG235.jpg_720x.avif 720w, https://liudon.com/posts/dalian-trip/WechatIMG235.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG235.jpg_320x.webp 320w, https://liudon.com/posts/dalian-trip/WechatIMG235.jpg_480x.webp 480w, https://liudon.com/posts/dalian-trip/WechatIMG235.jpg_720x.webp 720w, https://liudon.com/posts/dalian-trip/WechatIMG235.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/dalian-trip/WechatIMG235.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG238.jpg_320x.avif 320w, https://liudon.com/posts/dalian-trip/WechatIMG238.jpg_480x.avif 480w, https://liudon.com/posts/dalian-trip/WechatIMG238.jpg_720x.avif 720w, https://liudon.com/posts/dalian-trip/WechatIMG238.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG238.jpg_320x.webp 320w, https://liudon.com/posts/dalian-trip/WechatIMG238.jpg_480x.webp 480w, https://liudon.com/posts/dalian-trip/WechatIMG238.jpg_720x.webp 720w, https://liudon.com/posts/dalian-trip/WechatIMG238.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/dalian-trip/WechatIMG238.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG239.jpg_320x.avif 320w, https://liudon.com/posts/dalian-trip/WechatIMG239.jpg_480x.avif 480w, https://liudon.com/posts/dalian-trip/WechatIMG239.jpg_720x.avif 720w, https://liudon.com/posts/dalian-trip/WechatIMG239.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG239.jpg_320x.webp 320w, https://liudon.com/posts/dalian-trip/WechatIMG239.jpg_480x.webp 480w, https://liudon.com/posts/dalian-trip/WechatIMG239.jpg_720x.webp 720w, https://liudon.com/posts/dalian-trip/WechatIMG239.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/dalian-trip/WechatIMG239.jpg\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e金石滩喂海鸥、挖沙子，天居然还放晴了。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG242.jpg_320x.avif 320w, https://liudon.com/posts/dalian-trip/WechatIMG242.jpg_480x.avif 480w, https://liudon.com/posts/dalian-trip/WechatIMG242.jpg_720x.avif 720w, https://liudon.com/posts/dalian-trip/WechatIMG242.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/dalian-trip/WechatIMG242.jpg_320x.webp 320w, https://liudon.com/posts/dalian-trip/WechatIMG242.jpg_480x.webp 480w, https://liudon.com/posts/dalian-trip/WechatIMG242.jpg_720x.webp 720w, https://liudon.com/posts/dalian-trip/WechatIMG242.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/dalian-trip/WechatIMG242.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e雾终于散了，原来海对面这么多机器呢。\u003c/p\u003e\n\u003ch3 id=\"第六天\"\u003e第六天\u003c/h3\u003e\n\u003cp\u003e收拾行李，退房，坐火车回京。\u003c/p\u003e\n\u003cp\u003e愉快的假期一晃就过去了，期待下次的出行。\u003c/p\u003e\n","date_published":"2025-08-03T20:55:36+08:00","tags":["旅行"]},{"title":"回家收麦","id":"https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/","url":"https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/","summary":"\u003cp\u003e家里有两块地，一块离的远租出去了，另一块近的老爸老妈还在自己种。\u003c/p\u003e\n\u003cp\u003e自从上高中后，就很少下地了，现在让我下地，我都找不到自家地。\u003c/p\u003e\n\u003cp\u003e老爸生日回家，刚好赶上收麦，记录一下。\u003c/p\u003e","content_html":"\u003cp\u003e家里有两块地，一块离的远租出去了，另一块近的老爸老妈还在自己种。\u003c/p\u003e\n\u003cp\u003e自从上高中后，就很少下地了，现在让我下地，我都找不到自家地。\u003c/p\u003e\n\u003cp\u003e老爸生日回家，刚好赶上收麦，记录一下。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG198.jpg_320x.avif 320w, https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG198.jpg_480x.avif 480w, https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG198.jpg_720x.avif 720w, https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG198.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG198.jpg_320x.webp 320w, https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG198.jpg_480x.webp 480w, https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG198.jpg_720x.webp 720w, https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG198.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG198.jpg\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG199.jpg_320x.avif 320w, https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG199.jpg_480x.avif 480w, https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG199.jpg_720x.avif 720w, https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG199.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG199.jpg_320x.webp 320w, https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG199.jpg_480x.webp 480w, https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG199.jpg_720x.webp 720w, https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG199.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG199.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG200.jpg_320x.avif 320w, https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG200.jpg_480x.avif 480w, https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG200.jpg_720x.avif 720w, https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG200.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG200.jpg_320x.webp 320w, https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG200.jpg_480x.webp 480w, https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG200.jpg_720x.webp 720w, https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG200.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG200.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e到地里没半个小时，收割机就弄完了，直接拉到粮食点卖掉。\u003c/p\u003e\n\u003cp\u003e遥想以前小时候，还得用镰割，割完拉回来，中午还要打场，现在真的是省事了。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG201.jpg_320x.avif 320w, https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG201.jpg_480x.avif 480w, https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG201.jpg_720x.avif 720w, https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG201.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG201.jpg_320x.webp 320w, https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG201.jpg_480x.webp 480w, https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG201.jpg_720x.webp 720w, https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG201.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG201.jpg\" alt=\"\"\n         width=\"1080\" height=\"1920\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG202.jpg_320x.avif 320w, https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG202.jpg_480x.avif 480w, https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG202.jpg_720x.avif 720w, https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG202.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG202.jpg_320x.webp 320w, https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG202.jpg_480x.webp 480w, https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG202.jpg_720x.webp 720w, https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG202.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG202.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e爸妈自己种的西红柿和黄瓜。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG203.jpg_320x.avif 320w, https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG203.jpg_480x.avif 480w, https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG203.jpg_720x.avif 720w, https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG203.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG203.jpg_320x.webp 320w, https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG203.jpg_480x.webp 480w, https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG203.jpg_720x.webp 720w, https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG203.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG203.jpg\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG204.jpg_320x.avif 320w, https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG204.jpg_480x.avif 480w, https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG204.jpg_720x.avif 720w, https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG204.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG204.jpg_320x.webp 320w, https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG204.jpg_480x.webp 480w, https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG204.jpg_720x.webp 720w, https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG204.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG204.jpg\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG205.jpg_320x.avif 320w, https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG205.jpg_480x.avif 480w, https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG205.jpg_720x.avif 720w, https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG205.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG205.jpg_320x.webp 320w, https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG205.jpg_480x.webp 480w, https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG205.jpg_720x.webp 720w, https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG205.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG205.jpg\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG206.jpg_320x.avif 320w, https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG206.jpg_480x.avif 480w, https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG206.jpg_720x.avif 720w, https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG206.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG206.jpg_320x.webp 320w, https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG206.jpg_480x.webp 480w, https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG206.jpg_720x.webp 720w, https://liudon.com/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG206.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/%E5%9B%9E%E5%AE%B6%E6%94%B6%E9%BA%A6/WechatIMG206.jpg\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e门前种的山楂、葡萄、核桃、石榴。\u003c/p\u003e\n","date_published":"2025-08-03T20:39:18+08:00","tags":[]},{"title":"六一儿童节爬长城","id":"https://liudon.com/posts/hiking-great-wall-childrens-day/","url":"https://liudon.com/posts/hiking-great-wall-childrens-day/","summary":"\u003cp\u003e六一儿童节，娃和好朋友约好一起爬长城。\u003c/p\u003e\n\u003cp\u003e去年我们\u003ca href=\"https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/\"\u003e去过慕田峪长城\u003c/a\u003e，人不多、好爬不累，两家商量后决定还是去慕田峪。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG189.jpg_320x.avif 320w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG189.jpg_480x.avif 480w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG189.jpg_720x.avif 720w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG189.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG189.jpg_320x.webp 320w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG189.jpg_480x.webp 480w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG189.jpg_720x.webp 720w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG189.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/hiking-great-wall-childrens-day/WechatIMG189.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG190.jpg_320x.avif 320w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG190.jpg_480x.avif 480w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG190.jpg_720x.avif 720w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG190.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG190.jpg_320x.webp 320w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG190.jpg_480x.webp 480w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG190.jpg_720x.webp 720w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG190.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/hiking-great-wall-childrens-day/WechatIMG190.jpg\" alt=\"\"\n         width=\"1080\" height=\"1920\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e","content_html":"\u003cp\u003e六一儿童节，娃和好朋友约好一起爬长城。\u003c/p\u003e\n\u003cp\u003e去年我们\u003ca href=\"https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/\"\u003e去过慕田峪长城\u003c/a\u003e，人不多、好爬不累，两家商量后决定还是去慕田峪。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG189.jpg_320x.avif 320w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG189.jpg_480x.avif 480w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG189.jpg_720x.avif 720w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG189.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG189.jpg_320x.webp 320w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG189.jpg_480x.webp 480w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG189.jpg_720x.webp 720w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG189.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/hiking-great-wall-childrens-day/WechatIMG189.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG190.jpg_320x.avif 320w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG190.jpg_480x.avif 480w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG190.jpg_720x.avif 720w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG190.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG190.jpg_320x.webp 320w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG190.jpg_480x.webp 480w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG190.jpg_720x.webp 720w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG190.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/hiking-great-wall-childrens-day/WechatIMG190.jpg\" alt=\"\"\n         width=\"1080\" height=\"1920\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e早上打车到清河站，还是粉色的小火车。\u003c/p\u003e\n\u003cp\u003e这次人多没占到位置，俩小朋友只能席地而坐了。\u003c/p\u003e\n\u003cp\u003e到了之后，直奔摆渡车，缆车上山。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG191.jpg_320x.avif 320w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG191.jpg_480x.avif 480w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG191.jpg_720x.avif 720w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG191.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG191.jpg_320x.webp 320w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG191.jpg_480x.webp 480w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG191.jpg_720x.webp 720w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG191.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/hiking-great-wall-childrens-day/WechatIMG191.jpg\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG192.jpg_320x.avif 320w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG192.jpg_480x.avif 480w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG192.jpg_720x.avif 720w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG192.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG192.jpg_320x.webp 320w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG192.jpg_480x.webp 480w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG192.jpg_720x.webp 720w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG192.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/hiking-great-wall-childrens-day/WechatIMG192.jpg\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG193.jpg_320x.avif 320w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG193.jpg_480x.avif 480w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG193.jpg_720x.avif 720w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG193.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG193.jpg_320x.webp 320w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG193.jpg_480x.webp 480w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG193.jpg_720x.webp 720w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG193.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/hiking-great-wall-childrens-day/WechatIMG193.jpg\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG194.jpg_320x.avif 320w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG194.jpg_480x.avif 480w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG194.jpg_720x.avif 720w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG194.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG194.jpg_320x.webp 320w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG194.jpg_480x.webp 480w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG194.jpg_720x.webp 720w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG194.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/hiking-great-wall-childrens-day/WechatIMG194.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG196.jpg_320x.avif 320w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG196.jpg_480x.avif 480w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG196.jpg_720x.avif 720w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG196.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG196.jpg_320x.webp 320w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG196.jpg_480x.webp 480w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG196.jpg_720x.webp 720w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG196.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/hiking-great-wall-childrens-day/WechatIMG196.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG197.jpg_320x.avif 320w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG197.jpg_480x.avif 480w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG197.jpg_720x.avif 720w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG197.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG197.jpg_320x.webp 320w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG197.jpg_480x.webp 480w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG197.jpg_720x.webp 720w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG197.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/hiking-great-wall-childrens-day/WechatIMG197.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e今天有雾，雾中的长城也是另一番景色。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG13223.jpg_320x.avif 320w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG13223.jpg_480x.avif 480w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG13223.jpg_720x.avif 720w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG13223.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG13223.jpg_320x.webp 320w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG13223.jpg_480x.webp 480w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG13223.jpg_720x.webp 720w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG13223.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/hiking-great-wall-childrens-day/WechatIMG13223.jpg\" alt=\"\"\n         width=\"1080\" height=\"1441\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG13224.jpg_320x.avif 320w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG13224.jpg_480x.avif 480w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG13224.jpg_720x.avif 720w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG13224.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG13224.jpg_320x.webp 320w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG13224.jpg_480x.webp 480w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG13224.jpg_720x.webp 720w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG13224.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/hiking-great-wall-childrens-day/WechatIMG13224.jpg\" alt=\"\"\n         width=\"1080\" height=\"1441\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e媳妇第一次爬慕田峪，一起登顶。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG13225.jpg_320x.avif 320w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG13225.jpg_480x.avif 480w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG13225.jpg_720x.avif 720w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG13225.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG13225.jpg_320x.webp 320w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG13225.jpg_480x.webp 480w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG13225.jpg_720x.webp 720w, https://liudon.com/posts/hiking-great-wall-childrens-day/WechatIMG13225.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/hiking-great-wall-childrens-day/WechatIMG13225.jpg\" alt=\"\"\n         width=\"1080\" height=\"1921\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e排队1个多小时，终于坐上了小朋友心心念的滑道，确实很好玩。\u003c/p\u003e\n\u003cp\u003e下山打车往车站赶，结果碰到堵车，没赶上火车。\u003c/p\u003e\n\u003cp\u003e折腾半天总算改签上7点的车，在车站点了个KFC，边吃边等车，晚上9点总算到家了。\u003c/p\u003e\n\u003cp\u003e儿童节快乐～\u003c/p\u003e\n","date_published":"2025-08-03T20:00:23+08:00","tags":["遛娃"]},{"title":"Golang database/sql 数据库断线自动重连机制解析","id":"https://liudon.com/posts/golang-database-sql-auto-reconnect-mechanism/","url":"https://liudon.com/posts/golang-database-sql-auto-reconnect-mechanism/","summary":"\u003cp\u003e最近有个交接服务的数据库要升级版本，升级最后切换瞬间会有一个闪断。\u003c/p\u003e\n\u003cp\u003e这里业务侧需要确保有自动重连机制，否则会影响服务。\u003c/p\u003e\n\u003cp\u003e因为是交接的服务，得通过代码再确认一下。\u003c/p\u003e","content_html":"\u003cp\u003e最近有个交接服务的数据库要升级版本，升级最后切换瞬间会有一个闪断。\u003c/p\u003e\n\u003cp\u003e这里业务侧需要确保有自动重连机制，否则会影响服务。\u003c/p\u003e\n\u003cp\u003e因为是交接的服务，得通过代码再确认一下。\u003c/p\u003e\n\u003cp\u003e业务代码里使用了xorm包操作的数据库，连接池管理是底层database/sql负责的。\u003c/p\u003e\n\u003cp\u003e读了一遍代码，总算搞清楚这里断连自动重连的机制了：\u003c/p\u003e\n\u003cp\u003exorm对外的增删改查方法最终都会调用到了exec方法，\u003ca href=\"https://github.com/go-xorm/xorm/blob/f39e5d9bfdb70c435f8649555f224c0fa4f51e54/session_raw.go#L152\"\u003e代码出处\u003c/a\u003e。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/golang-database-sql-auto-reconnect-mechanism/17459087308178.png_320x.avif 320w, https://liudon.com/posts/golang-database-sql-auto-reconnect-mechanism/17459087308178.png_480x.avif 480w, https://liudon.com/posts/golang-database-sql-auto-reconnect-mechanism/17459087308178.png_720x.avif 720w, https://liudon.com/posts/golang-database-sql-auto-reconnect-mechanism/17459087308178.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/golang-database-sql-auto-reconnect-mechanism/17459087308178.png_320x.webp 320w, https://liudon.com/posts/golang-database-sql-auto-reconnect-mechanism/17459087308178.png_480x.webp 480w, https://liudon.com/posts/golang-database-sql-auto-reconnect-mechanism/17459087308178.png_720x.webp 720w, https://liudon.com/posts/golang-database-sql-auto-reconnect-mechanism/17459087308178.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/golang-database-sql-auto-reconnect-mechanism/17459087308178.png\" alt=\"\"\n         width=\"1080\" height=\"567\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e可以看到这里调到了database/sql里的ExecContext方法，\u003ca href=\"https://cs.opensource.google/go/go/+/refs/tags/go1.18:src/database/sql/sql.go\"\u003e代码出处\u003c/a\u003e。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/golang-database-sql-auto-reconnect-mechanism/17459153468139.png_320x.avif 320w, https://liudon.com/posts/golang-database-sql-auto-reconnect-mechanism/17459153468139.png_480x.avif 480w, https://liudon.com/posts/golang-database-sql-auto-reconnect-mechanism/17459153468139.png_720x.avif 720w, https://liudon.com/posts/golang-database-sql-auto-reconnect-mechanism/17459153468139.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/golang-database-sql-auto-reconnect-mechanism/17459153468139.png_320x.webp 320w, https://liudon.com/posts/golang-database-sql-auto-reconnect-mechanism/17459153468139.png_480x.webp 480w, https://liudon.com/posts/golang-database-sql-auto-reconnect-mechanism/17459153468139.png_720x.webp 720w, https://liudon.com/posts/golang-database-sql-auto-reconnect-mechanism/17459153468139.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/golang-database-sql-auto-reconnect-mechanism/17459153468139.png\" alt=\"\"\n         width=\"1080\" height=\"671\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e这里调用到了exec方法:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003edb.conn 从连接池获取连接；\u003c/li\u003e\n\u003cli\u003edb.execDC 执行sql，最后会通过release方法将连接再放回连接池；\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e这里release传入的是db.releaseConn方法，实现如图:\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/golang-database-sql-auto-reconnect-mechanism/17459153819395.png_320x.avif 320w, https://liudon.com/posts/golang-database-sql-auto-reconnect-mechanism/17459153819395.png_480x.avif 480w, https://liudon.com/posts/golang-database-sql-auto-reconnect-mechanism/17459153819395.png_720x.avif 720w, https://liudon.com/posts/golang-database-sql-auto-reconnect-mechanism/17459153819395.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/golang-database-sql-auto-reconnect-mechanism/17459153819395.png_320x.webp 320w, https://liudon.com/posts/golang-database-sql-auto-reconnect-mechanism/17459153819395.png_480x.webp 480w, https://liudon.com/posts/golang-database-sql-auto-reconnect-mechanism/17459153819395.png_720x.webp 720w, https://liudon.com/posts/golang-database-sql-auto-reconnect-mechanism/17459153819395.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/golang-database-sql-auto-reconnect-mechanism/17459153819395.png\" alt=\"\"\n         width=\"1080\" height=\"758\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e这里调用了putConn方法，实现如图：\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/golang-database-sql-auto-reconnect-mechanism/17459154175309.png_320x.avif 320w, https://liudon.com/posts/golang-database-sql-auto-reconnect-mechanism/17459154175309.png_480x.avif 480w, https://liudon.com/posts/golang-database-sql-auto-reconnect-mechanism/17459154175309.png_720x.avif 720w, https://liudon.com/posts/golang-database-sql-auto-reconnect-mechanism/17459154175309.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/golang-database-sql-auto-reconnect-mechanism/17459154175309.png_320x.webp 320w, https://liudon.com/posts/golang-database-sql-auto-reconnect-mechanism/17459154175309.png_480x.webp 480w, https://liudon.com/posts/golang-database-sql-auto-reconnect-mechanism/17459154175309.png_720x.webp 720w, https://liudon.com/posts/golang-database-sql-auto-reconnect-mechanism/17459154175309.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/golang-database-sql-auto-reconnect-mechanism/17459154175309.png\" alt=\"\"\n         width=\"1080\" height=\"857\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e注意红框部分，这里检查执行结果如果为连接错误，会通过maybeOpenNewConnections创建一个新连接，同时将此连接关闭。\u003c/p\u003e\n","date_published":"2025-04-30T17:37:23+08:00","tags":["golang","database/sql"]},{"title":"Golang默认Http Client导致的cannot assign requested address错误","id":"https://liudon.com/posts/cannot-assign-requested-address-in-golang-http-client/","url":"https://liudon.com/posts/cannot-assign-requested-address-in-golang-http-client/","summary":"\u003ch3 id=\"问题表现\"\u003e问题表现\u003c/h3\u003e\n\u003cp\u003e重现代码：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003epackage\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003emain\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;fmt\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;io\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;net/http\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;time\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003emain\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eclient\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nx\"\u003ehttp\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eClient\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eTimeout\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003etime\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eDuration\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e3\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003etime\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eSecond\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ei\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ei\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e100\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ei\u003c/span\u003e\u003cspan class=\"o\"\u003e++\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003ego\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ereq\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003e_\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ehttp\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eNewRequest\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ehttp\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eMethodGet\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://baidu.com\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ersp\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eclient\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eDo\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ereq\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e!=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003efmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003ePrintln\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;request failed\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003econtinue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ersp\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eBody\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eClose\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ebody\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eio\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eReadAll\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ersp\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eBody\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e!=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003efmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003ePrintln\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;read body failed\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003econtinue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003efmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003ePrintln\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nb\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ebody\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}()\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"k\"\u003eselect\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e启动后，随着请求越来越多，很快就出现了\u0026quot;cannot assign requested address\u0026quot;错误，服务器出现大量TIME_WAIT连接。\u003c/p\u003e","content_html":"\u003ch3 id=\"问题表现\"\u003e问题表现\u003c/h3\u003e\n\u003cp\u003e重现代码：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003epackage\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003emain\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;fmt\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;io\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;net/http\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;time\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003emain\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eclient\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nx\"\u003ehttp\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eClient\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eTimeout\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003etime\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eDuration\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e3\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003etime\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eSecond\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ei\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ei\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e100\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ei\u003c/span\u003e\u003cspan class=\"o\"\u003e++\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003ego\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ereq\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003e_\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ehttp\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eNewRequest\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ehttp\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eMethodGet\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;https://baidu.com\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ersp\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eclient\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eDo\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ereq\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e!=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003efmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003ePrintln\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;request failed\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003econtinue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ersp\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eBody\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eClose\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ebody\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eio\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eReadAll\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ersp\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eBody\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e!=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003efmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003ePrintln\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;read body failed\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003econtinue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003efmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003ePrintln\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nb\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ebody\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}()\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"k\"\u003eselect\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e启动后，随着请求越来越多，很快就出现了\u0026quot;cannot assign requested address\u0026quot;错误，服务器出现大量TIME_WAIT连接。\u003c/p\u003e\n\u003ch3 id=\"问题原因\"\u003e问题原因\u003c/h3\u003e\n\u003cp\u003e\u003ca href=\"https://cs.opensource.google/go/go/+/refs/tags/go1.24.2:src/net/http/client.go;l=61\"\u003enet/http代码\u003c/a\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etype Client struct {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t// Transport specifies the mechanism by which individual\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t// HTTP requests are made.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t// If nil, DefaultTransport is used.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\tTransport RoundTripper\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e未配置Transport时，使用默认的DefaultTransport。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003eDefaultTransport\u003c/span\u003e \u003cspan class=\"n\"\u003eRoundTripper\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003eTransport\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"n\"\u003eProxy\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eProxyFromEnvironment\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"n\"\u003eDialContext\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003edefaultTransportDialContext\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003enet\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eDialer\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"n\"\u003eTimeout\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e   \u003cspan class=\"mi\"\u003e30\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003etime\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eSecond\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"n\"\u003eKeepAlive\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e30\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003etime\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eSecond\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"p\"\u003e}),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"n\"\u003eForceAttemptHTTP2\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e     \u003cspan class=\"bp\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"n\"\u003eMaxIdleConns\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e          \u003cspan class=\"mi\"\u003e100\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"n\"\u003eIdleConnTimeout\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e       \u003cspan class=\"mi\"\u003e90\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003etime\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eSecond\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"n\"\u003eTLSHandshakeTimeout\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e   \u003cspan class=\"mi\"\u003e10\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003etime\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eSecond\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"n\"\u003eExpectContinueTimeout\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003etime\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eSecond\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e这里指定了最大空闲连接为100，未指定单个host的最大空闲连接。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003efunc\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003et\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003eTransport\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003emaxIdleConnsPerHost\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"ne\"\u003eint\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003ev\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003et\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eMaxIdleConnsPerHost\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"n\"\u003ev\u003c/span\u003e \u003cspan class=\"o\"\u003e!=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003ev\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003eDefaultMaxIdleConnsPerHost\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e如果未配置MaxIdleConnsPerHost，则使用默认的DefaultMaxIdleConnsPerHost配置。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eDefaultMaxIdleConnsPerHost\u003c/span\u003e \u003cspan class=\"n\"\u003eis\u003c/span\u003e \u003cspan class=\"n\"\u003ethe\u003c/span\u003e \u003cspan class=\"n\"\u003edefault\u003c/span\u003e \u003cspan class=\"n\"\u003evalue\u003c/span\u003e \u003cspan class=\"n\"\u003eof\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003eTransport\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;s\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eMaxIdleConnsPerHost\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003eDefaultMaxIdleConnsPerHost\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e这下清楚了：\u003c/p\u003e\n\u003cp\u003e100个协程，请求同一个地址，只能保留2个空闲连接，超出的请求完就会退出，产生一个TIME_WAIT；\u003c/p\u003e\n\u003cp\u003e然后再创建一个连接，请求完关闭，又产生一个TIME_WAIT，直至耗尽端口。\u003c/p\u003e\n\u003ch3 id=\"解决方案\"\u003e解决方案\u003c/h3\u003e\n\u003cp\u003e创建Http.Client时，配置MaxIdleConnsPerHost即可。\u003c/p\u003e\n","date_published":"2025-04-29T20:20:29+08:00","tags":["golang"]},{"title":"清明踏春，爬山看海","id":"https://liudon.com/posts/qingming-festival-holiday-2025/","url":"https://liudon.com/posts/qingming-festival-holiday-2025/","summary":"\u003cp\u003e自从买了登山杖，娃一直说想去爬山。\u003c/p\u003e\n\u003cp\u003e前段时间天气一直不好，山上也还是光秃秃的，就一直没去。\u003c/p\u003e\n\u003cp\u003e趁着清明假期，带娃爬山去。\u003c/p\u003e\n\u003cp\u003e去年假期去过一次香山，路上超堵，这次还是选择了离家不远的百望山：好爬不累。\u003c/p\u003e","content_html":"\u003cp\u003e自从买了登山杖，娃一直说想去爬山。\u003c/p\u003e\n\u003cp\u003e前段时间天气一直不好，山上也还是光秃秃的，就一直没去。\u003c/p\u003e\n\u003cp\u003e趁着清明假期，带娃爬山去。\u003c/p\u003e\n\u003cp\u003e去年假期去过一次香山，路上超堵，这次还是选择了离家不远的百望山：好爬不累。\u003c/p\u003e\n\u003cp\u003e有了登山杖，这次我们没有走以往的大路，直奔山中的小路。\u003c/p\u003e\n\u003cp\u003e一路台阶，走走停停，不到半个小时就登顶了。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG166.jpg_320x.avif 320w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG166.jpg_480x.avif 480w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG166.jpg_720x.avif 720w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG166.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG166.jpg_320x.webp 320w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG166.jpg_480x.webp 480w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG166.jpg_720x.webp 720w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG166.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/qingming-festival-holiday-2025/WechatIMG166.jpg\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG167.jpg_320x.avif 320w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG167.jpg_480x.avif 480w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG167.jpg_720x.avif 720w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG167.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG167.jpg_320x.webp 320w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG167.jpg_480x.webp 480w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG167.jpg_720x.webp 720w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG167.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/qingming-festival-holiday-2025/WechatIMG167.jpg\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG162.jpg_320x.avif 320w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG162.jpg_480x.avif 480w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG162.jpg_720x.avif 720w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG162.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG162.jpg_320x.webp 320w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG162.jpg_480x.webp 480w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG162.jpg_720x.webp 720w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG162.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/qingming-festival-holiday-2025/WechatIMG162.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG163.jpg_320x.avif 320w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG163.jpg_480x.avif 480w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG163.jpg_720x.avif 720w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG163.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG163.jpg_320x.webp 320w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG163.jpg_480x.webp 480w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG163.jpg_720x.webp 720w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG163.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/qingming-festival-holiday-2025/WechatIMG163.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG164.jpg_320x.avif 320w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG164.jpg_480x.avif 480w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG164.jpg_720x.avif 720w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG164.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG164.jpg_320x.webp 320w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG164.jpg_480x.webp 480w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG164.jpg_720x.webp 720w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG164.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/qingming-festival-holiday-2025/WechatIMG164.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG165.jpg_320x.avif 320w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG165.jpg_480x.avif 480w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG165.jpg_720x.avif 720w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG165.jpg_960x.avif 960w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG165.jpg_320x.webp 320w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG165.jpg_480x.webp 480w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG165.jpg_720x.webp 720w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG165.jpg_960x.webp 960w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/qingming-festival-holiday-2025/WechatIMG165.jpg\" alt=\"\"\n         width=\"960\" height=\"1280\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e快到山顶的时候起风了，在山上稍作休息便下山了。\u003c/p\u003e\n\u003cp\u003e下山直奔新街口，到老西安饭庄，来个羊肉泡馍。\u003c/p\u003e\n\u003cp\u003e可能是自己掰的馍不够小，感觉没有那么入味，并没有很惊艳。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG168.jpg_320x.avif 320w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG168.jpg_480x.avif 480w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG168.jpg_720x.avif 720w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG168.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG168.jpg_320x.webp 320w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG168.jpg_480x.webp 480w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG168.jpg_720x.webp 720w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG168.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/qingming-festival-holiday-2025/WechatIMG168.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG169.jpg_320x.avif 320w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG169.jpg_480x.avif 480w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG169.jpg_720x.avif 720w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG169.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG169.jpg_320x.webp 320w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG169.jpg_480x.webp 480w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG169.jpg_720x.webp 720w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG169.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/qingming-festival-holiday-2025/WechatIMG169.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG170.jpg_320x.avif 320w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG170.jpg_480x.avif 480w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG170.jpg_720x.avif 720w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG170.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG170.jpg_320x.webp 320w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG170.jpg_480x.webp 480w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG170.jpg_720x.webp 720w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG170.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/qingming-festival-holiday-2025/WechatIMG170.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e吃完饭时间还早，好不容易进一趟城，上后海转转。\u003c/p\u003e\n\u003cp\u003e沿着湖边，慢悠悠地闲逛。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG171.jpg_320x.avif 320w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG171.jpg_480x.avif 480w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG171.jpg_720x.avif 720w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG171.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG171.jpg_320x.webp 320w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG171.jpg_480x.webp 480w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG171.jpg_720x.webp 720w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG171.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/qingming-festival-holiday-2025/WechatIMG171.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG172.jpg_320x.avif 320w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG172.jpg_480x.avif 480w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG172.jpg_720x.avif 720w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG172.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG172.jpg_320x.webp 320w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG172.jpg_480x.webp 480w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG172.jpg_720x.webp 720w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG172.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/qingming-festival-holiday-2025/WechatIMG172.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG174.jpg_320x.avif 320w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG174.jpg_480x.avif 480w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG174.jpg_720x.avif 720w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG174.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG174.jpg_320x.webp 320w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG174.jpg_480x.webp 480w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG174.jpg_720x.webp 720w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG174.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/qingming-festival-holiday-2025/WechatIMG174.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG175.jpg_320x.avif 320w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG175.jpg_480x.avif 480w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG175.jpg_720x.avif 720w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG175.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG175.jpg_320x.webp 320w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG175.jpg_480x.webp 480w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG175.jpg_720x.webp 720w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG175.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/qingming-festival-holiday-2025/WechatIMG175.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG177.jpg_320x.avif 320w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG177.jpg_480x.avif 480w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG177.jpg_720x.avif 720w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG177.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG177.jpg_320x.webp 320w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG177.jpg_480x.webp 480w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG177.jpg_720x.webp 720w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG177.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/qingming-festival-holiday-2025/WechatIMG177.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG178.jpg_320x.avif 320w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG178.jpg_480x.avif 480w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG178.jpg_720x.avif 720w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG178.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG178.jpg_320x.webp 320w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG178.jpg_480x.webp 480w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG178.jpg_720x.webp 720w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG178.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/qingming-festival-holiday-2025/WechatIMG178.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG176.jpg_320x.avif 320w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG176.jpg_480x.avif 480w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG176.jpg_720x.avif 720w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG176.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG176.jpg_320x.webp 320w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG176.jpg_480x.webp 480w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG176.jpg_720x.webp 720w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG176.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/qingming-festival-holiday-2025/WechatIMG176.jpg\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG179.jpg_320x.avif 320w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG179.jpg_480x.avif 480w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG179.jpg_720x.avif 720w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG179.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG179.jpg_320x.webp 320w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG179.jpg_480x.webp 480w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG179.jpg_720x.webp 720w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG179.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/qingming-festival-holiday-2025/WechatIMG179.jpg\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e到了银锭桥，人头攒动。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG180.jpg_320x.avif 320w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG180.jpg_480x.avif 480w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG180.jpg_720x.avif 720w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG180.jpg_960x.avif 960w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG180.jpg_320x.webp 320w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG180.jpg_480x.webp 480w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG180.jpg_720x.webp 720w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG180.jpg_960x.webp 960w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/qingming-festival-holiday-2025/WechatIMG180.jpg\" alt=\"\"\n         width=\"960\" height=\"1280\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG181.jpg_320x.avif 320w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG181.jpg_480x.avif 480w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG181.jpg_720x.avif 720w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG181.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG181.jpg_320x.webp 320w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG181.jpg_480x.webp 480w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG181.jpg_720x.webp 720w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG181.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/qingming-festival-holiday-2025/WechatIMG181.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e顺着人流，进入烟袋斜街，两边各种文创小店，买了些小吃稍微休息。\u003c/p\u003e\n\u003cp\u003e出烟袋斜街，来鼓楼打个卡。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG182.jpg_320x.avif 320w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG182.jpg_480x.avif 480w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG182.jpg_720x.avif 720w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG182.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG182.jpg_320x.webp 320w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG182.jpg_480x.webp 480w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG182.jpg_720x.webp 720w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG182.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/qingming-festival-holiday-2025/WechatIMG182.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e继续向前溜达，进入南锣鼓巷。\u003c/p\u003e\n\u003cp\u003e上一次来南锣鼓巷，应该还是刚来北京不久和同事一起来的。\u003c/p\u003e\n\u003cp\u003e依旧是人挤人，扎进胡同里碰到个大爷，提醒不要买东西，这里东西特别贵，匆匆逛完就回家了。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG183.jpg_320x.avif 320w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG183.jpg_480x.avif 480w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG183.jpg_720x.avif 720w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG183.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG183.jpg_320x.webp 320w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG183.jpg_480x.webp 480w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG183.jpg_720x.webp 720w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG183.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/qingming-festival-holiday-2025/WechatIMG183.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG184.jpg_320x.avif 320w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG184.jpg_480x.avif 480w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG184.jpg_720x.avif 720w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG184.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG184.jpg_320x.webp 320w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG184.jpg_480x.webp 480w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG184.jpg_720x.webp 720w, https://liudon.com/posts/qingming-festival-holiday-2025/WechatIMG184.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/qingming-festival-holiday-2025/WechatIMG184.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e一天下来10公里，倒也没有想象的那么累。\u003c/p\u003e\n","date_published":"2025-04-06T22:47:37+08:00","tags":["爬山","遛娃"]},{"title":"购入小牛G400T电动车","id":"https://liudon.com/posts/xiaoniu-g400t-electric-bike-experience/","url":"https://liudon.com/posts/xiaoniu-g400t-electric-bike-experience/","summary":"\u003cp\u003e去年10月底，考虑到老的绿源电动车已经骑了5年，电池越来越不行，马上要冬天了，考虑换个新电动车。\u003c/p\u003e\n\u003cp\u003e到各个品牌店里转了一圈，发现都没有车子，说是新规的缘故，要到11月份才能有新车。\u003c/p\u003e","content_html":"\u003cp\u003e去年10月底，考虑到老的绿源电动车已经骑了5年，电池越来越不行，马上要冬天了，考虑换个新电动车。\u003c/p\u003e\n\u003cp\u003e到各个品牌店里转了一圈，发现都没有车子，说是新规的缘故，要到11月份才能有新车。\u003c/p\u003e\n\u003cp\u003e同事给推荐的小牛F400T，11月之后到店里看了，新规不让卖了，考虑一番选择了G400T。\u003c/p\u003e\n\u003cp\u003e双11活动，京东下单3699元，店里直接提货。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/xiaoniu-g400t-electric-bike-experience/WechatIMG159.jpg_320x.avif 320w, https://liudon.com/posts/xiaoniu-g400t-electric-bike-experience/WechatIMG159.jpg_480x.avif 480w, https://liudon.com/posts/xiaoniu-g400t-electric-bike-experience/WechatIMG159.jpg_720x.avif 720w, https://liudon.com/posts/xiaoniu-g400t-electric-bike-experience/WechatIMG159.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/xiaoniu-g400t-electric-bike-experience/WechatIMG159.jpg_320x.webp 320w, https://liudon.com/posts/xiaoniu-g400t-electric-bike-experience/WechatIMG159.jpg_480x.webp 480w, https://liudon.com/posts/xiaoniu-g400t-electric-bike-experience/WechatIMG159.jpg_720x.webp 720w, https://liudon.com/posts/xiaoniu-g400t-electric-bike-experience/WechatIMG159.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/xiaoniu-g400t-electric-bike-experience/WechatIMG159.jpg\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e第二天直奔车管所，注销旧车，新车上牌。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/xiaoniu-g400t-electric-bike-experience/WechatIMG160.jpg_320x.avif 320w, https://liudon.com/posts/xiaoniu-g400t-electric-bike-experience/WechatIMG160.jpg_480x.avif 480w, https://liudon.com/posts/xiaoniu-g400t-electric-bike-experience/WechatIMG160.jpg_720x.avif 720w, https://liudon.com/posts/xiaoniu-g400t-electric-bike-experience/WechatIMG160.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/xiaoniu-g400t-electric-bike-experience/WechatIMG160.jpg_320x.webp 320w, https://liudon.com/posts/xiaoniu-g400t-electric-bike-experience/WechatIMG160.jpg_480x.webp 480w, https://liudon.com/posts/xiaoniu-g400t-electric-bike-experience/WechatIMG160.jpg_720x.webp 720w, https://liudon.com/posts/xiaoniu-g400t-electric-bike-experience/WechatIMG160.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/xiaoniu-g400t-electric-bike-experience/WechatIMG160.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e再到京通上申请以旧补贴，500元到手，整个下来3000出头。\u003c/p\u003e\n\u003cp\u003e跟5年前的旧车比，真是天翻地覆的变化，手机解锁、蓝牙/NFC解锁，实时定位。\u003c/p\u003e\n\u003cp\u003e续航也比之前多了很多，冬天最冷的时候三天一充，平时基本一周一充。\u003c/p\u003e\n\u003cp\u003e到现在马上5个月，已经骑行了1000公里。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/xiaoniu-g400t-electric-bike-experience/WechatIMG161.jpg_320x.avif 320w, https://liudon.com/posts/xiaoniu-g400t-electric-bike-experience/WechatIMG161.jpg_480x.avif 480w, https://liudon.com/posts/xiaoniu-g400t-electric-bike-experience/WechatIMG161.jpg_720x.avif 720w, https://liudon.com/posts/xiaoniu-g400t-electric-bike-experience/WechatIMG161.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/xiaoniu-g400t-electric-bike-experience/WechatIMG161.jpg_320x.webp 320w, https://liudon.com/posts/xiaoniu-g400t-electric-bike-experience/WechatIMG161.jpg_480x.webp 480w, https://liudon.com/posts/xiaoniu-g400t-electric-bike-experience/WechatIMG161.jpg_720x.webp 720w, https://liudon.com/posts/xiaoniu-g400t-electric-bike-experience/WechatIMG161.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/xiaoniu-g400t-electric-bike-experience/WechatIMG161.jpg\" alt=\"\"\n         width=\"1080\" height=\"754\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n","date_published":"2025-03-26T22:07:21+08:00","tags":[]},{"title":"北京的三月飞雪","id":"https://liudon.com/posts/heavy-snow-in-beijing/","url":"https://liudon.com/posts/heavy-snow-in-beijing/","summary":"\u003cp\u003e盼了一冬天的雪没下，开春了，来了场大雪。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/heavy-snow-in-beijing/WechatIMG152.jpg_320x.avif 320w, https://liudon.com/posts/heavy-snow-in-beijing/WechatIMG152.jpg_480x.avif 480w, https://liudon.com/posts/heavy-snow-in-beijing/WechatIMG152.jpg_720x.avif 720w, https://liudon.com/posts/heavy-snow-in-beijing/WechatIMG152.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/heavy-snow-in-beijing/WechatIMG152.jpg_320x.webp 320w, https://liudon.com/posts/heavy-snow-in-beijing/WechatIMG152.jpg_480x.webp 480w, https://liudon.com/posts/heavy-snow-in-beijing/WechatIMG152.jpg_720x.webp 720w, https://liudon.com/posts/heavy-snow-in-beijing/WechatIMG152.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/heavy-snow-in-beijing/WechatIMG152.jpg\" alt=\"\"\n         width=\"1080\" height=\"1441\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/heavy-snow-in-beijing/WechatIMG153.jpg_320x.avif 320w, https://liudon.com/posts/heavy-snow-in-beijing/WechatIMG153.jpg_480x.avif 480w, https://liudon.com/posts/heavy-snow-in-beijing/WechatIMG153.jpg_720x.avif 720w, https://liudon.com/posts/heavy-snow-in-beijing/WechatIMG153.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/heavy-snow-in-beijing/WechatIMG153.jpg_320x.webp 320w, https://liudon.com/posts/heavy-snow-in-beijing/WechatIMG153.jpg_480x.webp 480w, https://liudon.com/posts/heavy-snow-in-beijing/WechatIMG153.jpg_720x.webp 720w, https://liudon.com/posts/heavy-snow-in-beijing/WechatIMG153.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/heavy-snow-in-beijing/WechatIMG153.jpg\" alt=\"\"\n         width=\"1080\" height=\"1441\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e","content_html":"\u003cp\u003e盼了一冬天的雪没下，开春了，来了场大雪。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/heavy-snow-in-beijing/WechatIMG152.jpg_320x.avif 320w, https://liudon.com/posts/heavy-snow-in-beijing/WechatIMG152.jpg_480x.avif 480w, https://liudon.com/posts/heavy-snow-in-beijing/WechatIMG152.jpg_720x.avif 720w, https://liudon.com/posts/heavy-snow-in-beijing/WechatIMG152.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/heavy-snow-in-beijing/WechatIMG152.jpg_320x.webp 320w, https://liudon.com/posts/heavy-snow-in-beijing/WechatIMG152.jpg_480x.webp 480w, https://liudon.com/posts/heavy-snow-in-beijing/WechatIMG152.jpg_720x.webp 720w, https://liudon.com/posts/heavy-snow-in-beijing/WechatIMG152.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/heavy-snow-in-beijing/WechatIMG152.jpg\" alt=\"\"\n         width=\"1080\" height=\"1441\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/heavy-snow-in-beijing/WechatIMG153.jpg_320x.avif 320w, https://liudon.com/posts/heavy-snow-in-beijing/WechatIMG153.jpg_480x.avif 480w, https://liudon.com/posts/heavy-snow-in-beijing/WechatIMG153.jpg_720x.avif 720w, https://liudon.com/posts/heavy-snow-in-beijing/WechatIMG153.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/heavy-snow-in-beijing/WechatIMG153.jpg_320x.webp 320w, https://liudon.com/posts/heavy-snow-in-beijing/WechatIMG153.jpg_480x.webp 480w, https://liudon.com/posts/heavy-snow-in-beijing/WechatIMG153.jpg_720x.webp 720w, https://liudon.com/posts/heavy-snow-in-beijing/WechatIMG153.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/heavy-snow-in-beijing/WechatIMG153.jpg\" alt=\"\"\n         width=\"1080\" height=\"1441\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/heavy-snow-in-beijing/WechatIMG154.jpg_320x.avif 320w, https://liudon.com/posts/heavy-snow-in-beijing/WechatIMG154.jpg_480x.avif 480w, https://liudon.com/posts/heavy-snow-in-beijing/WechatIMG154.jpg_720x.avif 720w, https://liudon.com/posts/heavy-snow-in-beijing/WechatIMG154.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/heavy-snow-in-beijing/WechatIMG154.jpg_320x.webp 320w, https://liudon.com/posts/heavy-snow-in-beijing/WechatIMG154.jpg_480x.webp 480w, https://liudon.com/posts/heavy-snow-in-beijing/WechatIMG154.jpg_720x.webp 720w, https://liudon.com/posts/heavy-snow-in-beijing/WechatIMG154.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/heavy-snow-in-beijing/WechatIMG154.jpg\" alt=\"\"\n         width=\"1080\" height=\"1441\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/heavy-snow-in-beijing/WechatIMG155.jpg_320x.avif 320w, https://liudon.com/posts/heavy-snow-in-beijing/WechatIMG155.jpg_480x.avif 480w, https://liudon.com/posts/heavy-snow-in-beijing/WechatIMG155.jpg_720x.avif 720w, https://liudon.com/posts/heavy-snow-in-beijing/WechatIMG155.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/heavy-snow-in-beijing/WechatIMG155.jpg_320x.webp 320w, https://liudon.com/posts/heavy-snow-in-beijing/WechatIMG155.jpg_480x.webp 480w, https://liudon.com/posts/heavy-snow-in-beijing/WechatIMG155.jpg_720x.webp 720w, https://liudon.com/posts/heavy-snow-in-beijing/WechatIMG155.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/heavy-snow-in-beijing/WechatIMG155.jpg\" alt=\"\"\n         width=\"1080\" height=\"1441\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cfigure\u003e\u003cvideo\n        controls\n        playsinline\n        preload=\"none\"\n        poster=\"/posts/heavy-snow-in-beijing/2025-03-15.mp4.poster.webp\"\n        width=\"960\"\n        height=\"544\"\n        style=\"--video-ratio: 960 / 544\"\n    \u003e\n        \u003csource\n            src=\"/posts/heavy-snow-in-beijing/2025-03-15.mp4\"\n            type=\"video/mp4\"\n        /\u003e\n\n        您的浏览器不支持 HTML5 视频。\n    \u003c/video\u003e\n\n\u003c/figure\u003e\n","date_published":"2025-03-16T18:33:57+08:00","tags":["北京"]},{"title":"WrenAI GenBI Classic 本地部署：Docker + Ollama 配置本地 LLM","id":"https://liudon.com/posts/wrenai-local-llm-usage-guide/","url":"https://liudon.com/posts/wrenai-local-llm-usage-guide/","summary":"记录 WrenAI GenBI Classic 的本地部署过程：通过 Docker 部署 Ollama，并配置 Phi-4、nomic-embed-text、Qdrant 与 WrenAI 旧版 Web UI。本文基于 WrenAI 0.15.x 历史配置。","content_html":"\u003cblockquote\u003e\n\u003cp\u003e本文记录 WrenAI GenBI Classic 的 Docker + Ollama 本地模型部署过程。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003e版本说明（2026-09 更新）\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e本文最初写于 2025 年 3 月，配置基于 WrenAI 0.15.x 的 GenBI UI 架构。2026 年 5 月，WrenAI 已将旧的 GenBI 应用归档至 \u003ca href=\"https://github.com/Canner/WrenAI/tree/legacy/v1\"\u003e\u003ccode\u003elegacy/v1\u003c/code\u003e\u003c/a\u003e：\u003ccode\u003ewren-ui\u003c/code\u003e、\u003ccode\u003ewren-ai-service\u003c/code\u003e、\u003ccode\u003ewren-launcher\u003c/code\u003e 与 Docker 部署均属于该路线。它仍可使用，但已冻结，不再获得新功能和安全更新。\u003c/p\u003e\n\u003cp\u003e当前主线是面向 AI Agent 的 Context Engine、Wren CLI、MDL 和 Memory；首次使用 WrenAI 请优先阅读\u003ca href=\"https://github.com/Canner/WrenAI/blob/main/docs/core/get_started/quickstart.md\"\u003e官方 Quickstart\u003c/a\u003e。本文仅适合需要部署 \u003cstrong\u003eWrenAI GenBI Classic / 旧版 Web UI\u003c/strong\u003e 的读者，文中的版本号不能直接替换为当前主线版本。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eWrenAI GenBI Classic 是一个开源的 Text-to-SQL 工具：导入数据库结构后，可以通过提问生成 SQL。\u003c/p\u003e\n\u003ch2 id=\"wrenai-genbi-classic-本地部署方案\"\u003eWrenAI GenBI Classic 本地部署方案\u003c/h2\u003e\n\u003cp\u003e本文的目标是不调用 OpenAI 等外部 LLM API，而是让 SQL 生成和 Embedding 都使用 Ollama 提供的本地模型。部署架构如下：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e浏览器\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  ↓\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eWrenAI UI\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  ↓\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eWren AI Service\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  ├── LLM ───────→ Ollama → Phi-4\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  ├── Embedder ──→ Ollama → nomic-embed-text\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  └── Vector DB ─→ Qdrant\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/wrenai-local-llm-usage-guide/wren_workflow.png_320x.avif 320w, https://liudon.com/posts/wrenai-local-llm-usage-guide/wren_workflow.png_480x.avif 480w, https://liudon.com/posts/wrenai-local-llm-usage-guide/wren_workflow.png_720x.avif 720w, https://liudon.com/posts/wrenai-local-llm-usage-guide/wren_workflow.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/wrenai-local-llm-usage-guide/wren_workflow.png_320x.webp 320w, https://liudon.com/posts/wrenai-local-llm-usage-guide/wren_workflow.png_480x.webp 480w, https://liudon.com/posts/wrenai-local-llm-usage-guide/wren_workflow.png_720x.webp 720w, https://liudon.com/posts/wrenai-local-llm-usage-guide/wren_workflow.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/wrenai-local-llm-usage-guide/wren_workflow.png\" alt=\"WrenAI GenBI Classic 使用 Ollama 本地模型的工作流程\"\n         width=\"1080\" height=\"437\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e出于数据不离开本地环境的考虑，本文使用 Ollama 部署本地 LLM。\u003c/p\u003e\n\u003ch2 id=\"使用-docker-部署-ollama\"\u003e使用 Docker 部署 Ollama\u003c/h2\u003e\n\u003cp\u003e参考安装文档：https://hub.docker.com/r/ollama/ollama\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ecurl\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003efsSL\u003c/span\u003e \u003cspan class=\"n\"\u003ehttps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e//\u003c/span\u003e\u003cspan class=\"n\"\u003envidia\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003egithub\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eio\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003elibnvidia\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003econtainer\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003egpgkey\u003c/span\u003e \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003esudo\u003c/span\u003e \u003cspan class=\"n\"\u003egpg\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003edearmor\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eo\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eusr\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eshare\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003ekeyrings\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003envidia\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003econtainer\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003etoolkit\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ekeyring\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003egpg\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ecurl\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eL\u003c/span\u003e \u003cspan class=\"n\"\u003ehttps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e//\u003c/span\u003e\u003cspan class=\"n\"\u003envidia\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003egithub\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eio\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003elibnvidia\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003econtainer\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003estable\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003edeb\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003envidia\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003econtainer\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003etoolkit\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003elist\u003c/span\u003e \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003esed\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;s#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g\u0026#39;\u003c/span\u003e \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003esudo\u003c/span\u003e \u003cspan class=\"n\"\u003etee\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eetc\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eapt\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003esources\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003elist\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ed\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003envidia\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003econtainer\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003etoolkit\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003elist\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003esudo\u003c/span\u003e \u003cspan class=\"n\"\u003eapt\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eget\u003c/span\u003e \u003cspan class=\"n\"\u003eupdate\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003esudo\u003c/span\u003e \u003cspan class=\"n\"\u003eapt\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eget\u003c/span\u003e \u003cspan class=\"n\"\u003einstall\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ey\u003c/span\u003e \u003cspan class=\"n\"\u003envidia\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003econtainer\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003etoolkit\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003esudo\u003c/span\u003e \u003cspan class=\"n\"\u003envidia\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ectk\u003c/span\u003e \u003cspan class=\"n\"\u003eruntime\u003c/span\u003e \u003cspan class=\"n\"\u003econfigure\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003eruntime\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003edocker\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003esudo\u003c/span\u003e \u003cspan class=\"n\"\u003esystemctl\u003c/span\u003e \u003cspan class=\"n\"\u003erestart\u003c/span\u003e \u003cspan class=\"n\"\u003edocker\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003edocker\u003c/span\u003e \u003cspan class=\"n\"\u003erun\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ed\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003egpus\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003eall\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ev\u003c/span\u003e \u003cspan class=\"n\"\u003eollama\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eroot\u003c/span\u003e\u003cspan class=\"o\"\u003e/.\u003c/span\u003e\u003cspan class=\"n\"\u003eollama\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ep\u003c/span\u003e \u003cspan class=\"mi\"\u003e11434\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"mi\"\u003e11434\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003ename\u003c/span\u003e \u003cspan class=\"n\"\u003eollama\u003c/span\u003e \u003cspan class=\"n\"\u003eollama\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eollama\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"下载本地-llm-和-embedding-模型\"\u003e下载本地 LLM 和 Embedding 模型\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker exec ollama ollama pull nomic-embed-text:latest\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edocker exec ollama ollama pull phi4:14b\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003e安全提示\u003c/strong\u003e：11434 是 Ollama API，不应直接向公网或安全组全量放通。若 WrenAI 与 Ollama 不在同一 Docker 网络或同一主机，请仅允许必要的私网来源访问，并通过防火墙或 VPN 限制来源。下文以部署机器 IP 为示例；同机 Docker 部署时，优先让两个容器加入同一私有网络并使用容器名访问。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"配置并部署-wrenai-genbi-classic\"\u003e配置并部署 WrenAI GenBI Classic\u003c/h2\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003e历史配置提示\u003c/strong\u003e：以下 \u003ccode\u003e.env\u003c/code\u003e、\u003ccode\u003econfig.yaml\u003c/code\u003e 与启动命令是 2025 年的部署快照，未按 2026 年冻结后的 GenBI Classic 环境重新验证。\u003ccode\u003ereleases/latest\u003c/code\u003e 已可能指向当前主线，不应与下方 0.15.x 配置混用。需要新建旧版环境时，请从 \u003ca href=\"https://github.com/Canner/WrenAI/tree/legacy/v1\"\u003e\u003ccode\u003elegacy/v1\u003c/code\u003e\u003c/a\u003e 获取相互匹配的镜像、Launcher 和配置文件；本文保留原始步骤供维护既有部署时参考。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e旧版 Custom LLM 文档：https://docs.getwren.ai/oss/installation/custom_llm\u003c/p\u003e\n\u003ch3 id=\"创建配置目录\"\u003e创建配置目录\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emkdir -p ~/.wrenai\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"配置-env\"\u003e配置 \u003ccode\u003e.env\u003c/code\u003e\u003c/h3\u003e\n\u003cp\u003e配置目录下新增 \u003ccode\u003e.env\u003c/code\u003e 文件，内容如下：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCOMPOSE_PROJECT_NAME=wrenai\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePLATFORM=linux/amd64\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePROJECT_DIR=/root/.wrenai\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# service port\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eWREN_ENGINE_PORT=8080\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eWREN_ENGINE_SQL_PORT=7432\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eWREN_AI_SERVICE_PORT=5555\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eWREN_UI_PORT=3000\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eIBIS_SERVER_PORT=8000\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eWREN_UI_ENDPOINT=http://wren-ui:${WREN_UI_PORT}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eLLM_PROVIDER=litellm_llm\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# 自定义 LLM 模型\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGENERATION_MODEL=phi4:14b\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eLLM_OLLAMA_URL=http://部署机器IP:11434\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eEMBEDDER_OLLAMA_URL=http://部署机器IP:11434\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eEMBEDDER_PROVIDER=litellm_embedder\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# embedding 模型\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eEMBEDDING_MODEL=nomic-embed-text\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eEMBEDDING_MODEL_DIMENSION=768\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# ai service settings\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eQDRANT_HOST=qdrant\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSHOULD_FORCE_DEPLOY=1\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# vendor keys\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eLLM_OPENAI_API_KEY=\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eEMBEDDER_OPENAI_API_KEY=\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eLLM_AZURE_OPENAI_API_KEY=\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eEMBEDDER_AZURE_OPENAI_API_KEY=\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eQDRANT_API_KEY=\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# version\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# 本文经过验证的 GenBI Classic 历史版本；不要替换为当前主线 WrenAI 版本\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eWREN_PRODUCT_VERSION=0.15.3\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eWREN_ENGINE_VERSION=0.13.1\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eWREN_AI_SERVICE_VERSION=0.15.9\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eIBIS_SERVER_VERSION=0.13.1\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eWREN_UI_VERSION=0.20.1\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eWREN_BOOTSTRAP_VERSION=0.1.5\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# user id (uuid v4)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUSER_UUID=\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# for other services\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePOSTHOG_API_KEY=phc_nhF32aj4xHXOZb0oqr2cn4Oy9uiWzz6CCP4KZmRq9aE\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePOSTHOG_HOST=https://app.posthog.com\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eTELEMETRY_ENABLED=false\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# this is for telemetry to know the model, i think ai-service might be able to provide a endpoint to get the information\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e#GENERATION_MODEL=gpt-4o-mini\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eLANGFUSE_SECRET_KEY=\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eLANGFUSE_PUBLIC_KEY=\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# the port exposes to the host\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# OPTIONAL: change the port if you have a conflict\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHOST_PORT=3000\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAI_SERVICE_FORWARD_PORT=5555\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# Wren UI\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eEXPERIMENTAL_ENGINE_RUST_VERSION=false\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"配置-configyaml\"\u003e配置 \u003ccode\u003econfig.yaml\u003c/code\u003e\u003c/h3\u003e\n\u003cp\u003e配置目录下新增 \u003ccode\u003econfig.yaml\u003c/code\u003e 文件，内容如下：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# you should rename this file to config.yaml and put it in ~/.wrenai\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# please pay attention to the comments starting with # and adjust the config accordingly\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etype: llm\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eprovider: litellm_llm\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etimeout: 600\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emodels:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e- api_base: http://部署机器IP:11434/v1  # change this to your ollama host, api_base should be \u0026lt;ollama_url\u0026gt;/v1\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  model: openai/phi4:14b  # openai/\u0026lt;ollama_model_name\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  kwargs:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    n: 1\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    temperature: 0\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e---\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etype: embedder\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eprovider: litellm_embedder\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emodels:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e- model: openai/nomic-embed-text  # put your ollama embedder model name here\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  api_base: http://部署机器IP:11434/v1  # change this to your ollama host, url should be \u0026lt;ollama_url\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  timeout: 120 # 如果是CPU模式，需要调大这个超时时间\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e---\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etype: engine\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eprovider: wren_ui\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eendpoint: http://wren-ui:3000\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e---\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etype: document_store\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eprovider: qdrant\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003elocation: http://qdrant:6333\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eembedding_model_dim: 768  # put your embedding model dimension here\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etimeout: 120\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003erecreate_index: false\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e---\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# the format of llm and embedder should be \u0026lt;provider\u0026gt;.\u0026lt;model_name\u0026gt; such as litellm_llm.gpt-4o-2024-08-06\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# 此管道配置仅对应 GenBI Classic 0.15.x，不要引用 main 分支的当前主线配置。\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# 0.15.3 历史配置：\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# https://raw.githubusercontent.com/Canner/WrenAI/0.15.3/docker/config.example.yaml\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etype: pipeline\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epipes:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  - name: db_schema_indexing\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    embedder: litellm_embedder.openai/nomic-embed-text\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    document_store: qdrant\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  - name: historical_question_indexing\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    embedder: litellm_embedder.openai/nomic-embed-text\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    document_store: qdrant\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  - name: table_description_indexing\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    embedder: litellm_embedder.openai/nomic-embed-text\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    document_store: qdrant\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  - name: db_schema_retrieval\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    llm: litellm_llm.openai/phi4:14b\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    embedder: litellm_embedder.openai/nomic-embed-text\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    document_store: qdrant\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  - name: historical_question_retrieval\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    embedder: litellm_embedder.openai/nomic-embed-text\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    document_store: qdrant\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  - name: sql_generation\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    llm: litellm_llm.openai/phi4:14b\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    engine: wren_ui\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  - name: sql_correction\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    llm: litellm_llm.openai/phi4:14b\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    engine: wren_ui\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  - name: followup_sql_generation\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    llm: litellm_llm.openai/phi4:14b\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    engine: wren_ui\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  - name: sql_summary\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    llm: litellm_llm.openai/phi4:14b\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  - name: sql_answer\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    llm: litellm_llm.openai/phi4:14b\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    engine: wren_ui\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  - name: sql_breakdown\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    llm: litellm_llm.openai/phi4:14b\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    engine: wren_ui\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  - name: sql_expansion\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    llm: litellm_llm.openai/phi4:14b\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    engine: wren_ui\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  - name: sql_explanation\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    llm: litellm_llm.openai/phi4:14b\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  - name: sql_regeneration\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    llm: litellm_llm.openai/phi4:14b\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    engine: wren_ui\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  - name: semantics_description\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    llm: litellm_llm.openai/phi4:14b\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  - name: relationship_recommendation\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    llm: litellm_llm.openai/phi4:14b\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    engine: wren_ui\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  - name: question_recommendation\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    llm: litellm_llm.openai/phi4:14b\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  - name: question_recommendation_db_schema_retrieval\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    llm: litellm_llm.openai/phi4:14b\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    embedder: litellm_embedder.openai/nomic-embed-text\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    document_store: qdrant\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  - name: question_recommendation_sql_generation\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    llm: litellm_llm.openai/phi4:14b\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    engine: wren_ui\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  - name: chart_generation\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    llm: litellm_llm.openai/phi4:14b\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  - name: chart_adjustment\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    llm: litellm_llm.openai/phi4:14b\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  - name: intent_classification\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    llm: litellm_llm.openai/phi4:14b\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    embedder: litellm_embedder.openai/nomic-embed-text\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    document_store: qdrant\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  - name: data_assistance\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    llm: litellm_llm.openai/phi4:14b\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  - name: sql_pairs_indexing\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    document_store: qdrant\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    embedder: litellm_embedder.openai/nomic-embed-text\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  - name: sql_pairs_deletion\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    document_store: qdrant\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    embedder: litellm_embedder.openai/nomic-embed-text\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  - name: sql_pairs_retrieval\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    document_store: qdrant\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    embedder: litellm_embedder.openai/nomic-embed-text\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    llm: litellm_llm.openai/phi4:14b\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  - name: preprocess_sql_data\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    llm: litellm_llm.openai/phi4:14b\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  - name: sql_executor\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    engine: wren_ui\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  - name: sql_question_generation\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    llm: litellm_llm.openai/phi4:14b\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  - name: sql_generation_reasoning\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    llm: litellm_llm.openai/phi4:14b\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e---\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esettings:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  column_indexing_batch_size: 50\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  table_retrieval_size: 10\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  table_column_retrieval_size: 100\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  allow_using_db_schemas_without_pruning: false\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  query_cache_maxsize: 1000\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  query_cache_ttl: 3600\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  langfuse_host: https://cloud.langfuse.com\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  langfuse_enable: false\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  logging_level: DEBUG\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  development: true\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"启动-wrenai-web-ui\"\u003e启动 WrenAI Web UI\u003c/h3\u003e\n\u003cp\u003e当时通过 WrenAI Launcher 的 Custom 模式完成部署。由于 \u003ccode\u003ereleases/latest\u003c/code\u003e 可能与本文的 0.15.x 配置不匹配，这里不再保留指向最新版 Launcher 的下载命令。需要重建旧环境时，请从 \u003ca href=\"https://github.com/Canner/WrenAI/tree/legacy/v1\"\u003e\u003ccode\u003elegacy/v1\u003c/code\u003e\u003c/a\u003e 和 \u003ca href=\"https://github.com/Canner/WrenAI/releases\"\u003eWrenAI Releases\u003c/a\u003e 中选择与配置相匹配的历史版本。\u003c/p\u003e\n\u003cp\u003e选择Custom模式，点击确定，部署成功。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/wrenai-local-llm-usage-guide/deploy_wrenai.png_320x.avif 320w, https://liudon.com/posts/wrenai-local-llm-usage-guide/deploy_wrenai.png_480x.avif 480w, https://liudon.com/posts/wrenai-local-llm-usage-guide/deploy_wrenai.png_720x.avif 720w, https://liudon.com/posts/wrenai-local-llm-usage-guide/deploy_wrenai.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/wrenai-local-llm-usage-guide/deploy_wrenai.png_320x.webp 320w, https://liudon.com/posts/wrenai-local-llm-usage-guide/deploy_wrenai.png_480x.webp 480w, https://liudon.com/posts/wrenai-local-llm-usage-guide/deploy_wrenai.png_720x.webp 720w, https://liudon.com/posts/wrenai-local-llm-usage-guide/deploy_wrenai.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/wrenai-local-llm-usage-guide/deploy_wrenai.png\" alt=\"WrenAI Launcher Custom 模式部署成功\"\n         width=\"1080\" height=\"544\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e如需从其他机器访问 Web UI，仅对可信来源放通 3000 端口；不要公开暴露管理界面。\u003c/p\u003e\n\u003cp\u003e部署完成后，通过浏览器访问 \u003ccode\u003ehttp://部署机器IP:3000\u003c/code\u003e 使用 WrenAI 服务。\u003c/p\u003e\n\u003ch2 id=\"当时的环境记录与限制\"\u003e当时的环境记录与限制\u003c/h2\u003e\n\u003cp\u003e以下内容是 2025 年该部署环境的记录，不代表当前 WrenAI CLI/Context Engine 的能力或限制：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e本文原始记录为“MySQL 仅支持 8.0 以上版本”，该限制仅对应当时的 GenBI Classic 版本。\u003c/li\u003e\n\u003cli\u003e纯 CPU 环境单次提问耗时超过 15 分钟；腾讯云 GPU 计算型 GN7（8 核、32 GB）约为 5 分钟。实际耗时受模型、显存、数据库结构和问题复杂度影响。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"当前主线wren-cli--ai-agent\"\u003e当前主线：Wren CLI + AI Agent\u003c/h2\u003e\n\u003cp\u003e如果目标是新部署，建议安装当前 \u003ccode\u003ewrenai\u003c/code\u003e Python 包，并让 Codex、Claude Code、Cursor 等 Agent 通过 Wren CLI 或 MCP 服务使用 MDL、Context 和 Memory：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epip install \u003cspan class=\"s2\"\u003e\u0026#34;wrenai[memory,main]\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ewren version\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003enpx skills add Canner/WrenAI\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e完整步骤请参阅 \u003ca href=\"https://github.com/Canner/WrenAI/blob/main/docs/core/get_started/quickstart.md\"\u003eWrenAI 当前 Quickstart\u003c/a\u003e。\u003c/p\u003e\n","date_published":"2025-03-16T17:28:10+08:00","tags":["wrenAI","llm","docker","ollama"]},{"title":"天津一日游","id":"https://liudon.com/posts/the-trip-of-tianjin/","url":"https://liudon.com/posts/the-trip-of-tianjin/","summary":"\u003cp\u003e娃看完中华寻宝记，一直想去天津转转。\u003c/p\u003e\n\u003cp\u003e大年初九，返京第二天，带娃错峰去一趟天津。\u003c/p\u003e\n\u003cp\u003e7点出门，直奔北京南站，一路不敢耽搁，在发车前10分钟赶上了车。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-trip-of-tianjin/IMG_0328.PNG_320x.avif 320w, https://liudon.com/posts/the-trip-of-tianjin/IMG_0328.PNG_480x.avif 480w, https://liudon.com/posts/the-trip-of-tianjin/IMG_0328.PNG_720x.avif 720w, https://liudon.com/posts/the-trip-of-tianjin/IMG_0328.PNG_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-trip-of-tianjin/IMG_0328.PNG_320x.webp 320w, https://liudon.com/posts/the-trip-of-tianjin/IMG_0328.PNG_480x.webp 480w, https://liudon.com/posts/the-trip-of-tianjin/IMG_0328.PNG_720x.webp 720w, https://liudon.com/posts/the-trip-of-tianjin/IMG_0328.PNG_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-trip-of-tianjin/IMG_0328.PNG\" alt=\"\"\n         width=\"1080\" height=\"2341\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e","content_html":"\u003cp\u003e娃看完中华寻宝记，一直想去天津转转。\u003c/p\u003e\n\u003cp\u003e大年初九，返京第二天，带娃错峰去一趟天津。\u003c/p\u003e\n\u003cp\u003e7点出门，直奔北京南站，一路不敢耽搁，在发车前10分钟赶上了车。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-trip-of-tianjin/IMG_0328.PNG_320x.avif 320w, https://liudon.com/posts/the-trip-of-tianjin/IMG_0328.PNG_480x.avif 480w, https://liudon.com/posts/the-trip-of-tianjin/IMG_0328.PNG_720x.avif 720w, https://liudon.com/posts/the-trip-of-tianjin/IMG_0328.PNG_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-trip-of-tianjin/IMG_0328.PNG_320x.webp 320w, https://liudon.com/posts/the-trip-of-tianjin/IMG_0328.PNG_480x.webp 480w, https://liudon.com/posts/the-trip-of-tianjin/IMG_0328.PNG_720x.webp 720w, https://liudon.com/posts/the-trip-of-tianjin/IMG_0328.PNG_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-trip-of-tianjin/IMG_0328.PNG\" alt=\"\"\n         width=\"1080\" height=\"2341\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e以前一直听我爸说老家的河最终流到了海河，在路上看地图，发现确实最终汇入了海河。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-trip-of-tianjin/WechatIMG128.jpg_320x.avif 320w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG128.jpg_480x.avif 480w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG128.jpg_720x.avif 720w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG128.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-trip-of-tianjin/WechatIMG128.jpg_320x.webp 320w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG128.jpg_480x.webp 480w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG128.jpg_720x.webp 720w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG128.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-trip-of-tianjin/WechatIMG128.jpg\" alt=\"\"\n         width=\"1080\" height=\"1441\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-trip-of-tianjin/WechatIMG129.jpg_320x.avif 320w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG129.jpg_480x.avif 480w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG129.jpg_720x.avif 720w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG129.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-trip-of-tianjin/WechatIMG129.jpg_320x.webp 320w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG129.jpg_480x.webp 480w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG129.jpg_720x.webp 720w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG129.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-trip-of-tianjin/WechatIMG129.jpg\" alt=\"\"\n         width=\"1080\" height=\"1441\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-trip-of-tianjin/WechatIMG130.jpg_320x.avif 320w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG130.jpg_480x.avif 480w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG130.jpg_720x.avif 720w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG130.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-trip-of-tianjin/WechatIMG130.jpg_320x.webp 320w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG130.jpg_480x.webp 480w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG130.jpg_720x.webp 720w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG130.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-trip-of-tianjin/WechatIMG130.jpg\" alt=\"\"\n         width=\"1080\" height=\"1441\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-trip-of-tianjin/WechatIMG131.jpg_320x.avif 320w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG131.jpg_480x.avif 480w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG131.jpg_720x.avif 720w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG131.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-trip-of-tianjin/WechatIMG131.jpg_320x.webp 320w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG131.jpg_480x.webp 480w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG131.jpg_720x.webp 720w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG131.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-trip-of-tianjin/WechatIMG131.jpg\" alt=\"\"\n         width=\"1080\" height=\"1441\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-trip-of-tianjin/WechatIMG151.jpg_320x.avif 320w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG151.jpg_480x.avif 480w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG151.jpg_720x.avif 720w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG151.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-trip-of-tianjin/WechatIMG151.jpg_320x.webp 320w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG151.jpg_480x.webp 480w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG151.jpg_720x.webp 720w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG151.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-trip-of-tianjin/WechatIMG151.jpg\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-trip-of-tianjin/WechatIMG150.jpg_320x.avif 320w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG150.jpg_480x.avif 480w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG150.jpg_720x.avif 720w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG150.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-trip-of-tianjin/WechatIMG150.jpg_320x.webp 320w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG150.jpg_480x.webp 480w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG150.jpg_720x.webp 720w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG150.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-trip-of-tianjin/WechatIMG150.jpg\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e世纪钟，本以为整点会报时来着，等了半天结果不是。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-trip-of-tianjin/WechatIMG132.jpg_320x.avif 320w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG132.jpg_480x.avif 480w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG132.jpg_720x.avif 720w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG132.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-trip-of-tianjin/WechatIMG132.jpg_320x.webp 320w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG132.jpg_480x.webp 480w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG132.jpg_720x.webp 720w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG132.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-trip-of-tianjin/WechatIMG132.jpg\" alt=\"\"\n         width=\"1080\" height=\"1441\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e上午在意式风情区转了转，结果就是一些卖吃的、纪念品的地方，网红书店打卡。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-trip-of-tianjin/WechatIMG133.jpg_320x.avif 320w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG133.jpg_480x.avif 480w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG133.jpg_720x.avif 720w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG133.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-trip-of-tianjin/WechatIMG133.jpg_320x.webp 320w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG133.jpg_480x.webp 480w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG133.jpg_720x.webp 720w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG133.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-trip-of-tianjin/WechatIMG133.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e路上遇到的小蓝车，居然是带后座的，可惜娃太大坐不下了。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-trip-of-tianjin/WechatIMG134.jpg_320x.avif 320w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG134.jpg_480x.avif 480w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG134.jpg_720x.avif 720w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG134.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-trip-of-tianjin/WechatIMG134.jpg_320x.webp 320w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG134.jpg_480x.webp 480w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG134.jpg_720x.webp 720w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG134.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-trip-of-tianjin/WechatIMG134.jpg\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e桂发祥总店里的大麻花。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-trip-of-tianjin/WechatIMG135.jpg_320x.avif 320w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG135.jpg_480x.avif 480w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG135.jpg_720x.avif 720w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG135.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-trip-of-tianjin/WechatIMG135.jpg_320x.webp 320w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG135.jpg_480x.webp 480w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG135.jpg_720x.webp 720w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG135.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-trip-of-tianjin/WechatIMG135.jpg\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e耳朵眼炸糕，来一个就行，多了吃不下。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-trip-of-tianjin/WechatIMG136.jpg_320x.avif 320w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG136.jpg_480x.avif 480w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG136.jpg_720x.avif 720w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG136.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-trip-of-tianjin/WechatIMG136.jpg_320x.webp 320w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG136.jpg_480x.webp 480w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG136.jpg_720x.webp 720w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG136.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-trip-of-tianjin/WechatIMG136.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e中午简单吃个饭，转站五大道，先去听个相声。\u003c/p\u003e\n\u003cp\u003e路过瓷房子，外面简单看一眼就好。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-trip-of-tianjin/WechatIMG140.jpg_320x.avif 320w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG140.jpg_480x.avif 480w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG140.jpg_720x.avif 720w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG140.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-trip-of-tianjin/WechatIMG140.jpg_320x.webp 320w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG140.jpg_480x.webp 480w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG140.jpg_720x.webp 720w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG140.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-trip-of-tianjin/WechatIMG140.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e名流茶馆，特别小的一个门脸。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-trip-of-tianjin/WechatIMG137.jpg_320x.avif 320w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG137.jpg_480x.avif 480w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG137.jpg_720x.avif 720w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG137.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-trip-of-tianjin/WechatIMG137.jpg_320x.webp 320w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG137.jpg_480x.webp 480w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG137.jpg_720x.webp 720w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG137.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-trip-of-tianjin/WechatIMG137.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e上一次现场听相声，还是在北京，那会岳云鹏还没火。\u003c/p\u003e\n\u003cp\u003e2个小时，物超所值，这次天津行最值的一个地方了。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-trip-of-tianjin/WechatIMG138.jpg_320x.avif 320w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG138.jpg_480x.avif 480w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG138.jpg_720x.avif 720w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG138.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-trip-of-tianjin/WechatIMG138.jpg_320x.webp 320w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG138.jpg_480x.webp 480w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG138.jpg_720x.webp 720w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG138.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-trip-of-tianjin/WechatIMG138.jpg\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-trip-of-tianjin/WechatIMG139.jpg_320x.avif 320w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG139.jpg_480x.avif 480w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG139.jpg_720x.avif 720w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG139.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-trip-of-tianjin/WechatIMG139.jpg_320x.webp 320w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG139.jpg_480x.webp 480w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG139.jpg_720x.webp 720w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG139.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-trip-of-tianjin/WechatIMG139.jpg\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e听完出来，外面已经变天，风巨大，特别的冷。\u003c/p\u003e\n\u003cp\u003e简单转了转，直奔古文化街，看摩天轮。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-trip-of-tianjin/WechatIMG141.jpg_320x.avif 320w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG141.jpg_480x.avif 480w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG141.jpg_720x.avif 720w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG141.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-trip-of-tianjin/WechatIMG141.jpg_320x.webp 320w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG141.jpg_480x.webp 480w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG141.jpg_720x.webp 720w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG141.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-trip-of-tianjin/WechatIMG141.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-trip-of-tianjin/WechatIMG142.jpg_320x.avif 320w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG142.jpg_480x.avif 480w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG142.jpg_720x.avif 720w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG142.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-trip-of-tianjin/WechatIMG142.jpg_320x.webp 320w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG142.jpg_480x.webp 480w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG142.jpg_720x.webp 720w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG142.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-trip-of-tianjin/WechatIMG142.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-trip-of-tianjin/WechatIMG143.jpg_320x.avif 320w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG143.jpg_480x.avif 480w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG143.jpg_720x.avif 720w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG143.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-trip-of-tianjin/WechatIMG143.jpg_320x.webp 320w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG143.jpg_480x.webp 480w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG143.jpg_720x.webp 720w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG143.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-trip-of-tianjin/WechatIMG143.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e晚上吃过饭，外面实在是太冷了，风超级大。\u003c/p\u003e\n\u003cp\u003e摩天轮没有开，远远的打个卡。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-trip-of-tianjin/WechatIMG146.jpg_320x.avif 320w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG146.jpg_480x.avif 480w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG146.jpg_720x.avif 720w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG146.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-trip-of-tianjin/WechatIMG146.jpg_320x.webp 320w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG146.jpg_480x.webp 480w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG146.jpg_720x.webp 720w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG146.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-trip-of-tianjin/WechatIMG146.jpg\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-trip-of-tianjin/WechatIMG148.jpg_320x.avif 320w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG148.jpg_480x.avif 480w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG148.jpg_720x.avif 720w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG148.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-trip-of-tianjin/WechatIMG148.jpg_320x.webp 320w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG148.jpg_480x.webp 480w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG148.jpg_720x.webp 720w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG148.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-trip-of-tianjin/WechatIMG148.jpg\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-trip-of-tianjin/WechatIMG147.jpg_320x.avif 320w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG147.jpg_480x.avif 480w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG147.jpg_720x.avif 720w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG147.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-trip-of-tianjin/WechatIMG147.jpg_320x.webp 320w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG147.jpg_480x.webp 480w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG147.jpg_720x.webp 720w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG147.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-trip-of-tianjin/WechatIMG147.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e返程，又是开车前10分钟上车。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-trip-of-tianjin/WechatIMG149.jpg_320x.avif 320w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG149.jpg_480x.avif 480w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG149.jpg_720x.avif 720w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG149.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-trip-of-tianjin/WechatIMG149.jpg_320x.webp 320w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG149.jpg_480x.webp 480w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG149.jpg_720x.webp 720w, https://liudon.com/posts/the-trip-of-tianjin/WechatIMG149.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-trip-of-tianjin/WechatIMG149.jpg\" alt=\"\"\n         width=\"1080\" height=\"2341\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n","date_published":"2025-03-16T16:35:23+08:00","tags":["旅行"]},{"title":"2024年终总结","id":"https://liudon.com/posts/review-2024/","url":"https://liudon.com/posts/review-2024/","summary":"\u003cblockquote\u003e\n\u003cp\u003e2024年已经过去3个月了，这篇年终总结从元旦拖到了现在。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e2024年是我的本命年，这一年发生了很多事，这一年过的并不太如意。\u003c/p\u003e\n\u003cp\u003e早就想要总结这一年，但不知道从哪下笔。\u003c/p\u003e","content_html":"\u003cblockquote\u003e\n\u003cp\u003e2024年已经过去3个月了，这篇年终总结从元旦拖到了现在。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e2024年是我的本命年，这一年发生了很多事，这一年过的并不太如意。\u003c/p\u003e\n\u003cp\u003e早就想要总结这一年，但不知道从哪下笔。\u003c/p\u003e\n\u003ch3 id=\"工作\"\u003e工作\u003c/h3\u003e\n\u003cp\u003e今年的工作愈发忙碌，统计了一下这一年9点半下班打车85次。\u003c/p\u003e\n\u003cp\u003e工作的时间越来越长，持续的加班让整个人变得疲惫、易怒。\u003c/p\u003e\n\u003cp\u003e到公司基本一坐就是一天，没时间活动，尝试了两个月骑行上下班。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/review-2024/IMG_0608.PNG_320x.avif 320w, https://liudon.com/posts/review-2024/IMG_0608.PNG_480x.avif 480w, https://liudon.com/posts/review-2024/IMG_0608.PNG_720x.avif 720w, https://liudon.com/posts/review-2024/IMG_0608.PNG_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/review-2024/IMG_0608.PNG_320x.webp 320w, https://liudon.com/posts/review-2024/IMG_0608.PNG_480x.webp 480w, https://liudon.com/posts/review-2024/IMG_0608.PNG_720x.webp 720w, https://liudon.com/posts/review-2024/IMG_0608.PNG_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/review-2024/IMG_0608.PNG\" alt=\"2024年运动\"\n         width=\"1080\" height=\"2341\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003ch3 id=\"生活\"\u003e生活\u003c/h3\u003e\n\u003cp\u003e因为一些事情，跟媳妇闹得一度想要离婚。\u003c/p\u003e\n\u003cp\u003e好在聊开了，也让我懂得有事一定要沟通，不要憋在心里。\u003c/p\u003e\n\u003cp\u003e上一次带娃出行是18年了，趁着暑假带娃出去走走。\u003c/p\u003e\n\u003cp\u003e我们全家去了一趟\u003ca href=\"https://liudon.com/posts/the-trip-of-qingdao/\"\u003e青岛\u003c/a\u003e，虽然时间很短，但是娃玩的很开心。\u003c/p\u003e\n\u003cp\u003e十一的时候，带娃爬了一次\u003ca href=\"https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/\"\u003e长城\u003c/a\u003e，我俩也算“好汉”了。\u003c/p\u003e\n\u003cp\u003e尝试了一次\u003ca href=\"https://liudon.com/posts/changping-42km-greenway-cycling/\"\u003e绿道骑行\u003c/a\u003e，路况不好，不建议走。\u003c/p\u003e\n\u003cp\u003e车技一般，还是容易起步熄火，不过媳妇说开的越来越好了，也敢一个人上路了。\u003c/p\u003e\n\u003ch3 id=\"博客\"\u003e博客\u003c/h3\u003e\n\u003cp\u003e今年可以用笔耕不辍来形容，全年一共更新了23篇内容，共计18w字。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/review-2024/20250310-202737.png_320x.avif 320w, https://liudon.com/posts/review-2024/20250310-202737.png_480x.avif 480w, https://liudon.com/posts/review-2024/20250310-202737.png_720x.avif 720w, https://liudon.com/posts/review-2024/20250310-202737.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/review-2024/20250310-202737.png_320x.webp 320w, https://liudon.com/posts/review-2024/20250310-202737.png_480x.webp 480w, https://liudon.com/posts/review-2024/20250310-202737.png_720x.webp 720w, https://liudon.com/posts/review-2024/20250310-202737.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/review-2024/20250310-202737.png\" alt=\"全年访问趋势\"\n         width=\"1080\" height=\"632\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e访问Top3的文章：\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://liudon.com/posts/%E5%8A%A0%E9%80%9Fcloudflare%E8%AE%BF%E9%97%AE/\"\u003e加速Cloudflare访问\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://liudon.com/posts/hi-follow/\"\u003e你好 Follow\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://liudon.com/posts/replacing-cloudflare-ipfs-gateway-with-self-hosted-gateway/\"\u003e搭建自托管IPFS Gateway服务，替代Cloudflare的IPFS Gateway\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e今年搞定了新站的Google Adsense申请，蚂蚁肉也是肉。\u003c/p\u003e\n\u003ch3 id=\"财务\"\u003e财务\u003c/h3\u003e\n\u003cp\u003e今年把商贷还清了。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/review-2024/IMG_7591.PNG_320x.avif 320w, https://liudon.com/posts/review-2024/IMG_7591.PNG_480x.avif 480w, https://liudon.com/posts/review-2024/IMG_7591.PNG_720x.avif 720w, https://liudon.com/posts/review-2024/IMG_7591.PNG_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/review-2024/IMG_7591.PNG_320x.webp 320w, https://liudon.com/posts/review-2024/IMG_7591.PNG_480x.webp 480w, https://liudon.com/posts/review-2024/IMG_7591.PNG_720x.webp 720w, https://liudon.com/posts/review-2024/IMG_7591.PNG_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/review-2024/IMG_7591.PNG\" alt=\"\"\n         width=\"1080\" height=\"2341\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e股市收益+24%，重仓NVDA，悲剧的是开年获利已经全部回吐了。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/review-2024/IMG_0611.PNG_320x.avif 320w, https://liudon.com/posts/review-2024/IMG_0611.PNG_480x.avif 480w, https://liudon.com/posts/review-2024/IMG_0611.PNG_720x.avif 720w, https://liudon.com/posts/review-2024/IMG_0611.PNG_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/review-2024/IMG_0611.PNG_320x.webp 320w, https://liudon.com/posts/review-2024/IMG_0611.PNG_480x.webp 480w, https://liudon.com/posts/review-2024/IMG_0611.PNG_720x.webp 720w, https://liudon.com/posts/review-2024/IMG_0611.PNG_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/review-2024/IMG_0611.PNG\" alt=\"\"\n         width=\"1080\" height=\"1299\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e新的一年，继续加油！\u003c/p\u003e\n","date_published":"2025-03-07T22:23:14+08:00","tags":["年终总结"]},{"title":"停止使用staticfile.org服务","id":"https://liudon.com/posts/remove-staticfile.org-from-your-website/","url":"https://liudon.com/posts/remove-staticfile.org-from-your-website/","summary":"\u003cp\u003e昨天像往常一样打开博客，发现评论没有加载出来。\u003c/p\u003e\n\u003cp\u003e一开始以为是手机网络问题，用电脑复现了一下，发现twikoo的js访问报错了。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/remove-staticfile.org-from-your-website/20241016-175127.png_320x.avif 320w, https://liudon.com/posts/remove-staticfile.org-from-your-website/20241016-175127.png_480x.avif 480w, https://liudon.com/posts/remove-staticfile.org-from-your-website/20241016-175127.png_720x.avif 720w, https://liudon.com/posts/remove-staticfile.org-from-your-website/20241016-175127.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/remove-staticfile.org-from-your-website/20241016-175127.png_320x.webp 320w, https://liudon.com/posts/remove-staticfile.org-from-your-website/20241016-175127.png_480x.webp 480w, https://liudon.com/posts/remove-staticfile.org-from-your-website/20241016-175127.png_720x.webp 720w, https://liudon.com/posts/remove-staticfile.org-from-your-website/20241016-175127.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/remove-staticfile.org-from-your-website/20241016-175127.png\" alt=\"\"\n         width=\"1080\" height=\"207\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e","content_html":"\u003cp\u003e昨天像往常一样打开博客，发现评论没有加载出来。\u003c/p\u003e\n\u003cp\u003e一开始以为是手机网络问题，用电脑复现了一下，发现twikoo的js访问报错了。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/remove-staticfile.org-from-your-website/20241016-175127.png_320x.avif 320w, https://liudon.com/posts/remove-staticfile.org-from-your-website/20241016-175127.png_480x.avif 480w, https://liudon.com/posts/remove-staticfile.org-from-your-website/20241016-175127.png_720x.avif 720w, https://liudon.com/posts/remove-staticfile.org-from-your-website/20241016-175127.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/remove-staticfile.org-from-your-website/20241016-175127.png_320x.webp 320w, https://liudon.com/posts/remove-staticfile.org-from-your-website/20241016-175127.png_480x.webp 480w, https://liudon.com/posts/remove-staticfile.org-from-your-website/20241016-175127.png_720x.webp 720w, https://liudon.com/posts/remove-staticfile.org-from-your-website/20241016-175127.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/remove-staticfile.org-from-your-website/20241016-175127.png\" alt=\"\"\n         width=\"1080\" height=\"207\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003estaticfile.org是一个公共的前端cdn，怎么证书有问题了呢？\u003c/p\u003e\n\u003cp\u003e搜索了一下，结果找到这么一篇内容：\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e和 WDCP 、LNMP 、OneinStack 一样，这次的 Staticfile 、BootCDN 、Polyfill 事件也是背后指向同一个组织[[1]]。更进一步的研究表明这些组织似乎会恶意攻击其他提供类似服务的供应商，同时采取接触洽谈来并入攻击目标。 在这种做法下，曾经由七牛云提供服务的Staticfile.org被易手，而原先由个人提供服务、由又拍云提供接入服务的BootCSS也同样被易手。 但是这些背后的交易在事件发生前却没有人进行公开，也许是原来的提供者厌倦了日复一日付出却看不到回报的生活，也许是这些组织瞒天过海许下了虚假的承诺，让原本积累了大量用户的基础服务成为了这些组织用来攻击用户们的利刃。\u003c/p\u003e\n\u003cp\u003e详细内容见\u003ca href=\"https://www.v2ex.com/t/1056428\"\u003e供应链投毒后，我们的选择还剩下哪些？\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003estaticfile.org目前已不再由七牛负责维护，而是一个叫河南泉磐网络科技有限公司负责，该服务已不可靠，存在黑产利用的情况。\u003c/p\u003e\n\u003cp\u003e更换为cdnjs.cloudflare.com服务后，评论功能恢复正常。\u003c/p\u003e\n","date_published":"2024-10-17T22:34:29+08:00","tags":[]},{"title":"使用 ImageMagick 自动添加水印，保护图片版权","id":"https://liudon.com/posts/auto-add-watermark-imagemagick-protect-copyright/","url":"https://liudon.com/posts/auto-add-watermark-imagemagick-protect-copyright/","summary":"\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003e细心的朋友可能会发现，我的博客图片都带上了水印。\u003c/p\u003e\n\u003cp\u003e经过\u003ca href=\"https://liudon.com/posts/blog-malicious-mirroring/\"\u003e博客被恶意镜像\u003c/a\u003e这个事情后，我一直在思考如何防止内容被恶意盗用，尤其是博客里的一些图片。\u003c/p\u003e\n\u003cp\u003e在\u003ca href=\"https://liudon.com/posts/use-avif-to-optimize-images-on-hugo/\"\u003e当Hugo遇上AVIF，优化图片加载\u003c/a\u003e这篇文章里，使用了ImageMagick工具做了图片压缩。\u003c/p\u003e\n\u003cp\u003e当时文章最后说留了个坑，其实就是今天的这篇内容，利用ImageMagick自动给图片添加水印。\u003c/p\u003e","content_html":"\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003e细心的朋友可能会发现，我的博客图片都带上了水印。\u003c/p\u003e\n\u003cp\u003e经过\u003ca href=\"https://liudon.com/posts/blog-malicious-mirroring/\"\u003e博客被恶意镜像\u003c/a\u003e这个事情后，我一直在思考如何防止内容被恶意盗用，尤其是博客里的一些图片。\u003c/p\u003e\n\u003cp\u003e在\u003ca href=\"https://liudon.com/posts/use-avif-to-optimize-images-on-hugo/\"\u003e当Hugo遇上AVIF，优化图片加载\u003c/a\u003e这篇文章里，使用了ImageMagick工具做了图片压缩。\u003c/p\u003e\n\u003cp\u003e当时文章最后说留了个坑，其实就是今天的这篇内容，利用ImageMagick自动给图片添加水印。\u003c/p\u003e\n\u003ch2 id=\"实现\"\u003e实现\u003c/h2\u003e\n\u003cp\u003e思路其实和之前图片压缩一样，还是在Github Action里使用ImageMagick工具进行添加水印操作，不依赖第三方云服务。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/Liudon/liudon.github.io/blob/code/.github/workflows/main.yml\"\u003eworkflow代码\u003c/a\u003e：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eCompress\u003c/span\u003e \u003cspan class=\"ne\"\u003eImage\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# 安装依赖\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003esudo\u003c/span\u003e \u003cspan class=\"n\"\u003eapt\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eget\u003c/span\u003e \u003cspan class=\"n\"\u003eupdate\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003esudo\u003c/span\u003e \u003cspan class=\"n\"\u003eapt\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eget\u003c/span\u003e \u003cspan class=\"n\"\u003einstall\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ey\u003c/span\u003e \u003cspan class=\"n\"\u003ebuild\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eessential\u003c/span\u003e \u003cspan class=\"n\"\u003elibx11\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003edev\u003c/span\u003e \u003cspan class=\"n\"\u003elibxext\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003edev\u003c/span\u003e \u003cspan class=\"n\"\u003ezlib1g\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003edev\u003c/span\u003e \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003elibpng\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003edev\u003c/span\u003e \u003cspan class=\"n\"\u003elibjpeg\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003edev\u003c/span\u003e \u003cspan class=\"n\"\u003elibfreetype6\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003edev\u003c/span\u003e \u003cspan class=\"n\"\u003elibxml2\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003edev\u003c/span\u003e \u003cspan class=\"n\"\u003eliblcms2\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003edev\u003c/span\u003e \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003elibopenexr\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003edev\u003c/span\u003e \u003cspan class=\"n\"\u003elibtiff\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003edev\u003c/span\u003e \u003cspan class=\"n\"\u003elibraw\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003edev\u003c/span\u003e \u003cspan class=\"n\"\u003elibheif\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003edev\u003c/span\u003e \u003cspan class=\"n\"\u003elibde265\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003edev\u003c/span\u003e \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003elibfftw3\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003edev\u003c/span\u003e \u003cspan class=\"n\"\u003elibglib2\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003edev\u003c/span\u003e \u003cspan class=\"n\"\u003elibwebp\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003edev\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# 编译ImageMagick\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003ewget\u003c/span\u003e \u003cspan class=\"n\"\u003ehttps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e//\u003c/span\u003e\u003cspan class=\"n\"\u003edownload\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eimagemagick\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eorg\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eImageMagick\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003edownload\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eImageMagick\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003etar\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003egz\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003etar\u003c/span\u003e \u003cspan class=\"n\"\u003exvzf\u003c/span\u003e \u003cspan class=\"n\"\u003eImageMagick\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003etar\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003egz\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003ecd\u003c/span\u003e \u003cspan class=\"n\"\u003eImageMagick\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mf\"\u003e7.\u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e./\u003c/span\u003e\u003cspan class=\"n\"\u003econfigure\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003emake\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003esudo\u003c/span\u003e \u003cspan class=\"n\"\u003emake\u003c/span\u003e \u003cspan class=\"n\"\u003einstall\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003esudo\u003c/span\u003e \u003cspan class=\"n\"\u003eldconfig\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eusr\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003elocal\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003elib\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003emagick\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003eversion\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003ecd\u003c/span\u003e \u003cspan class=\"o\"\u003e../\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# 将原图转换大小，同时添加文本水印\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003efind\u003c/span\u003e \u003cspan class=\"o\"\u003e./\u003c/span\u003e\u003cspan class=\"n\"\u003econtent\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eposts\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003etype\u003c/span\u003e \u003cspan class=\"n\"\u003ef\u003c/span\u003e \\\u003cspan class=\"p\"\u003e(\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ename\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;*.jpg\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eo\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ename\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;*.png\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eo\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ename\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;*.jpeg\u0026#34;\u003c/span\u003e \\\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eexec\u003c/span\u003e \u003cspan class=\"n\"\u003emagick\u003c/span\u003e \u003cspan class=\"p\"\u003e{}\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003epointsize\u003c/span\u003e \u003cspan class=\"mi\"\u003e48\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003efill\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;#909090\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003efont\u003c/span\u003e \u003cspan class=\"o\"\u003e./\u003c/span\u003e\u003cspan class=\"k\"\u003estatic\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eArchitectsDaughter\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eRegular\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ettf\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003egravity\u003c/span\u003e \u003cspan class=\"n\"\u003esouth\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eannotate\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"o\"\u003e+\u003c/span\u003e\u003cspan class=\"mi\"\u003e20\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;@liudon\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003ehttps://liudon.com\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eresize\u003c/span\u003e \u003cspan class=\"mi\"\u003e1080\u003c/span\u003e\u003cspan class=\"n\"\u003ex\u003c/span\u003e\\\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"p\"\u003e{}\u003c/span\u003e \\\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# 将处理后的原图生成webp格式文件\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003efind\u003c/span\u003e \u003cspan class=\"o\"\u003e./\u003c/span\u003e\u003cspan class=\"n\"\u003econtent\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eposts\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003etype\u003c/span\u003e \u003cspan class=\"n\"\u003ef\u003c/span\u003e \\\u003cspan class=\"p\"\u003e(\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ename\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;*.jpg\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eo\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ename\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;*.png\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eo\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ename\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;*.jpeg\u0026#34;\u003c/span\u003e \\\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eexec\u003c/span\u003e \u003cspan class=\"n\"\u003emagick\u003c/span\u003e \u003cspan class=\"p\"\u003e{}\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003equality\u003c/span\u003e \u003cspan class=\"mi\"\u003e75\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003edefine\u003c/span\u003e \u003cspan class=\"n\"\u003ewebp\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"n\"\u003eimage\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ehint\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003ephoto\u003c/span\u003e \u003cspan class=\"p\"\u003e{}\u003c/span\u003e\u003cspan class=\"n\"\u003e_1080x\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ewebp\u003c/span\u003e \\\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# 将处理后的原图生成avif格式文件\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003efind\u003c/span\u003e \u003cspan class=\"o\"\u003e./\u003c/span\u003e\u003cspan class=\"n\"\u003econtent\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eposts\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003etype\u003c/span\u003e \u003cspan class=\"n\"\u003ef\u003c/span\u003e \\\u003cspan class=\"p\"\u003e(\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ename\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;*.jpg\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eo\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ename\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;*.png\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eo\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ename\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;*.jpeg\u0026#34;\u003c/span\u003e \\\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eexec\u003c/span\u003e \u003cspan class=\"n\"\u003emagick\u003c/span\u003e \u003cspan class=\"p\"\u003e{}\u003c/span\u003e \u003cspan class=\"p\"\u003e{}\u003c/span\u003e\u003cspan class=\"n\"\u003e_1080x\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eavif\u003c/span\u003e \\\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e先将原图进行大小转换，同时添加文本水印：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e-fill #909090 代表水印颜色\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e-pointsize 48 代表水印文字大小\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e-font ./static/ArchitectsDaughter-Regular.ttf 代表水印字体，我使用了ArchitectsDaughter字体，提前下载到了git仓库\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e@liudon\\nhttps://liudon.com 代表文本水印内容，\\n表示换行\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e-gravity south 水印位置，九宫格位置\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e-annotate +0+20 水印偏移\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003ca href=\"https://fonts.google.com/specimen/Architects+Daughter\"\u003e水印字体文件下载\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e将处理后的原图生成webp和avif格式文件\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cem\u003e注意，通过\u003ccode\u003esudo apt-get install -y imagemagick libheif-dev\u003c/code\u003e安装的ImageMagick版本是6.x，转换过程会有些问题，所以这里改为了通过源码编译最新7.x版本，编译的时间略久一些。\u003c/em\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eVersion: ImageMagick 7.1.1-39 Q16-HDRI x86_64 22428 https://imagemagick.org\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCopyright: (C) 1999 ImageMagick Studio LLC\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eLicense: https://imagemagick.org/script/license.php\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eFeatures: Cipher DPC HDRI OpenMP(4.5) \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eDelegates (built-in): bzlib djvu fontconfig freetype heic jbig jng jp2 jpeg lcms lqr lzma openexr png raw tiff webp x xml zlib zstd\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCompiler: gcc (11.4)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e好了，这样后续提交Github后，Workflow就会自动利用ImageMagick帮我们处理图片了。\u003c/p\u003e\n","date_published":"2024-10-12T23:32:31+08:00","tags":["imagemagick","github","版权"]},{"title":"如何注册一个.sol域名","id":"https://liudon.com/posts/how-to-register-a-.sol-domain-name/","url":"https://liudon.com/posts/how-to-register-a-.sol-domain-name/","summary":"\u003cp\u003eLivid大佬新搞了个\u003ca href=\"https://www.v2ex.com/t/1078126\"\u003e支持Solana的IPFS/IPNS网关\u003c/a\u003e，了解到还有一个\u003ccode\u003e.sol\u003c/code\u003e的web3域名。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eSolana域名服务（SNS）的目标是提供一种去中心化且可负担的方式，将域名（.sol）和链上数据连接起来。这些链上数据可以是SOL地址、 IPFS CID、图片、文本、或者任何其它的东西。\u003c/p\u003e","content_html":"\u003cp\u003eLivid大佬新搞了个\u003ca href=\"https://www.v2ex.com/t/1078126\"\u003e支持Solana的IPFS/IPNS网关\u003c/a\u003e，了解到还有一个\u003ccode\u003e.sol\u003c/code\u003e的web3域名。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eSolana域名服务（SNS）的目标是提供一种去中心化且可负担的方式，将域名（.sol）和链上数据连接起来。这些链上数据可以是SOL地址、 IPFS CID、图片、文本、或者任何其它的东西。\u003c/p\u003e\n\u003cp\u003eThe mechanics of purchasing a .sol domain are a bit different than ENS — they don’t expire and most domain sales are run via auction.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://brandsec.com.au/sol-domains/\"\u003ehttps://brandsec.com.au/sol-domains/\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e哇塞，这域名没有过期一说，不需要续费。\u003c/p\u003e\n\u003cp\u003e正好\u003ccode\u003eliudon.sol\u003c/code\u003e还未注册，决定入手。\u003c/p\u003e\n\u003cp\u003e用MetaMask试了下，连接钱包的时候没有反应，问了下Livid，说是得用Phantom。\u003c/p\u003e\n\u003cp\u003e下载好Phantom，在\u003ca href=\"https://sns.id\"\u003esns.id\u003c/a\u003e注册域名，提交订单的时候发现不支持ETH支付。\u003c/p\u003e\n\u003cp\u003e又回到MetaMask，用ETH兑换USDC。\u003c/p\u003e\n\u003cp\u003e但是提交订单支付的时候，提示还是没有USDC。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/how-to-register-a-.sol-domain-name/WechatIMG118.jpg_320x.avif 320w, https://liudon.com/posts/how-to-register-a-.sol-domain-name/WechatIMG118.jpg_480x.avif 480w, https://liudon.com/posts/how-to-register-a-.sol-domain-name/WechatIMG118.jpg_720x.avif 720w, https://liudon.com/posts/how-to-register-a-.sol-domain-name/WechatIMG118.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/how-to-register-a-.sol-domain-name/WechatIMG118.jpg_320x.webp 320w, https://liudon.com/posts/how-to-register-a-.sol-domain-name/WechatIMG118.jpg_480x.webp 480w, https://liudon.com/posts/how-to-register-a-.sol-domain-name/WechatIMG118.jpg_720x.webp 720w, https://liudon.com/posts/how-to-register-a-.sol-domain-name/WechatIMG118.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/how-to-register-a-.sol-domain-name/WechatIMG118.jpg\" alt=\"\"\n         width=\"1080\" height=\"2341\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/how-to-register-a-.sol-domain-name/WechatIMG119.jpg_320x.avif 320w, https://liudon.com/posts/how-to-register-a-.sol-domain-name/WechatIMG119.jpg_480x.avif 480w, https://liudon.com/posts/how-to-register-a-.sol-domain-name/WechatIMG119.jpg_720x.avif 720w, https://liudon.com/posts/how-to-register-a-.sol-domain-name/WechatIMG119.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/how-to-register-a-.sol-domain-name/WechatIMG119.jpg_320x.webp 320w, https://liudon.com/posts/how-to-register-a-.sol-domain-name/WechatIMG119.jpg_480x.webp 480w, https://liudon.com/posts/how-to-register-a-.sol-domain-name/WechatIMG119.jpg_720x.webp 720w, https://liudon.com/posts/how-to-register-a-.sol-domain-name/WechatIMG119.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/how-to-register-a-.sol-domain-name/WechatIMG119.jpg\" alt=\"\"\n         width=\"1080\" height=\"2341\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e奇了怪了，请教了一下Livid，原来这俩是不同的网络：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eMetaMask使用的是Ethereum；\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePhantom使用的是Solana；\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e按Livid的提示，用交易所把USDC转到了Phantom钱包。\u003c/p\u003e\n\u003cp\u003e重新付款，又提示没有SOL，查了一下，原来Solana网络手续费都是用的SOL。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/how-to-register-a-.sol-domain-name/WechatIMG121.jpg_320x.avif 320w, https://liudon.com/posts/how-to-register-a-.sol-domain-name/WechatIMG121.jpg_480x.avif 480w, https://liudon.com/posts/how-to-register-a-.sol-domain-name/WechatIMG121.jpg_720x.avif 720w, https://liudon.com/posts/how-to-register-a-.sol-domain-name/WechatIMG121.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/how-to-register-a-.sol-domain-name/WechatIMG121.jpg_320x.webp 320w, https://liudon.com/posts/how-to-register-a-.sol-domain-name/WechatIMG121.jpg_480x.webp 480w, https://liudon.com/posts/how-to-register-a-.sol-domain-name/WechatIMG121.jpg_720x.webp 720w, https://liudon.com/posts/how-to-register-a-.sol-domain-name/WechatIMG121.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/how-to-register-a-.sol-domain-name/WechatIMG121.jpg\" alt=\"\"\n         width=\"1080\" height=\"2341\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e又回到MetaMask兑换了些SOL，然后通过交易所转换时，发现必须得有SOL支付手续费才能进行转换。\u003c/p\u003e\n\u003cp\u003e呃，这下彻底死胡同了。\u003c/p\u003e\n\u003cp\u003e再次请教Livid，通过交易所兑换了些SOL，转到了Phantom钱包，这下总算搞定了。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/how-to-register-a-.sol-domain-name/WechatIMG122.jpg_320x.avif 320w, https://liudon.com/posts/how-to-register-a-.sol-domain-name/WechatIMG122.jpg_480x.avif 480w, https://liudon.com/posts/how-to-register-a-.sol-domain-name/WechatIMG122.jpg_720x.avif 720w, https://liudon.com/posts/how-to-register-a-.sol-domain-name/WechatIMG122.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/how-to-register-a-.sol-domain-name/WechatIMG122.jpg_320x.webp 320w, https://liudon.com/posts/how-to-register-a-.sol-domain-name/WechatIMG122.jpg_480x.webp 480w, https://liudon.com/posts/how-to-register-a-.sol-domain-name/WechatIMG122.jpg_720x.webp 720w, https://liudon.com/posts/how-to-register-a-.sol-domain-name/WechatIMG122.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/how-to-register-a-.sol-domain-name/WechatIMG122.jpg\" alt=\"\"\n         width=\"1080\" height=\"2341\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e现在，你可以通过\u003ca href=\"https://liudon.sol.build\"\u003ehttps://liudon.sol.build\u003c/a\u003e访问了。\u003c/p\u003e\n","date_published":"2024-10-10T21:37:48+08:00","tags":["web3","metamask","phantom"]},{"title":"奥森公园半日游","id":"https://liudon.com/posts/half-day-tour-of-olympic-forest-park/","url":"https://liudon.com/posts/half-day-tour-of-olympic-forest-park/","summary":"\u003cp\u003e假期第三天，腰间盘犯了，在家躺了三天。\u003c/p\u003e\n\u003cp\u003e假期最后一天，感觉轻了许多，今天北京天气非常好，带娃出来走走。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG101.jpg_320x.avif 320w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG101.jpg_480x.avif 480w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG101.jpg_720x.avif 720w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG101.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG101.jpg_320x.webp 320w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG101.jpg_480x.webp 480w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG101.jpg_720x.webp 720w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG101.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/half-day-tour-of-olympic-forest-park/WechatIMG101.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG111.jpg_320x.avif 320w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG111.jpg_480x.avif 480w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG111.jpg_720x.avif 720w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG111.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG111.jpg_320x.webp 320w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG111.jpg_480x.webp 480w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG111.jpg_720x.webp 720w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG111.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/half-day-tour-of-olympic-forest-park/WechatIMG111.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e","content_html":"\u003cp\u003e假期第三天，腰间盘犯了，在家躺了三天。\u003c/p\u003e\n\u003cp\u003e假期最后一天，感觉轻了许多，今天北京天气非常好，带娃出来走走。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG101.jpg_320x.avif 320w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG101.jpg_480x.avif 480w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG101.jpg_720x.avif 720w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG101.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG101.jpg_320x.webp 320w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG101.jpg_480x.webp 480w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG101.jpg_720x.webp 720w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG101.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/half-day-tour-of-olympic-forest-park/WechatIMG101.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG111.jpg_320x.avif 320w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG111.jpg_480x.avif 480w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG111.jpg_720x.avif 720w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG111.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG111.jpg_320x.webp 320w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG111.jpg_480x.webp 480w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG111.jpg_720x.webp 720w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG111.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/half-day-tour-of-olympic-forest-park/WechatIMG111.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG115.jpg_320x.avif 320w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG115.jpg_480x.avif 480w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG115.jpg_720x.avif 720w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG115.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG115.jpg_320x.webp 320w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG115.jpg_480x.webp 480w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG115.jpg_720x.webp 720w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG115.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/half-day-tour-of-olympic-forest-park/WechatIMG115.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG116.jpg_320x.avif 320w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG116.jpg_480x.avif 480w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG116.jpg_720x.avif 720w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG116.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG116.jpg_320x.webp 320w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG116.jpg_480x.webp 480w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG116.jpg_720x.webp 720w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG116.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/half-day-tour-of-olympic-forest-park/WechatIMG116.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e不同角度的奥林匹克塔，第一次登上仰山俯视整个奥林匹克广场。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG103.jpg_320x.avif 320w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG103.jpg_480x.avif 480w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG103.jpg_720x.avif 720w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG103.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG103.jpg_320x.webp 320w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG103.jpg_480x.webp 480w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG103.jpg_720x.webp 720w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG103.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/half-day-tour-of-olympic-forest-park/WechatIMG103.jpg\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG105.jpg_320x.avif 320w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG105.jpg_480x.avif 480w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG105.jpg_720x.avif 720w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG105.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG105.jpg_320x.webp 320w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG105.jpg_480x.webp 480w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG105.jpg_720x.webp 720w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG105.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/half-day-tour-of-olympic-forest-park/WechatIMG105.jpg\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e鸟巢。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG102.jpg_320x.avif 320w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG102.jpg_480x.avif 480w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG102.jpg_720x.avif 720w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG102.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG102.jpg_320x.webp 320w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG102.jpg_480x.webp 480w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG102.jpg_720x.webp 720w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG102.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/half-day-tour-of-olympic-forest-park/WechatIMG102.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG108.jpg_320x.avif 320w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG108.jpg_480x.avif 480w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG108.jpg_720x.avif 720w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG108.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG108.jpg_320x.webp 320w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG108.jpg_480x.webp 480w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG108.jpg_720x.webp 720w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG108.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/half-day-tour-of-olympic-forest-park/WechatIMG108.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e娃发现的红蜻蜓和蝴蝶。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG107.jpg_320x.avif 320w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG107.jpg_480x.avif 480w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG107.jpg_720x.avif 720w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG107.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG107.jpg_320x.webp 320w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG107.jpg_480x.webp 480w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG107.jpg_720x.webp 720w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG107.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/half-day-tour-of-olympic-forest-park/WechatIMG107.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG110.jpg_320x.avif 320w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG110.jpg_480x.avif 480w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG110.jpg_720x.avif 720w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG110.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG110.jpg_320x.webp 320w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG110.jpg_480x.webp 480w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG110.jpg_720x.webp 720w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG110.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/half-day-tour-of-olympic-forest-park/WechatIMG110.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG112.jpg_320x.avif 320w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG112.jpg_480x.avif 480w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG112.jpg_720x.avif 720w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG112.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG112.jpg_320x.webp 320w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG112.jpg_480x.webp 480w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG112.jpg_720x.webp 720w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG112.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/half-day-tour-of-olympic-forest-park/WechatIMG112.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e拍娃。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG109.jpg_320x.avif 320w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG109.jpg_480x.avif 480w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG109.jpg_720x.avif 720w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG109.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG109.jpg_320x.webp 320w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG109.jpg_480x.webp 480w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG109.jpg_720x.webp 720w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG109.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/half-day-tour-of-olympic-forest-park/WechatIMG109.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG113.jpg_320x.avif 320w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG113.jpg_480x.avif 480w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG113.jpg_720x.avif 720w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG113.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG113.jpg_320x.webp 320w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG113.jpg_480x.webp 480w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG113.jpg_720x.webp 720w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG113.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/half-day-tour-of-olympic-forest-park/WechatIMG113.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG117.jpg_320x.avif 320w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG117.jpg_480x.avif 480w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG117.jpg_720x.avif 720w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG117.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG117.jpg_320x.webp 320w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG117.jpg_480x.webp 480w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG117.jpg_720x.webp 720w, https://liudon.com/posts/half-day-tour-of-olympic-forest-park/WechatIMG117.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/half-day-tour-of-olympic-forest-park/WechatIMG117.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e水上运动。\u003c/p\u003e\n","date_published":"2024-10-07T22:24:55+08:00","tags":["遛娃"]},{"title":"昌平42公里骑行绿道打卡","id":"https://liudon.com/posts/changping-42km-greenway-cycling/","url":"https://liudon.com/posts/changping-42km-greenway-cycling/","summary":"\u003cp\u003e五一的时候带娃骑过南边这段，网上查了说北边这段不好骑，难得2号下午有空，决定先自己走一遍看看。\u003c/p\u003e\n\u003cp\u003e从家附近的奥北森林公园开始，骑行到沙河水库，整个行程近30公里，耗时3个小时左右。\u003c/p\u003e","content_html":"\u003cp\u003e五一的时候带娃骑过南边这段，网上查了说北边这段不好骑，难得2号下午有空，决定先自己走一遍看看。\u003c/p\u003e\n\u003cp\u003e从家附近的奥北森林公园开始，骑行到沙河水库，整个行程近30公里，耗时3个小时左右。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG55.jpg_320x.avif 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG55.jpg_480x.avif 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG55.jpg_720x.avif 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG55.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG55.jpg_320x.webp 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG55.jpg_480x.webp 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG55.jpg_720x.webp 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG55.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/changping-42km-greenway-cycling/WechatIMG55.jpg\" alt=\"骑行概要\"\n         width=\"1080\" height=\"2341\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG56.jpg_320x.avif 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG56.jpg_480x.avif 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG56.jpg_720x.avif 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG56.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG56.jpg_320x.webp 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG56.jpg_480x.webp 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG56.jpg_720x.webp 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG56.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/changping-42km-greenway-cycling/WechatIMG56.jpg\" alt=\"路线\"\n         width=\"1080\" height=\"2341\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG57.jpg_320x.avif 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG57.jpg_480x.avif 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG57.jpg_720x.avif 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG57.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG57.jpg_320x.webp 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG57.jpg_480x.webp 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG57.jpg_720x.webp 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG57.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/changping-42km-greenway-cycling/WechatIMG57.jpg\" alt=\"共享单车\"\n         width=\"1080\" height=\"2342\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e奥北森林公园不大，出来后要走一段太平庄中街和建材城东路的社会路段，目前还在施工，道路坑洼不好骑，不过还好并不长。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG99.jpg_320x.avif 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG99.jpg_480x.avif 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG99.jpg_720x.avif 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG99.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG99.jpg_320x.webp 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG99.jpg_480x.webp 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG99.jpg_720x.webp 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG99.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/changping-42km-greenway-cycling/WechatIMG99.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG98.jpg_320x.avif 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG98.jpg_480x.avif 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG98.jpg_720x.avif 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG98.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG98.jpg_320x.webp 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG98.jpg_480x.webp 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG98.jpg_720x.webp 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG98.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/changping-42km-greenway-cycling/WechatIMG98.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e路过霍家营小区，查了一下原来是个霍家营村。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG58.jpg_320x.avif 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG58.jpg_480x.avif 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG58.jpg_720x.avif 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG58.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG58.jpg_320x.webp 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG58.jpg_480x.webp 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG58.jpg_720x.webp 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG58.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/changping-42km-greenway-cycling/WechatIMG58.jpg\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e进入霍营公园，里面很大，有专门的骑行道。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG59.jpg_320x.avif 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG59.jpg_480x.avif 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG59.jpg_720x.avif 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG59.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG59.jpg_320x.webp 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG59.jpg_480x.webp 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG59.jpg_720x.webp 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG59.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/changping-42km-greenway-cycling/WechatIMG59.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG60.jpg_320x.avif 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG60.jpg_480x.avif 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG60.jpg_720x.avif 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG60.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG60.jpg_320x.webp 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG60.jpg_480x.webp 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG60.jpg_720x.webp 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG60.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/changping-42km-greenway-cycling/WechatIMG60.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG61.jpg_320x.avif 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG61.jpg_480x.avif 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG61.jpg_720x.avif 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG61.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG61.jpg_320x.webp 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG61.jpg_480x.webp 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG61.jpg_720x.webp 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG61.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/changping-42km-greenway-cycling/WechatIMG61.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e出公园后，穿过马路，过桥右拐，注意别走错，是直接过桥。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG66.jpg_320x.avif 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG66.jpg_480x.avif 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG66.jpg_720x.avif 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG66.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG66.jpg_320x.webp 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG66.jpg_480x.webp 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG66.jpg_720x.webp 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG66.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/changping-42km-greenway-cycling/WechatIMG66.jpg\" alt=\"\"\n         width=\"1080\" height=\"1441\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG63.jpg_320x.avif 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG63.jpg_480x.avif 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG63.jpg_720x.avif 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG63.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG63.jpg_320x.webp 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG63.jpg_480x.webp 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG63.jpg_720x.webp 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG63.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/changping-42km-greenway-cycling/WechatIMG63.jpg\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG64.jpg_320x.avif 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG64.jpg_480x.avif 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG64.jpg_720x.avif 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG64.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG64.jpg_320x.webp 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG64.jpg_480x.webp 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG64.jpg_720x.webp 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG64.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/changping-42km-greenway-cycling/WechatIMG64.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG65.jpg_320x.avif 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG65.jpg_480x.avif 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG65.jpg_720x.avif 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG65.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG65.jpg_320x.webp 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG65.jpg_480x.webp 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG65.jpg_720x.webp 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG65.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/changping-42km-greenway-cycling/WechatIMG65.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e路过第一个路标，还是继续树林间骑行，道路一般，没有公园的专用道好骑。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG67.jpg_320x.avif 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG67.jpg_480x.avif 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG67.jpg_720x.avif 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG67.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG67.jpg_320x.webp 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG67.jpg_480x.webp 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG67.jpg_720x.webp 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG67.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/changping-42km-greenway-cycling/WechatIMG67.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG68.jpg_320x.avif 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG68.jpg_480x.avif 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG68.jpg_720x.avif 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG68.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG68.jpg_320x.webp 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG68.jpg_480x.webp 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG68.jpg_720x.webp 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG68.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/changping-42km-greenway-cycling/WechatIMG68.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e树叶已经开始变黄了，没想到，在北京还能看见一片玉米地。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG69.jpg_320x.avif 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG69.jpg_480x.avif 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG69.jpg_720x.avif 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG69.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG69.jpg_320x.webp 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG69.jpg_480x.webp 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG69.jpg_720x.webp 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG69.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/changping-42km-greenway-cycling/WechatIMG69.jpg\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG70.jpg_320x.avif 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG70.jpg_480x.avif 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG70.jpg_720x.avif 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG70.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG70.jpg_320x.webp 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG70.jpg_480x.webp 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG70.jpg_720x.webp 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG70.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/changping-42km-greenway-cycling/WechatIMG70.jpg\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e平西府的介绍，出来后上北清路转上承路，这段是社会道路，也正在施工，不好骑。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG71.jpg_320x.avif 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG71.jpg_480x.avif 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG71.jpg_720x.avif 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG71.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG71.jpg_320x.webp 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG71.jpg_480x.webp 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG71.jpg_720x.webp 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG71.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/changping-42km-greenway-cycling/WechatIMG71.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG72.jpg_320x.avif 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG72.jpg_480x.avif 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG72.jpg_720x.avif 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG72.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG72.jpg_320x.webp 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG72.jpg_480x.webp 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG72.jpg_720x.webp 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG72.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/changping-42km-greenway-cycling/WechatIMG72.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG73.jpg_320x.avif 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG73.jpg_480x.avif 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG73.jpg_720x.avif 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG73.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG73.jpg_320x.webp 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG73.jpg_480x.webp 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG73.jpg_720x.webp 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG73.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/changping-42km-greenway-cycling/WechatIMG73.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e路边有个小口子，从这进入一片绿地，地图上看在白庙村附近。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG74.jpg_320x.avif 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG74.jpg_480x.avif 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG74.jpg_720x.avif 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG74.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG74.jpg_320x.webp 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG74.jpg_480x.webp 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG74.jpg_720x.webp 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG74.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/changping-42km-greenway-cycling/WechatIMG74.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG75.jpg_320x.avif 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG75.jpg_480x.avif 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG75.jpg_720x.avif 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG75.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG75.jpg_320x.webp 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG75.jpg_480x.webp 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG75.jpg_720x.webp 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG75.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/changping-42km-greenway-cycling/WechatIMG75.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG76.jpg_320x.avif 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG76.jpg_480x.avif 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG76.jpg_720x.avif 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG76.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG76.jpg_320x.webp 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG76.jpg_480x.webp 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG76.jpg_720x.webp 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG76.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/changping-42km-greenway-cycling/WechatIMG76.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG100.jpg_320x.avif 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG100.jpg_480x.avif 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG100.jpg_720x.avif 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG100.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG100.jpg_320x.webp 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG100.jpg_480x.webp 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG100.jpg_720x.webp 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG100.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/changping-42km-greenway-cycling/WechatIMG100.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e穿过社会道路，注意安全。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG79.jpg_320x.avif 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG79.jpg_480x.avif 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG79.jpg_720x.avif 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG79.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG79.jpg_320x.webp 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG79.jpg_480x.webp 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG79.jpg_720x.webp 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG79.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/changping-42km-greenway-cycling/WechatIMG79.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG80.jpg_320x.avif 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG80.jpg_480x.avif 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG80.jpg_720x.avif 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG80.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG80.jpg_320x.webp 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG80.jpg_480x.webp 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG80.jpg_720x.webp 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG80.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/changping-42km-greenway-cycling/WechatIMG80.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e看定位在温都水城附近了，还要再穿一次社会道路。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG81.jpg_320x.avif 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG81.jpg_480x.avif 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG81.jpg_720x.avif 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG81.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG81.jpg_320x.webp 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG81.jpg_480x.webp 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG81.jpg_720x.webp 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG81.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/changping-42km-greenway-cycling/WechatIMG81.jpg\" alt=\"\"\n         width=\"1080\" height=\"2341\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG83.jpg_320x.avif 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG83.jpg_480x.avif 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG83.jpg_720x.avif 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG83.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG83.jpg_320x.webp 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG83.jpg_480x.webp 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG83.jpg_720x.webp 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG83.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/changping-42km-greenway-cycling/WechatIMG83.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e林间绿道结束了，出来就是定泗路，非常难走的一段，路窄，而且各种大车。\u003c/p\u003e\n\u003cp\u003e记住这个小口子，回来的时候一不小心错过，白骑了好一段路。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG85.jpg_320x.avif 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG85.jpg_480x.avif 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG85.jpg_720x.avif 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG85.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG85.jpg_320x.webp 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG85.jpg_480x.webp 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG85.jpg_720x.webp 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG85.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/changping-42km-greenway-cycling/WechatIMG85.jpg\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG84.jpg_320x.avif 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG84.jpg_480x.avif 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG84.jpg_720x.avif 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG84.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG84.jpg_320x.webp 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG84.jpg_480x.webp 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG84.jpg_720x.webp 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG84.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/changping-42km-greenway-cycling/WechatIMG84.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG86.jpg_320x.avif 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG86.jpg_480x.avif 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG86.jpg_720x.avif 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG86.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG86.jpg_320x.webp 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG86.jpg_480x.webp 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG86.jpg_720x.webp 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG86.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/changping-42km-greenway-cycling/WechatIMG86.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e定泗路转苍龙街，然后就开始沿着温榆河一直走，路也很窄，还是有点危险的。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG87.jpg_320x.avif 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG87.jpg_480x.avif 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG87.jpg_720x.avif 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG87.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG87.jpg_320x.webp 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG87.jpg_480x.webp 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG87.jpg_720x.webp 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG87.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/changping-42km-greenway-cycling/WechatIMG87.jpg\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG88.jpg_320x.avif 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG88.jpg_480x.avif 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG88.jpg_720x.avif 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG88.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG88.jpg_320x.webp 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG88.jpg_480x.webp 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG88.jpg_720x.webp 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG88.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/changping-42km-greenway-cycling/WechatIMG88.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG90.jpg_320x.avif 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG90.jpg_480x.avif 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG90.jpg_720x.avif 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG90.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG90.jpg_320x.webp 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG90.jpg_480x.webp 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG90.jpg_720x.webp 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG90.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/changping-42km-greenway-cycling/WechatIMG90.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e沙河水库正在改造施工，我按地图路线走的，结果到跟前没法继续了。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG91.jpg_320x.avif 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG91.jpg_480x.avif 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG91.jpg_720x.avif 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG91.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG91.jpg_320x.webp 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG91.jpg_480x.webp 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG91.jpg_720x.webp 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG91.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/changping-42km-greenway-cycling/WechatIMG91.jpg\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG92.jpg_320x.avif 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG92.jpg_480x.avif 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG92.jpg_720x.avif 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG92.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG92.jpg_320x.webp 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG92.jpg_480x.webp 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG92.jpg_720x.webp 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG92.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/changping-42km-greenway-cycling/WechatIMG92.jpg\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e正确的路线应该是在来的路上有一个过河的导行路，从那里过去。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG93.jpg_320x.avif 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG93.jpg_480x.avif 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG93.jpg_720x.avif 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG93.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG93.jpg_320x.webp 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG93.jpg_480x.webp 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG93.jpg_720x.webp 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG93.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/changping-42km-greenway-cycling/WechatIMG93.jpg\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG94.jpg_320x.avif 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG94.jpg_480x.avif 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG94.jpg_720x.avif 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG94.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG94.jpg_320x.webp 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG94.jpg_480x.webp 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG94.jpg_720x.webp 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG94.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/changping-42km-greenway-cycling/WechatIMG94.jpg\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e休息了20分钟，打道回府。\u003c/p\u003e\n\u003cp\u003e总结来说，北边这段路线要穿越占用社会道路，定泗路开始尤其危险，并不适合带娃骑行。\u003c/p\u003e\n\u003cp\u003e路上的一些杂拍，穿林而过，感觉挺好。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG95.jpg_320x.avif 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG95.jpg_480x.avif 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG95.jpg_720x.avif 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG95.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG95.jpg_320x.webp 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG95.jpg_480x.webp 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG95.jpg_720x.webp 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG95.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/changping-42km-greenway-cycling/WechatIMG95.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG77.jpg_320x.avif 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG77.jpg_480x.avif 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG77.jpg_720x.avif 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG77.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG77.jpg_320x.webp 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG77.jpg_480x.webp 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG77.jpg_720x.webp 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG77.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/changping-42km-greenway-cycling/WechatIMG77.jpg\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG96.jpg_320x.avif 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG96.jpg_480x.avif 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG96.jpg_720x.avif 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG96.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG96.jpg_320x.webp 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG96.jpg_480x.webp 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG96.jpg_720x.webp 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG96.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/changping-42km-greenway-cycling/WechatIMG96.jpg\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG97.jpg_320x.avif 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG97.jpg_480x.avif 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG97.jpg_720x.avif 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG97.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG97.jpg_320x.webp 320w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG97.jpg_480x.webp 480w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG97.jpg_720x.webp 720w, https://liudon.com/posts/changping-42km-greenway-cycling/WechatIMG97.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/changping-42km-greenway-cycling/WechatIMG97.jpg\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n","date_published":"2024-10-05T17:21:21+08:00","tags":["骑行"]},{"title":"十月一日爬慕田峪长城","id":"https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/","url":"https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/","summary":"\u003cp\u003e早上5点半起床洗漱，6点出门打车直奔清河站，6点50的火车S515清河-雁栖湖。\u003c/p\u003e\n\u003cp\u003e虽然坐地铁经常路过清河站，但还是第一次来清河站坐车。\u003c/p\u003e\n\u003cp\u003e我们提前20分钟到的车站，已经开始排队了。\u003c/p\u003e","content_html":"\u003cp\u003e早上5点半起床洗漱，6点出门打车直奔清河站，6点50的火车S515清河-雁栖湖。\u003c/p\u003e\n\u003cp\u003e虽然坐地铁经常路过清河站，但还是第一次来清河站坐车。\u003c/p\u003e\n\u003cp\u003e我们提前20分钟到的车站，已经开始排队了。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG37.jpg_320x.avif 320w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG37.jpg_480x.avif 480w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG37.jpg_720x.avif 720w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG37.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG37.jpg_320x.webp 320w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG37.jpg_480x.webp 480w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG37.jpg_720x.webp 720w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG37.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG37.jpg\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e等了一小会就开始进站了，提前进站台等车。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG39.jpg_320x.avif 320w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG39.jpg_480x.avif 480w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG39.jpg_720x.avif 720w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG39.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG39.jpg_320x.webp 320w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG39.jpg_480x.webp 480w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG39.jpg_720x.webp 720w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG39.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG39.jpg\" alt=\"\"\n         width=\"1080\" height=\"1441\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e终于见到了传说中粉色的怀密线列车了。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG40.jpg_320x.avif 320w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG40.jpg_480x.avif 480w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG40.jpg_720x.avif 720w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG40.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG40.jpg_320x.webp 320w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG40.jpg_480x.webp 480w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG40.jpg_720x.webp 720w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG40.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG40.jpg\" alt=\"\"\n         width=\"1080\" height=\"1441\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e这趟车跟普通火车不一样，不是固定座位。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG38.jpg_320x.avif 320w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG38.jpg_480x.avif 480w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG38.jpg_720x.avif 720w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG38.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG38.jpg_320x.webp 320w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG38.jpg_480x.webp 480w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG38.jpg_720x.webp 720w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG38.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG38.jpg\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e清河是第二站，上车还是有座的。\u003c/p\u003e\n\u003cp\u003e1个小时到雁栖湖站，出站打了个滴滴，半个小时左右到慕田峪长城。\u003c/p\u003e\n\u003cp\u003e进门往前走，直奔摆渡车，景区里人还不多。\u003c/p\u003e\n\u003cp\u003e摆渡车下来，继续往前，会先路过索道滑道的入口，我们是缆车继续往前走。\u003c/p\u003e\n\u003cp\u003e上缆车，几分钟就到山顶了，直奔西线开爬。\u003c/p\u003e\n\u003cfigure class=\"align-center \"\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG44.jpg_320x.avif 320w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG44.jpg_480x.avif 480w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG44.jpg_720x.avif 720w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG44.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG44.jpg_320x.webp 320w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG44.jpg_480x.webp 480w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG44.jpg_720x.webp 720w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG44.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG44.jpg#center\" alt=\"\"\n         width=\"1080\" height=\"1441\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003cfigcaption\u003e\n            一望无际的长城\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003cfigure class=\"align-center \"\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG46.jpg_320x.avif 320w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG46.jpg_480x.avif 480w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG46.jpg_720x.avif 720w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG46.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG46.jpg_320x.webp 320w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG46.jpg_480x.webp 480w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG46.jpg_720x.webp 720w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG46.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG46.jpg#center\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003cfigcaption\u003e\n            远眺中国尊\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003cfigure class=\"align-center \"\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG48.jpg_320x.avif 320w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG48.jpg_480x.avif 480w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG48.jpg_720x.avif 720w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG48.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG48.jpg_320x.webp 320w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG48.jpg_480x.webp 480w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG48.jpg_720x.webp 720w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG48.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG48.jpg#center\" alt=\"\"\n         width=\"1080\" height=\"1441\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003cfigcaption\u003e\n            特别陡的好汉坡\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003cfigure class=\"align-center \"\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG50.jpg_320x.avif 320w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG50.jpg_480x.avif 480w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG50.jpg_720x.avif 720w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG50.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG50.jpg_320x.webp 320w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG50.jpg_480x.webp 480w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG50.jpg_720x.webp 720w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG50.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG50.jpg#center\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003cfigcaption\u003e\n            登顶后的风光\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG52.jpg_320x.avif 320w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG52.jpg_480x.avif 480w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG52.jpg_720x.avif 720w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG52.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG52.jpg_320x.webp 320w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG52.jpg_480x.webp 480w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG52.jpg_720x.webp 720w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG52.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG52.jpg\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG45.jpg_320x.avif 320w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG45.jpg_480x.avif 480w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG45.jpg_720x.avif 720w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG45.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG45.jpg_320x.webp 320w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG45.jpg_480x.webp 480w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG45.jpg_720x.webp 720w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG45.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG45.jpg\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG51.jpg_320x.avif 320w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG51.jpg_480x.avif 480w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG51.jpg_720x.avif 720w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG51.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG51.jpg_320x.webp 320w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG51.jpg_480x.webp 480w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG51.jpg_720x.webp 720w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG51.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG51.jpg\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e因为在电视上看过八达岭长城十一的阵势，特意选了人少一些的慕田峪长城。\u003c/p\u003e\n\u003cp\u003e整个行程下来，人都不算太多。\u003c/p\u003e\n\u003cp\u003e当天风特别大，还好穿了抗风的外套。\u003c/p\u003e\n\u003cp\u003e另外爬好汉坡的时候，短短几分钟，经历了大晴天-\u0026gt;下雨-\u0026gt;下雪-\u0026gt;大晴天的变化。\u003c/p\u003e\n\u003cp\u003e西线除了最后的好汉坡，大部分地方都是平路，台阶都很少。\u003c/p\u003e\n\u003cp\u003e我们走走停停，3个小时左右就下山了，感觉并没有太累。\u003c/p\u003e\n\u003cp\u003e回程没买到雁栖湖站的票，只好买的怀柔北站。\u003c/p\u003e\n\u003cp\u003e幸好买的怀柔北站，赶上十一学生回家，怀柔北站上车就没座了。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG54.jpg_320x.avif 320w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG54.jpg_480x.avif 480w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG54.jpg_720x.avif 720w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG54.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG54.jpg_320x.webp 320w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG54.jpg_480x.webp 480w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG54.jpg_720x.webp 720w, https://liudon.com/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG54.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/climbing-mutianyu-great-wall-on-october-1st/WechatIMG54.jpg\" alt=\"\"\n         width=\"1080\" height=\"1441\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n","date_published":"2024-10-04T22:43:24+08:00","tags":["遛娃"]},{"title":"当Hugo遇上AVIF，优化图片加载","id":"https://liudon.com/posts/use-avif-to-optimize-images-on-hugo/","url":"https://liudon.com/posts/use-avif-to-optimize-images-on-hugo/","summary":"记录 2024 年通过 GitHub Actions 和 ImageMagick 为 Hugo 预生成 AVIF/WebP 图片的实践，以及本站后续升级后的多尺寸响应式方案。","content_html":"\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003e更新说明（2026-09）\u003c/strong\u003e：本文记录的是 2024 年使用 ImageMagick 全量生成单一 1080px AVIF/WebP 文件的历史方案。本站当前已改用 Sharp 预生成多个尺寸并复用构建缓存；当前 Hugo 也已经支持 AVIF 图片处理。最新实现见\u003ca href=\"https://liudon.com/posts/blog-performance-optimization/\"\u003e博客加速实践\u003c/a\u003e。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/use-avif-to-optimize-images-on-hugo/avif-on-hugo.png_320x.avif 320w, https://liudon.com/posts/use-avif-to-optimize-images-on-hugo/avif-on-hugo.png_480x.avif 480w, https://liudon.com/posts/use-avif-to-optimize-images-on-hugo/avif-on-hugo.png_720x.avif 720w, https://liudon.com/posts/use-avif-to-optimize-images-on-hugo/avif-on-hugo.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/use-avif-to-optimize-images-on-hugo/avif-on-hugo.png_320x.webp 320w, https://liudon.com/posts/use-avif-to-optimize-images-on-hugo/avif-on-hugo.png_480x.webp 480w, https://liudon.com/posts/use-avif-to-optimize-images-on-hugo/avif-on-hugo.png_720x.webp 720w, https://liudon.com/posts/use-avif-to-optimize-images-on-hugo/avif-on-hugo.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/use-avif-to-optimize-images-on-hugo/avif-on-hugo.png\" alt=\"avif-on-hugo\"\n         width=\"1080\" height=\"328\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e这篇文章会介绍基于Github Workflow使用ImageMagick生成AVIF图片，来优化Hugo站点的加载速度。\u003c/p\u003e\n\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003eAVIF是什么？\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eAVIF（AV1 Image File Format）是一种基于AV1视频编码标准的图像文件格式。\u003c/p\u003e\n\u003cp\u003eA modern image format based on the AV1 video format.\u003c/p\u003e\n\u003cp\u003eAVIF generally has better compression than WebP, JPEG, PNG and GIF and is designed to supersede them.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/use-avif-to-optimize-images-on-hugo/support.png_320x.avif 320w, https://liudon.com/posts/use-avif-to-optimize-images-on-hugo/support.png_480x.avif 480w, https://liudon.com/posts/use-avif-to-optimize-images-on-hugo/support.png_720x.avif 720w, https://liudon.com/posts/use-avif-to-optimize-images-on-hugo/support.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/use-avif-to-optimize-images-on-hugo/support.png_320x.webp 320w, https://liudon.com/posts/use-avif-to-optimize-images-on-hugo/support.png_480x.webp 480w, https://liudon.com/posts/use-avif-to-optimize-images-on-hugo/support.png_720x.webp 720w, https://liudon.com/posts/use-avif-to-optimize-images-on-hugo/support.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/use-avif-to-optimize-images-on-hugo/support.png\" alt=\"browser support avif\"\n         width=\"1080\" height=\"518\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e在2024年，绝大部分浏览器都已经支持了AVIF格式。\u003c/p\u003e\n\u003cp\u003eImageMagick是什么？\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eImageMagick® is a free, open-source software suite, used for editing and manipulating digital images.\u003c/p\u003e\n\u003cp\u003eIt can be used to create, edit, compose, or convert bitmap images, and supports a wide range of file formats, including JPEG, PNG, GIF, TIFF, and Ultra HDR.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eImageMagick是一款用于图像处理的一个工具。\u003c/p\u003e\n\u003ch2 id=\"对比\"\u003e对比\u003c/h2\u003e\n\u003cp\u003eAVIF说的这么好，我们来验证对比一下。\u003c/p\u003e\n\u003cp\u003e对于一张PNG的图片，使用ImageMagick分别生成WEBP和AVIF格式的图片，文件大小如下：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e-rw-r--r--@  1 liudon  staff   1.1M  9 29 23:02 20240922-170856.png\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e-rw-r--r--@  1 liudon  staff    15K  9 29 23:08 20240922-170856.png.avif\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e-rw-r--r--@  1 liudon  staff    25K  9 29 23:07 20240922-170856.png.webp\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eWEBP比PNG要节省90%左右，AVIF要比WEBP再小40%左右。\u003c/p\u003e\n\u003cp\u003e效果出奇的好，开搞吧。\u003c/p\u003e\n\u003ch2 id=\"使用\"\u003e使用\u003c/h2\u003e\n\u003ch3 id=\"1-生成avif文件\"\u003e1. 生成AVIF文件\u003c/h3\u003e\n\u003cp\u003e博客使用了Github Workflow来进行部署，所以生成ImageMagick的工作也就放在了Github Workflow上。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e- name: Compress Image\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003erun: |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    sudo apt-get update\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    sudo apt-get install -y imagemagick libheif-dev\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    find ./content/posts/ -type f \\( -name \u0026#34;*.jpg\u0026#34; -o -name \u0026#34;*.png\u0026#34; -o -name \u0026#34;*.jpeg\u0026#34; \\) -exec convert {} -resize 1080x\\\u0026gt; -quality 75 -define webp:image-hint=photo {}_1080x.webp \\;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    find ./content/posts/ -type f \\( -name \u0026#34;*.jpg\u0026#34; -o -name \u0026#34;*.png\u0026#34; -o -name \u0026#34;*.jpeg\u0026#34; \\) -exec convert {} -resize 1080x\\\u0026gt; {}_1080x.avif \\;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e新增压缩图片步骤，同时生成WEBP和AVIF格式文件。\u003c/p\u003e\n\u003cp\u003e含义说明，可以自行调整：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e-resize 1080x\u0026gt; 表示缩放到1080宽，\u0026gt;表示只有在原图宽大于1080时才进行缩放，小于不做处理。\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e-quality 75 表示处理后图片质量，值越小图越小，图片也越不清晰。\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e-define webp:image-hint=photo 这里是为了对齐Hugo自身的图片处理参数。\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"2-使用avif文件\"\u003e2. 使用AVIF文件\u003c/h3\u003e\n\u003cp\u003e修改\u003ccode\u003elayouts/_default/_markup/render-image.html\u003c/code\u003e文件：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003erespSizes\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eslice\u003c/span\u003e \u003cspan class=\"mi\"\u003e1080\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003edataSizes\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;(min-width: 768px) 1080px, 100vw\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eholder\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;GIP\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ehint\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;photo\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;box\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eDestination\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eDestination\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ePage\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePage\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eText\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eText\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eTitle\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eTitle\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eresponsiveImages\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePage\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eParams\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eresponsiveImages\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003edefault\u003c/span\u003e \u003cspan class=\"n\"\u003esite\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eParams\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eresponsiveImages\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003edefault\u003c/span\u003e \u003cspan class=\"bp\"\u003etrue\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"n\"\u003ewith\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003esrc\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePage\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eResources\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eGetMatch\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eDestination\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eresponsiveImages\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eimageTypes\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eslice\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"ow\"\u003eand\u003c/span\u003e \u003cspan class=\"n\"\u003ehugo\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eIsExtended\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ene\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eMediaType\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eType\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;image/webp\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eimageTypes\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eimageTypes\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003eappend\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;avif\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;!--\u003c/span\u003e \u003cspan class=\"n\"\u003eavif\u003c/span\u003e \u003cspan class=\"n\"\u003eneed\u003c/span\u003e \u003cspan class=\"n\"\u003ethe\u003c/span\u003e \u003cspan class=\"n\"\u003efirst\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eimageTypes\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eimageTypes\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003eappend\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;webp\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003egt\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eindex\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003erespSizes\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eWidth\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003erespSizes\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eslice\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eWidth\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003epicture\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"nb\"\u003erange\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eimageType\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eimageTypes\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003esource\u003c/span\u003e \u003cspan class=\"n\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;image/{{ $imageType }}\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003esrcset\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ecompressedImage\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eprintf\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"si\"\u003e%s\u003c/span\u003e\u003cspan class=\"s2\"\u003e_1080x.\u003c/span\u003e\u003cspan class=\"si\"\u003e%s\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eDestination\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eimageType\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ecmSrc\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ePage\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eResources\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eGetMatch\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ecompressedImage\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ecmSrc\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"o\"\u003e\u0026lt;!--\u003c/span\u003e\u003cspan class=\"n\"\u003eavif\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003ewebp\u003c/span\u003e \u003cspan class=\"n\"\u003efile\u003c/span\u003e \u003cspan class=\"n\"\u003eexist\u003c/span\u003e\u003cspan class=\"o\"\u003e--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\t\u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ecmSrc\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eRelPermalink\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003eabsURL\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e \u003cspan class=\"mi\"\u003e1080\u003c/span\u003e\u003cspan class=\"n\"\u003ew\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\t\u003cspan class=\"o\"\u003e\u0026lt;!--\u003c/span\u003e \u003cspan class=\"n\"\u003ehugo\u003c/span\u003e \u003cspan class=\"ow\"\u003enot\u003c/span\u003e \u003cspan class=\"n\"\u003esupport\u003c/span\u003e \u003cspan class=\"n\"\u003eavif\u003c/span\u003e \u003cspan class=\"n\"\u003eformat\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\t\u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003ene\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eimageType\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;avif\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\t\t\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003ewith\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003erespSizes\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\t\t\t\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"nb\"\u003erange\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\t\t\t\t\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003ege\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eWidth\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\t\t\t\t\t\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"p\"\u003e}},\u003c/span\u003e \u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eResize\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nb\"\u003eprint\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;x \u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eimageType\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34; \u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003efilter\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eRelPermalink\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003eabsURL\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e \u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\u003cspan class=\"n\"\u003ew\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\t\t\t\t\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\t\t\t\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\t\t\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\t\u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34; sizes=\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003edataSizes\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34; /\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\t\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eimg\u003c/span\u003e \u003cspan class=\"n\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ $Destination | safeURL }}\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003ewidth\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ .Width }}\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eheight\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ .Height }}\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003ealt\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ $Text }}\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003etitle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ $Title }}\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eloading\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;lazy\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"o\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"n\"\u003epicture\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\t\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eimg\u003c/span\u003e \u003cspan class=\"n\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ $Destination | safeURL }}\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003ewidth\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ $src.Width }}\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eheight\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ $src.Height }}\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003ealt\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ $Text }}\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003etitle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ $Title }}\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eloading\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;lazy\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\t\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e这里如果AVIF/WEBP文件已经存在，那么直接使用对应文件（注意：我这里都是生成的1080宽，如果你有调整记得一起调整）；\u003c/p\u003e\n\u003cp\u003e否则会使用Hugo自身的Image Processing生成对应格式文件。\u003c/p\u003e\n\u003ch2 id=\"效果\"\u003e效果\u003c/h2\u003e\n\u003cp\u003e优化前：\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/use-avif-to-optimize-images-on-hugo/before.jpg_320x.avif 320w, https://liudon.com/posts/use-avif-to-optimize-images-on-hugo/before.jpg_480x.avif 480w, https://liudon.com/posts/use-avif-to-optimize-images-on-hugo/before.jpg_720x.avif 720w, https://liudon.com/posts/use-avif-to-optimize-images-on-hugo/before.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/use-avif-to-optimize-images-on-hugo/before.jpg_320x.webp 320w, https://liudon.com/posts/use-avif-to-optimize-images-on-hugo/before.jpg_480x.webp 480w, https://liudon.com/posts/use-avif-to-optimize-images-on-hugo/before.jpg_720x.webp 720w, https://liudon.com/posts/use-avif-to-optimize-images-on-hugo/before.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/use-avif-to-optimize-images-on-hugo/before.jpg\" alt=\"optimize before\"\n         width=\"1080\" height=\"250\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e优化后：\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/use-avif-to-optimize-images-on-hugo/after.jpg_320x.avif 320w, https://liudon.com/posts/use-avif-to-optimize-images-on-hugo/after.jpg_480x.avif 480w, https://liudon.com/posts/use-avif-to-optimize-images-on-hugo/after.jpg_720x.avif 720w, https://liudon.com/posts/use-avif-to-optimize-images-on-hugo/after.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/use-avif-to-optimize-images-on-hugo/after.jpg_320x.webp 320w, https://liudon.com/posts/use-avif-to-optimize-images-on-hugo/after.jpg_480x.webp 480w, https://liudon.com/posts/use-avif-to-optimize-images-on-hugo/after.jpg_720x.webp 720w, https://liudon.com/posts/use-avif-to-optimize-images-on-hugo/after.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/use-avif-to-optimize-images-on-hugo/after.jpg\" alt=\"optimize after\"\n         width=\"1080\" height=\"266\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e从WEBP切换到AVIF，文件大小减少了30%左右。\u003c/p\u003e\n\u003cp\u003e哈哈，太棒了，效果杠杠滴。\u003c/p\u003e\n\u003cp\u003e唯一的缺点就是每次都是全量生成图片，Workflow执行略久些（我的要5分钟左右），这里后面再优化。\u003c/p\u003e\n\u003cp\u003e从23年11月开始有的想法，在24年9月最后一天终于实现了。🎉🎉🎉\u003c/p\u003e\n","date_published":"2024-09-30T22:01:45+08:00","tags":["博客优化","hugo","avif","imagemagic","github"]},{"title":"博客被恶意镜像","id":"https://liudon.com/posts/blog-malicious-mirroring/","url":"https://liudon.com/posts/blog-malicious-mirroring/","summary":"\u003ch2 id=\"起因\"\u003e起因\u003c/h2\u003e\n\u003cp\u003e9月初的时候，在\u003ccode\u003eGoogle Search Console\u003c/code\u003e里发现了一个外链，域名是\u003ccode\u003e**.top\u003c/code\u003e。\u003c/p\u003e\n\u003cp\u003e随手点过去看了下，发现居然跟我的博客内容一模一样，就是内容变成了繁体。\u003c/p\u003e","content_html":"\u003ch2 id=\"起因\"\u003e起因\u003c/h2\u003e\n\u003cp\u003e9月初的时候，在\u003ccode\u003eGoogle Search Console\u003c/code\u003e里发现了一个外链，域名是\u003ccode\u003e**.top\u003c/code\u003e。\u003c/p\u003e\n\u003cp\u003e随手点过去看了下，发现居然跟我的博客内容一模一样，就是内容变成了繁体。\u003c/p\u003e\n\u003cp\u003e知道这肯定是被拿来镜像了，不过当时也没在意，就没管。\u003c/p\u003e\n\u003cp\u003e后来在\u003ca href=\"https://v2ex.com/t/1070859\"\u003ev2ex\u003c/a\u003e上也发现类似的问题，还有其他博主也反馈有被镜像，感觉像是个黑产批量的操作。\u003c/p\u003e\n\u003cp\u003e这周\u003ccode\u003eGoogle Search Console\u003c/code\u003e反馈我的站点有个新问题，点进去一看，嚯。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/blog-malicious-mirroring/20240927-192400.png_320x.avif 320w, https://liudon.com/posts/blog-malicious-mirroring/20240927-192400.png_480x.avif 480w, https://liudon.com/posts/blog-malicious-mirroring/20240927-192400.png_720x.avif 720w, https://liudon.com/posts/blog-malicious-mirroring/20240927-192400.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/blog-malicious-mirroring/20240927-192400.png_320x.webp 320w, https://liudon.com/posts/blog-malicious-mirroring/20240927-192400.png_480x.webp 480w, https://liudon.com/posts/blog-malicious-mirroring/20240927-192400.png_720x.webp 720w, https://liudon.com/posts/blog-malicious-mirroring/20240927-192400.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/blog-malicious-mirroring/20240927-192400.png\" alt=\"搜索问题\"\n         width=\"1080\" height=\"744\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e在谷歌里搜了一下，发现已经有很多这个站点的收录了。\u003c/p\u003e\n\u003cp\u003e开始影响到我的博客收录了，这怎么能忍呢，必须处理掉它。\u003c/p\u003e\n\u003ch2 id=\"分析\"\u003e分析\u003c/h2\u003e\n\u003cp\u003e测试了一下这个站点，不得不说，这个人是相当的聪明。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/blog-malicious-mirroring/20240926-200728.jpg_320x.avif 320w, https://liudon.com/posts/blog-malicious-mirroring/20240926-200728.jpg_480x.avif 480w, https://liudon.com/posts/blog-malicious-mirroring/20240926-200728.jpg_720x.avif 720w, https://liudon.com/posts/blog-malicious-mirroring/20240926-200728.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/blog-malicious-mirroring/20240926-200728.jpg_320x.webp 320w, https://liudon.com/posts/blog-malicious-mirroring/20240926-200728.jpg_480x.webp 480w, https://liudon.com/posts/blog-malicious-mirroring/20240926-200728.jpg_720x.webp 720w, https://liudon.com/posts/blog-malicious-mirroring/20240926-200728.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/blog-malicious-mirroring/20240926-200728.jpg\" alt=\"国内访问404\"\n         width=\"1080\" height=\"556\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/blog-malicious-mirroring/20240927-100208.png_320x.avif 320w, https://liudon.com/posts/blog-malicious-mirroring/20240927-100208.png_480x.avif 480w, https://liudon.com/posts/blog-malicious-mirroring/20240927-100208.png_720x.avif 720w, https://liudon.com/posts/blog-malicious-mirroring/20240927-100208.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/blog-malicious-mirroring/20240927-100208.png_320x.webp 320w, https://liudon.com/posts/blog-malicious-mirroring/20240927-100208.png_480x.webp 480w, https://liudon.com/posts/blog-malicious-mirroring/20240927-100208.png_720x.webp 720w, https://liudon.com/posts/blog-malicious-mirroring/20240927-100208.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/blog-malicious-mirroring/20240927-100208.png\" alt=\"海外访问200\"\n         width=\"1080\" height=\"463\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e使用了\u003ccode\u003eCloudflare\u003c/code\u003e服务，隐藏了真实的服务ip。\u003c/p\u003e\n\u003cp\u003e同时判断了访问ip，如果是国内用户直接返回了404，海外才会正常返回，这样一般国内用户就发现不了。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/blog-malicious-mirroring/20240927-102245.png_320x.avif 320w, https://liudon.com/posts/blog-malicious-mirroring/20240927-102245.png_480x.avif 480w, https://liudon.com/posts/blog-malicious-mirroring/20240927-102245.png_720x.avif 720w, https://liudon.com/posts/blog-malicious-mirroring/20240927-102245.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/blog-malicious-mirroring/20240927-102245.png_320x.webp 320w, https://liudon.com/posts/blog-malicious-mirroring/20240927-102245.png_480x.webp 480w, https://liudon.com/posts/blog-malicious-mirroring/20240927-102245.png_720x.webp 720w, https://liudon.com/posts/blog-malicious-mirroring/20240927-102245.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/blog-malicious-mirroring/20240927-102245.png\" alt=\"\"\n         width=\"1080\" height=\"273\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e还重写了\u003ccode\u003erobots.txt\u003c/code\u003e，只让谷歌收录。\u003c/p\u003e\n\u003cp\u003e查了一下域名\u003ccode\u003eWhois\u003c/code\u003e信息，注册在阿里云。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/blog-malicious-mirroring/20240927-200728.png_320x.avif 320w, https://liudon.com/posts/blog-malicious-mirroring/20240927-200728.png_480x.avif 480w, https://liudon.com/posts/blog-malicious-mirroring/20240927-200728.png_720x.avif 720w, https://liudon.com/posts/blog-malicious-mirroring/20240927-200728.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/blog-malicious-mirroring/20240927-200728.png_320x.webp 320w, https://liudon.com/posts/blog-malicious-mirroring/20240927-200728.png_480x.webp 480w, https://liudon.com/posts/blog-malicious-mirroring/20240927-200728.png_720x.webp 720w, https://liudon.com/posts/blog-malicious-mirroring/20240927-200728.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/blog-malicious-mirroring/20240927-200728.png\" alt=\"whois\"\n         width=\"1080\" height=\"780\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e页面上挂的备案号都是我的，搞事情的话后面再扯上我，这就麻烦了。\u003c/p\u003e\n\u003cp\u003e这就像块牛皮癣，越想越恶心。\u003c/p\u003e\n\u003cp\u003e我的博客搞了两套部署，一套部署在\u003ca href=\"https://liudon.com\"\u003eCloudflare Pages\u003c/a\u003e，一套部署在\u003ca href=\"https://liudon.xyz\"\u003eIPFS\u003c/a\u003e。\u003c/p\u003e\n\u003cp\u003e接下来就是搞清楚，他是镜像的哪个站点：\u003c/p\u003e\n\u003ch3 id=\"1-ipfs站点\"\u003e1. IPFS站点\u003c/h3\u003e\n\u003cp\u003e看他的\u003ccode\u003erobots.txt\u003c/code\u003e内容，我一开始怀疑是镜像的IPFS站点\u003ca href=\"https://liudon.xyz\"\u003eliudon.xyz\u003c/a\u003e，感觉像是在我的\u003ccode\u003erobots.txt\u003c/code\u003e前面加了一段内容。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl \u0026#39;https://liudon.xyz/robots.txt\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUser-agent: *\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eDisallow: /\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e幸好还有一个\u003ccode\u003eRobots meta 标记\u003c/code\u003e，于是把IPFS部署的站点加上了这个属性。\u003c/p\u003e\n\u003cp\u003e部署后发现这个镜像站并没有更新，排除了这个可能。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/blog-malicious-mirroring/20240927-102447.png_320x.avif 320w, https://liudon.com/posts/blog-malicious-mirroring/20240927-102447.png_480x.avif 480w, https://liudon.com/posts/blog-malicious-mirroring/20240927-102447.png_720x.avif 720w, https://liudon.com/posts/blog-malicious-mirroring/20240927-102447.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/blog-malicious-mirroring/20240927-102447.png_320x.webp 320w, https://liudon.com/posts/blog-malicious-mirroring/20240927-102447.png_480x.webp 480w, https://liudon.com/posts/blog-malicious-mirroring/20240927-102447.png_720x.webp 720w, https://liudon.com/posts/blog-malicious-mirroring/20240927-102447.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/blog-malicious-mirroring/20240927-102447.png\" alt=\"\"\n         width=\"1080\" height=\"273\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003ch3 id=\"2-github-静态仓库\"\u003e2. Github 静态仓库\u003c/h3\u003e\n\u003cp\u003e我在\u003ccode\u003eGithub\u003c/code\u003e上单独搞了个分支存放生成的静态文件，\u003ccode\u003eCloudflare Pages\u003c/code\u003e直接读取这个分支进行部署。\u003c/p\u003e\n\u003cp\u003e怀疑他是不是监控了这个仓库的提交记录，直接拿这个来部署的镜像站。\u003c/p\u003e\n\u003cp\u003e我把\u003ccode\u003eCloudflare Pages\u003c/code\u003e的自动部署关掉，然后直接修改静态文件。\u003c/p\u003e\n\u003cp\u003e更新后发现，这个静态站并没有预期的更新。\u003c/p\u003e\n\u003ch4 id=\"3-cloudflare-worker\"\u003e3. Cloudflare Worker\u003c/h4\u003e\n\u003cp\u003e在分析过程中，发现我的博客更新后，他的站点也会很快就更新。\u003c/p\u003e\n\u003cp\u003e因为他的网站部署在\u003ccode\u003eCloudflare\u003c/code\u003e上，考虑是走的\u003ccode\u003eCloudflare Worker\u003c/code\u003e反代，直接请求目标站点，然后进行繁体翻译返回。\u003c/p\u003e\n\u003cp\u003e这样就完全不需要关心更新的问题，完全自动化处理，太完美了。\u003c/p\u003e\n\u003ch2 id=\"反制\"\u003e反制\u003c/h2\u003e\n\u003cp\u003e其实这里并没有太好的办法反制，\u003ccode\u003erobots\u003c/code\u003e文件被他重写了，无法控制，使用\u003ccode\u003eRobots meta 标记\u003c/code\u003e的话会影响到我们自己的收录。\u003c/p\u003e\n\u003cp\u003e只能是通过加一段JS代码，参考自\u003ca href=\"https://zhul.in/2024/07/18/my-blog-is-completely-proxied-and-translated-into-traditional-chinese/\"\u003e竹林里有冰\u003c/a\u003e，判断访问的域名非法的话，直接跳转到正确地址。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003ehost\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ewindow\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003elocation\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ehost\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ehost\u003c/span\u003e \u003cspan class=\"o\"\u003e!==\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;liudon.com\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"o\"\u003e!\u003c/span\u003e \u003cspan class=\"n\"\u003ehost\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003estartsWith\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;localhost\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"o\"\u003e!\u003c/span\u003e \u003cspan class=\"n\"\u003ehost\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003estartsWith\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;127.0.0.1\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003edocument\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ebody\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003einnerHTML\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"s1\"\u003e\u0026#39;\u0026lt;div style=\u0026#34;margin: auto;\u0026#34;\u0026gt;\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"s1\"\u003e\u0026#39;\u0026lt;h1\u0026gt;当前页面并非本文作者的主页，将在五秒后跳转。\u0026lt;/h1\u0026gt;\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"s1\"\u003e\u0026#39;\u0026lt;/div\u0026gt;\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ejoin\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003edocument\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ebody\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003estyle\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"s1\"\u003e\u0026#39;background-color: white;\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"s1\"\u003e\u0026#39;color: black;\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"s1\"\u003e\u0026#39;text-align: center;\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"s1\"\u003e\u0026#39;font-size: 50px;\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"s1\"\u003e\u0026#39;width: 100vw;\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"s1\"\u003e\u0026#39;height: 100vh;\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"s1\"\u003e\u0026#39;display: flex;\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ejoin\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003esetTimeout\u003c/span\u003e\u003cspan class=\"p\"\u003e(()\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003ewindow\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003elocation\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ehref\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;https://liudon.com\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e},\u003c/span\u003e \u003cspan class=\"mi\"\u003e5000\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e查了一下，搜索Bot爬取的时候会执行js，希望能更新掉已收录的网页信息。\u003c/p\u003e\n","date_published":"2024-09-26T22:18:23+08:00","tags":["cloudflare","github","google"]},{"title":"Github Pages 部署流程解析","id":"https://liudon.com/posts/github-pages-deployment-tutorial/","url":"https://liudon.com/posts/github-pages-deployment-tutorial/","summary":"\u003cp\u003e上周末在\u003ca href=\"https://liudon.com/posts/building-a-workout-page/\"\u003e搭建个人锻炼页面\u003c/a\u003e时，遇到个\u003ccode\u003eGithub Pages\u003c/code\u003e部署的困惑。\u003c/p\u003e\n\u003cp\u003e看了\u003ccode\u003erunning_page\u003c/code\u003e项目文档，是支持部署到\u003ccode\u003eGithub Pages\u003c/code\u003e页面的，对应的操作流程定义在\u003ca href=\"https://github.com/yihong0618/running_page/blob/master/.github/workflows/gh-pages.yml\"\u003egithub/workflows/gh-pages.yml\u003c/a\u003e文件。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eInstall\u003c/span\u003e \u003cspan class=\"n\"\u003edependencies\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003epnpm\u003c/span\u003e \u003cspan class=\"n\"\u003einstall\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eBuild\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003ePATH_PREFIX\u003c/span\u003e\u003cspan class=\"o\"\u003e=/$\u003c/span\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"n\"\u003egithub\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eevent\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003erepository\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ename\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e \u003cspan class=\"n\"\u003epnpm\u003c/span\u003e \u003cspan class=\"n\"\u003ebuild\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eUpload\u003c/span\u003e \u003cspan class=\"n\"\u003eartifact\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eactions\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eupload\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003epages\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eartifact\u003c/span\u003e\u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003ev3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"c1\"\u003e# Upload dist repository\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003epath\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;./dist\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eDeploy\u003c/span\u003e \u003cspan class=\"n\"\u003eto\u003c/span\u003e \u003cspan class=\"n\"\u003eGitHub\u003c/span\u003e \u003cspan class=\"n\"\u003ePages\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003edeployment\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eactions\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003edeploy\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003epages\u003c/span\u003e\u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003ev4\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e核心逻辑就是上面这段。\u003c/p\u003e","content_html":"\u003cp\u003e上周末在\u003ca href=\"https://liudon.com/posts/building-a-workout-page/\"\u003e搭建个人锻炼页面\u003c/a\u003e时，遇到个\u003ccode\u003eGithub Pages\u003c/code\u003e部署的困惑。\u003c/p\u003e\n\u003cp\u003e看了\u003ccode\u003erunning_page\u003c/code\u003e项目文档，是支持部署到\u003ccode\u003eGithub Pages\u003c/code\u003e页面的，对应的操作流程定义在\u003ca href=\"https://github.com/yihong0618/running_page/blob/master/.github/workflows/gh-pages.yml\"\u003egithub/workflows/gh-pages.yml\u003c/a\u003e文件。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eInstall\u003c/span\u003e \u003cspan class=\"n\"\u003edependencies\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003epnpm\u003c/span\u003e \u003cspan class=\"n\"\u003einstall\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eBuild\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003ePATH_PREFIX\u003c/span\u003e\u003cspan class=\"o\"\u003e=/$\u003c/span\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"n\"\u003egithub\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eevent\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003erepository\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ename\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e \u003cspan class=\"n\"\u003epnpm\u003c/span\u003e \u003cspan class=\"n\"\u003ebuild\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eUpload\u003c/span\u003e \u003cspan class=\"n\"\u003eartifact\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eactions\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eupload\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003epages\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eartifact\u003c/span\u003e\u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003ev3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"c1\"\u003e# Upload dist repository\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003epath\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;./dist\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eDeploy\u003c/span\u003e \u003cspan class=\"n\"\u003eto\u003c/span\u003e \u003cspan class=\"n\"\u003eGitHub\u003c/span\u003e \u003cspan class=\"n\"\u003ePages\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003edeployment\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eactions\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003edeploy\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003epages\u003c/span\u003e\u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003ev4\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e核心逻辑就是上面这段。\u003c/p\u003e\n\u003cp\u003e之前搞过部署\u003ccode\u003ehugo\u003c/code\u003e静态站点到\u003ccode\u003eGithub Pages\u003c/code\u003e，使用的分支方式部署，编译后的静态文件单独用一个分支存放。\u003c/p\u003e\n\u003cp\u003e这里以我自己的博客项目举例，大致流程如下图：\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/github-pages-deployment-tutorial/20240924-214938.png_320x.avif 320w, https://liudon.com/posts/github-pages-deployment-tutorial/20240924-214938.png_480x.avif 480w, https://liudon.com/posts/github-pages-deployment-tutorial/20240924-214938.png_720x.avif 720w, https://liudon.com/posts/github-pages-deployment-tutorial/20240924-214938.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/github-pages-deployment-tutorial/20240924-214938.png_320x.webp 320w, https://liudon.com/posts/github-pages-deployment-tutorial/20240924-214938.png_480x.webp 480w, https://liudon.com/posts/github-pages-deployment-tutorial/20240924-214938.png_720x.webp 720w, https://liudon.com/posts/github-pages-deployment-tutorial/20240924-214938.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/github-pages-deployment-tutorial/20240924-214938.png\" alt=\"github-pages-deploy-flow\"\n         width=\"1080\" height=\"285\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e按我的理解，这里最终访问的文件内容是存在\u003ccode\u003egh-page\u003c/code\u003e分支下的。\u003c/p\u003e\n\u003cp\u003e但是实际部署完\u003ccode\u003erunning_page\u003c/code\u003e项目后，我发现并没有出现\u003ccode\u003egh-page\u003c/code\u003e分支，但是\u003ccode\u003eGithub Pages\u003c/code\u003e却可以正常访问。\u003c/p\u003e\n\u003cp\u003e有点不可思议，这个访问的数据是在哪里的呢？\u003c/p\u003e\n\u003cp\u003e带着这个疑问，在v2ex上发了个\u003ca href=\"https://www.v2ex.com/t/1074875\"\u003e咨询贴\u003c/a\u003e。\u003c/p\u003e\n\u003cp\u003e经过网友解惑，大致搞明白了这里的流程：\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/github-pages-deployment-tutorial/20240924-215958.png_320x.avif 320w, https://liudon.com/posts/github-pages-deployment-tutorial/20240924-215958.png_480x.avif 480w, https://liudon.com/posts/github-pages-deployment-tutorial/20240924-215958.png_720x.avif 720w, https://liudon.com/posts/github-pages-deployment-tutorial/20240924-215958.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/github-pages-deployment-tutorial/20240924-215958.png_320x.webp 320w, https://liudon.com/posts/github-pages-deployment-tutorial/20240924-215958.png_480x.webp 480w, https://liudon.com/posts/github-pages-deployment-tutorial/20240924-215958.png_720x.webp 720w, https://liudon.com/posts/github-pages-deployment-tutorial/20240924-215958.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/github-pages-deployment-tutorial/20240924-215958.png\" alt=\"github-pages-deploy-flow\"\n         width=\"1080\" height=\"495\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eGithub Pages\u003c/code\u003e的发布源有两种方式，通过分支部署和通过\u003ccode\u003eGithub Actions\u003c/code\u003e部署，分别对应上图的两条分支。\u003c/p\u003e\n\u003cp\u003e这里最终都会将build后的静态文件部署到\u003ccode\u003eGithub Pages\u003c/code\u003e服务上，供用户访问。\u003c/p\u003e\n\u003cp\u003e分支部署的方式，其实是有一个\u003ca href=\"https://github.com/Liudon/liudon.github.io/actions/workflows/pages/pages-build-deployment\"\u003e内置工作流\u003c/a\u003e部署到\u003ccode\u003eGithub Pages\u003c/code\u003e服务上的。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/github-pages-deployment-tutorial/20240924-220607.png_320x.avif 320w, https://liudon.com/posts/github-pages-deployment-tutorial/20240924-220607.png_480x.avif 480w, https://liudon.com/posts/github-pages-deployment-tutorial/20240924-220607.png_720x.avif 720w, https://liudon.com/posts/github-pages-deployment-tutorial/20240924-220607.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/github-pages-deployment-tutorial/20240924-220607.png_320x.webp 320w, https://liudon.com/posts/github-pages-deployment-tutorial/20240924-220607.png_480x.webp 480w, https://liudon.com/posts/github-pages-deployment-tutorial/20240924-220607.png_720x.webp 720w, https://liudon.com/posts/github-pages-deployment-tutorial/20240924-220607.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/github-pages-deployment-tutorial/20240924-220607.png\" alt=\"\"\n         width=\"1080\" height=\"551\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e整个部署流程大致就是这样，最终的静态文件都是存在\u003ccode\u003eGithub Pages\u003c/code\u003e服务上的。\u003c/p\u003e\n","date_published":"2024-09-24T21:30:21+08:00","tags":["github pages"]},{"title":"搭建个人锻炼页面","id":"https://liudon.com/posts/building-a-workout-page/","url":"https://liudon.com/posts/building-a-workout-page/","summary":"\u003cp\u003e工作的缘故，平时基本一坐一天，缺少运动。\u003c/p\u003e\n\u003cp\u003e时间久了，各种毛病也就出来了。\u003c/p\u003e\n\u003cp\u003e搬到新大楼后，每天中午吃完饭楼下遛个弯，走一走，身体精神也好了很多。\u003c/p\u003e\n\u003cp\u003e坚持了一段时间，也不了了之了。\u003c/p\u003e","content_html":"\u003cp\u003e工作的缘故，平时基本一坐一天，缺少运动。\u003c/p\u003e\n\u003cp\u003e时间久了，各种毛病也就出来了。\u003c/p\u003e\n\u003cp\u003e搬到新大楼后，每天中午吃完饭楼下遛个弯，走一走，身体精神也好了很多。\u003c/p\u003e\n\u003cp\u003e坚持了一段时间，也不了了之了。\u003c/p\u003e\n\u003cp\u003e今年开始，决定骑车通勤，上下班路上运动一下。\u003c/p\u003e\n\u003cp\u003e最近在别人博客里发现了运动记录，发现是通过\u003ca href=\"https://github.com/yihong0618/running_page\"\u003erunning_page\u003c/a\u003e项目实现的。\u003c/p\u003e\n\u003cp\u003e顺藤摸瓜，又发现了\u003ca href=\"https://github.com/ben-29/workouts_page\"\u003eworkouts_page\u003c/a\u003e项目，支持多种运动。\u003c/p\u003e\n\u003cp\u003e于是看文档，部署起来，我的\u003ca href=\"https://workout.liudon.com/\"\u003e个人锻炼页面\u003c/a\u003e。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/building-a-workout-page/20240922-170856.png_320x.avif 320w, https://liudon.com/posts/building-a-workout-page/20240922-170856.png_480x.avif 480w, https://liudon.com/posts/building-a-workout-page/20240922-170856.png_720x.avif 720w, https://liudon.com/posts/building-a-workout-page/20240922-170856.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/building-a-workout-page/20240922-170856.png_320x.webp 320w, https://liudon.com/posts/building-a-workout-page/20240922-170856.png_480x.webp 480w, https://liudon.com/posts/building-a-workout-page/20240922-170856.png_720x.webp 720w, https://liudon.com/posts/building-a-workout-page/20240922-170856.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/building-a-workout-page/20240922-170856.png\" alt=\"workout page\"\n         width=\"1080\" height=\"504\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e整个流程：\u003c/p\u003e\n\u003cp\u003e使用\u003ccode\u003eApple Watch\u003c/code\u003e记录运动，导入到\u003ccode\u003eStrava\u003c/code\u003e应用里，在通过\u003ccode\u003eworkouts_page\u003c/code\u003e工作流拉取数据构建页面。\u003c/p\u003e\n\u003cp\u003e部署过程中，顺带发现个问题，提了个PR。\u003c/p\u003e\n\u003cp\u003e这里还有个小插曲，没搞明白PR的流程，在未合入前又提交了其他代码，只好重新提了一个PR。😂\u003c/p\u003e\n","date_published":"2024-09-22T16:57:38+08:00","tags":[]},{"title":"你好 Follow","id":"https://liudon.com/posts/hi-follow/","url":"https://liudon.com/posts/hi-follow/","summary":"\u003cblockquote\u003e\n\u003cp\u003eFollow:  Next generation information browser.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e最近博客圈开始流行\u003ccode\u003eFollow邀请码\u003c/code\u003e，大家各种求码，一码难求。\u003c/p\u003e\n\u003cp\u003e蹲在\u003ccode\u003eDiscord\u003c/code\u003e群里一周，虽然时有发码，但最终还是狼多肉少，抢不到码呀。\u003c/p\u003e","content_html":"\u003cblockquote\u003e\n\u003cp\u003eFollow:  Next generation information browser.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e最近博客圈开始流行\u003ccode\u003eFollow邀请码\u003c/code\u003e，大家各种求码，一码难求。\u003c/p\u003e\n\u003cp\u003e蹲在\u003ccode\u003eDiscord\u003c/code\u003e群里一周，虽然时有发码，但最终还是狼多肉少，抢不到码呀。\u003c/p\u003e\n\u003cp\u003e上周五好不容易加上管理员，要到了一枚邀请码，终于可以激活体验了。\u003c/p\u003e\n\u003cp\u003e在\u003ccode\u003eFollow\u003c/code\u003e里，订阅变的异常简单，输入url，它会自己检查rss订阅。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/hi-follow/20240917-010236.png_320x.avif 320w, https://liudon.com/posts/hi-follow/20240917-010236.png_480x.avif 480w, https://liudon.com/posts/hi-follow/20240917-010236.png_720x.avif 720w, https://liudon.com/posts/hi-follow/20240917-010236.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/hi-follow/20240917-010236.png_320x.webp 320w, https://liudon.com/posts/hi-follow/20240917-010236.png_480x.webp 480w, https://liudon.com/posts/hi-follow/20240917-010236.png_720x.webp 720w, https://liudon.com/posts/hi-follow/20240917-010236.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/hi-follow/20240917-010236.png\" alt=\"Follow\"\n         width=\"1080\" height=\"498\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e另外发现我的博客，在\u003ccode\u003eFollow\u003c/code\u003e显示的内容不全。\u003c/p\u003e\n\u003cp\u003e检查了一下，发现是输出的RSS内容不全。\u003c/p\u003e\n\u003cp\u003e修改\u003ccode\u003ehugo\u003c/code\u003e配置文件，开启RSS输出全文。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eShowFullTextinRSS: true\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e从木木大佬那里看到，可以认证自己的Feed，我也来搞一下我的。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eThis message is used to verify that this feed (feedId:55815884011044914) belongs to me (userId:56204227179125760). \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eJoin me in enjoying the next generation information browser https://follow.is.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e咱也是带标的了。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/hi-follow/20240917-012132.png_320x.avif 320w, https://liudon.com/posts/hi-follow/20240917-012132.png_480x.avif 480w, https://liudon.com/posts/hi-follow/20240917-012132.png_512x.avif 512w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/hi-follow/20240917-012132.png_320x.webp 320w, https://liudon.com/posts/hi-follow/20240917-012132.png_480x.webp 480w, https://liudon.com/posts/hi-follow/20240917-012132.png_512x.webp 512w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/hi-follow/20240917-012132.png\" alt=\"认证\"\n         width=\"512\" height=\"290\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n","date_published":"2024-09-17T00:53:38+08:00","tags":["follow"]},{"title":"中秋爬山","id":"https://liudon.com/posts/mid-autumn-festival-climb/","url":"https://liudon.com/posts/mid-autumn-festival-climb/","summary":"\u003cp\u003e中秋第一天，娃约了同学在公园玩，骑车、滑轮滑，晚上娃带我去了她说非常好吃的一家店吃饭。\u003c/p\u003e\n\u003cp\u003e晚上回来，想着第二天在家呆一天也是看电视，打算带她爬长城，查了一下，往返的票早已售罄，只好放弃这个方案。\u003c/p\u003e","content_html":"\u003cp\u003e中秋第一天，娃约了同学在公园玩，骑车、滑轮滑，晚上娃带我去了她说非常好吃的一家店吃饭。\u003c/p\u003e\n\u003cp\u003e晚上回来，想着第二天在家呆一天也是看电视，打算带她爬长城，查了一下，往返的票早已售罄，只好放弃这个方案。\u003c/p\u003e\n\u003cp\u003e园博园开了灯会，微博上看说是人巨多，还是放弃吧。\u003c/p\u003e\n\u003cp\u003e跟娃商量了一下，最后我们决定还是爬山，再刷一次百望山。\u003c/p\u003e\n\u003cp\u003e第二天一早睡到9点，起床洗漱，吃早饭，收拾东西，出门的时候都已经10点半了。\u003c/p\u003e\n\u003cp\u003e还好不远，山也不高，我们也不着急，就当遛弯。\u003c/p\u003e\n\u003cp\u003e来了好几次了，进园就直奔主题：爬。\u003c/p\u003e\n\u003cp\u003e这次我俩先走了一段山路，虽然是台阶，但是确实快。\u003c/p\u003e\n\u003cp\u003e昨天玩的太累，我们商量着还是继续走坡道吧。\u003c/p\u003e\n\u003cp\u003e花了40分钟左右登顶，最快的一次记录了。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG19.jpg_320x.avif 320w, https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG19.jpg_480x.avif 480w, https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG19.jpg_720x.avif 720w, https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG19.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG19.jpg_320x.webp 320w, https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG19.jpg_480x.webp 480w, https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG19.jpg_720x.webp 720w, https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG19.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/mid-autumn-festival-climb/WechatIMG19.jpg\" alt=\"登顶\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e爬到山顶，找了个阴凉，补充能量，娃请我吃雪糕。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG20.jpg_320x.avif 320w, https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG20.jpg_480x.avif 480w, https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG20.jpg_720x.avif 720w, https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG20.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG20.jpg_320x.webp 320w, https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG20.jpg_480x.webp 480w, https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG20.jpg_720x.webp 720w, https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG20.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/mid-autumn-festival-climb/WechatIMG20.jpg\" alt=\"小憩\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e今天天气一般，能见度不高，远处都是灰蒙蒙的。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG21.jpg_320x.avif 320w, https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG21.jpg_480x.avif 480w, https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG21.jpg_720x.avif 720w, https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG21.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG21.jpg_320x.webp 320w, https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG21.jpg_480x.webp 480w, https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG21.jpg_720x.webp 720w, https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG21.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/mid-autumn-festival-climb/WechatIMG21.jpg\" alt=\"\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e歇到1点多，我俩开始下山。\u003c/p\u003e\n\u003cp\u003e之前在微博看到陈晓卿分享的一家新疆馆子\u003ca href=\"https://weibo.com/1647375747/OshW9uUIS\"\u003e白钻美食\u003c/a\u003e，决定晚上带娃去尝尝。\u003c/p\u003e\n\u003cp\u003e坐了1个半小时的地铁，到了吕营大街。\u003c/p\u003e\n\u003cp\u003e高德导航说是十里河K2出口出站，这个口确实离的近，但是出站需要爬超级长的楼梯。\u003c/p\u003e\n\u003cp\u003e我俩傻乎乎的爬楼上来，累个够呛。\u003c/p\u003e\n\u003cp\u003e建议选择K1出站口，电梯出站，上来跟K2出口挨着，没有多远。\u003c/p\u003e\n\u003cp\u003e4点多到店，一开始还担心不到饭点有没有饭，进门一看已经有几桌在吃饭的了。\u003c/p\u003e\n\u003cp\u003e馆子里吃饭的维族人不少，看来确实是本地特色，吃完饭娃还问我是不是外国人。😂\u003c/p\u003e\n\u003cp\u003e不知道份量，先点了羊腿抓饭和羊肉串，娃说好吃，推荐的烤包子已经没有了。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG22.jpg_320x.avif 320w, https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG22.jpg_480x.avif 480w, https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG22.jpg_720x.avif 720w, https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG22.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG22.jpg_320x.webp 320w, https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG22.jpg_480x.webp 480w, https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG22.jpg_720x.webp 720w, https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG22.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/mid-autumn-festival-climb/WechatIMG22.jpg\" alt=\"羊腿抓饭\"\n         width=\"1080\" height=\"809\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG23.jpg_320x.avif 320w, https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG23.jpg_480x.avif 480w, https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG23.jpg_720x.avif 720w, https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG23.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG23.jpg_320x.webp 320w, https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG23.jpg_480x.webp 480w, https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG23.jpg_720x.webp 720w, https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG23.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/mid-autumn-festival-climb/WechatIMG23.jpg\" alt=\"羊肉串\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e然后又点了一份过油拌面，面条非常劲道，味道非常棒。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG24.jpg_320x.avif 320w, https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG24.jpg_480x.avif 480w, https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG24.jpg_720x.avif 720w, https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG24.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG24.jpg_320x.webp 320w, https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG24.jpg_480x.webp 480w, https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG24.jpg_720x.webp 720w, https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG24.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/mid-autumn-festival-climb/WechatIMG24.jpg\" alt=\"过油拌面\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e喝了据说是本地的茶，查了一下，说是叫“砖茶”，免费的。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG25.jpg_320x.avif 320w, https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG25.jpg_480x.avif 480w, https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG25.jpg_720x.avif 720w, https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG25.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG25.jpg_320x.webp 320w, https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG25.jpg_480x.webp 480w, https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG25.jpg_720x.webp 720w, https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG25.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/mid-autumn-festival-climb/WechatIMG25.jpg\" alt=\"砖茶\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e店不大，但是味道挺好，推荐去试试，就是有点远。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG26.jpg_320x.avif 320w, https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG26.jpg_480x.avif 480w, https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG26.jpg_720x.avif 720w, https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG26.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG26.jpg_320x.webp 320w, https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG26.jpg_480x.webp 480w, https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG26.jpg_720x.webp 720w, https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG26.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/mid-autumn-festival-climb/WechatIMG26.jpg\" alt=\"白钻美食\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e吃完地铁回家，等公交的时候错过了一趟车，还多等了半个小时。\u003c/p\u003e\n\u003cp\u003e今天是暴走的一天。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG27.jpg_320x.avif 320w, https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG27.jpg_480x.avif 480w, https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG27.jpg_720x.avif 720w, https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG27.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG27.jpg_320x.webp 320w, https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG27.jpg_480x.webp 480w, https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG27.jpg_720x.webp 720w, https://liudon.com/posts/mid-autumn-festival-climb/WechatIMG27.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/mid-autumn-festival-climb/WechatIMG27.jpg\" alt=\"健身记录\"\n         width=\"1080\" height=\"2341\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n","date_published":"2024-09-16T23:56:16+08:00","tags":["爬山","遛娃"]},{"title":"Google Adsense的审核之旅","id":"https://liudon.com/posts/my-google-adsense-approval-journey/","url":"https://liudon.com/posts/my-google-adsense-approval-journey/","summary":"\u003cp\u003e中午的时候，突然收到一条消息，打开一看，提示我的\u003ccode\u003eGoogle Adsense\u003c/code\u003e审核通过了。\u003c/p\u003e\n\u003cp\u003e偶然发现\u003ccode\u003eGoogle Adsense\u003c/code\u003e里居然有40美金，想起来是之前\u003ca href=\"https://liudon.org\"\u003e老博客\u003c/a\u003e加的广告。\u003c/p\u003e","content_html":"\u003cp\u003e中午的时候，突然收到一条消息，打开一看，提示我的\u003ccode\u003eGoogle Adsense\u003c/code\u003e审核通过了。\u003c/p\u003e\n\u003cp\u003e偶然发现\u003ccode\u003eGoogle Adsense\u003c/code\u003e里居然有40美金，想起来是之前\u003ca href=\"https://liudon.org\"\u003e老博客\u003c/a\u003e加的广告。\u003c/p\u003e\n\u003cp\u003e看着\u003ca href=\"https://liudon.com\"\u003e新博客\u003c/a\u003e每天也有了一些访问，打算申请\u003ccode\u003eGoogle Adsense\u003c/code\u003e，补充些维护成本。\u003c/p\u003e\n\u003cp\u003e按之前的流程搞了一遍，提交了申请。\u003c/p\u003e\n\u003cp\u003e结果过了1周多，收到审核不通过邮件，说是不符合规范：低质内容，质量不高。\u003c/p\u003e\n\u003cp\u003e搜了一下，说是现在新网站审核门槛高了。\u003c/p\u003e\n\u003cp\u003e不放弃，继续申请呗。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/my-google-adsense-approval-journey/20240916-233753.png_320x.avif 320w, https://liudon.com/posts/my-google-adsense-approval-journey/20240916-233753.png_480x.avif 480w, https://liudon.com/posts/my-google-adsense-approval-journey/20240916-233753.png_720x.avif 720w, https://liudon.com/posts/my-google-adsense-approval-journey/20240916-233753.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/my-google-adsense-approval-journey/20240916-233753.png_320x.webp 320w, https://liudon.com/posts/my-google-adsense-approval-journey/20240916-233753.png_480x.webp 480w, https://liudon.com/posts/my-google-adsense-approval-journey/20240916-233753.png_720x.webp 720w, https://liudon.com/posts/my-google-adsense-approval-journey/20240916-233753.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/my-google-adsense-approval-journey/20240916-233753.png\" alt=\"approval google adsense\"\n         width=\"1080\" height=\"348\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e从3月份开始，申请了7次，全部被拒。\u003c/p\u003e\n\u003cp\u003e尤其是8月25日被拒后，提示我审核次数过多，必须得等到8月31日以后才能再次申请。\u003c/p\u003e\n\u003cp\u003e上社区发了\u003ca href=\"https://support.google.com/adsense/thread/292831058/%E7%BD%91%E7%AB%99%E5%AE%A1%E6%A0%B8%E4%B8%8D%E9%80%9A%E8%BF%87%EF%BC%8C%E5%B8%AE%E7%9C%8B%E4%B8%8B%E5%8E%9F%E5%9B%A0?hl=zh-Hans\u0026amp;sjid=5393313994536777596-AP\"\u003e帖子\u003c/a\u003e，咨询到底是什么原因，结果也没收到答复。\u003c/p\u003e\n\u003cp\u003e这个时候，就已经有点心灰意冷，想要放弃了。\u003c/p\u003e\n\u003cp\u003e9月5日的时候，想着再最后申请一把试试看，再不通过就算了。\u003c/p\u003e\n\u003cp\u003e等了1周多，感觉这次估计又悬了，已经放弃了，结果今天竟然审核通过了。\u003c/p\u003e\n\u003cp\u003e历经了8次申请，耗时半年，终于申请下来了，算是这段时间难得的一件好事。\u003c/p\u003e\n","date_published":"2024-09-16T23:18:50+08:00","tags":["google adsense"]},{"title":"让你的IPFS站点持久在线：接入Filebase的Names(IPNS)服务","id":"https://liudon.com/posts/keep-your-ipfs-site-online-with-filebase-ipns/","url":"https://liudon.com/posts/keep-your-ipfs-site-online-with-filebase-ipns/","summary":"\u003cp\u003e本文会介绍如何接入\u003ccode\u003efilebase\u003c/code\u003e的Names(IPNS)服务，使你的\u003ccode\u003eIPFS\u003c/code\u003e站点持久在线。\u003c/p\u003e\n\u003ch4 id=\"背景\"\u003e背景\u003c/h4\u003e\n\u003cp\u003e周末更新博客时，发现workflow的上传IPFS任务执行失败了。\u003c/p\u003e","content_html":"\u003cp\u003e本文会介绍如何接入\u003ccode\u003efilebase\u003c/code\u003e的Names(IPNS)服务，使你的\u003ccode\u003eIPFS\u003c/code\u003e站点持久在线。\u003c/p\u003e\n\u003ch4 id=\"背景\"\u003e背景\u003c/h4\u003e\n\u003cp\u003e周末更新博客时，发现workflow的上传IPFS任务执行失败了。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eRun aquiladev/ipfs-action@master\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eError: RequestInit: duplex option is required when sending a body.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003enode:internal/deps/undici/undici:12502\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      Error.captureStackTrace(err, this);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            ^\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eTypeError: RequestInit: duplex option is required when sending a body.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    at node:internal/deps/undici/undici:12502:13\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eNode.js v20.13.1\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e查了一下，应该是\u003ccode\u003eGithub\u003c/code\u003e更新了NodeJS版本导致的。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eThe following actions use a deprecated Node.js version and will be forced to run on node20: actions/checkout@v2, peaceiris/actions-hugo@v2, peaceiris/actions-gh-pages@v3, aquiladev/ipfs-action@master. For more info: https://github.blog/changelog/2024-03-07-github-actions-all-actions-will-run-on-node20-instead-of-node16-by-default/\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e研究了一下，问题在于\u003ca href=\"https://github.com/ipfs/js-ipfs\"\u003ejs-ipfs\u003c/a\u003e包的\u003ccode\u003efetch\u003c/code\u003e方法没有传\u003ccode\u003eduplex\u003c/code\u003e参数导致。\u003c/p\u003e\n\u003cp\u003e看\u003ccode\u003eGithub\u003c/code\u003e文档，官方已经不再更新了。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eDEPRECATED: js-IPFS has been superseded by Helia\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e搜索一番，发现了两个包\u003ca href=\"https://github.com/ipfs/helia\"\u003ehelia\u003c/a\u003e和\u003ca href=\"https://github.com/ipfs/js-kubo-rpc-client\"\u003ejs-kubo-rpc-client\u003c/a\u003e。\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003ehelia\u003c/code\u003e调用方法有\u003ca href=\"https://github.com/ipfs/helia/wiki/Migrating-from-js-IPFS\"\u003e变化\u003c/a\u003e，\u003ccode\u003ejs-kubo-rpc-client\u003c/code\u003e和原来的\u003ccode\u003ejs-ipfs\u003c/code\u003e使用一致。\u003c/p\u003e\n\u003cp\u003e捣鼓了一番，没调通，不懂前端的锅，只能放弃，顺便给作者提了个\u003ca href=\"https://github.com/aquiladev/ipfs-action/issues/78\"\u003eissue\u003c/a\u003e，还是作者来适配吧。\u003c/p\u003e\n\u003cp\u003e隔天看的时候，在\u003ca href=\"https://github.com/aquiladev/ipfs-action/pulls\"\u003ePull requests\u003c/a\u003e里发现已经有升级后的提交了。\u003c/p\u003e\n\u003cp\u003e哈哈，原来\u003ccode\u003efilebase\u003c/code\u003e官方早就升级适配了，\u003ca href=\"https://github.com/filebase/ipfs-action/tree/master\"\u003efilebase/ipfs-action\u003c/a\u003e，顺带发现居然还支持了\u003ccode\u003eIPNS\u003c/code\u003e更新，太完美了！！！\u003c/p\u003e\n\u003ch4 id=\"折腾记录\"\u003e折腾记录\u003c/h4\u003e\n\u003cp\u003e关于\u003ccode\u003eIPNS\u003c/code\u003e的作用，可以参考zu1k大佬的\u003ca href=\"https://zu1k.com/posts/tutorials/p2p/ipfs/\"\u003eIPFS 新手指北\u003c/a\u003e。\u003c/p\u003e\n\u003cp\u003e关于\u003ccode\u003eIPFS\u003c/code\u003e的部署，可以参考我的\u003ca href=\"https://liudon.com/posts/deploy-blog-to-ipfs/\"\u003e将博客部署到星际文件系统(IPFS)\u003c/a\u003e。\u003c/p\u003e\n\u003ch5 id=\"生成密钥\"\u003e生成密钥\u003c/h5\u003e\n\u003cp\u003e因为我在云主机上部署了\u003ccode\u003eipfs\u003c/code\u003e服务，已经有在更新\u003ccode\u003eIPNS\u003c/code\u003e。\u003c/p\u003e\n\u003cp\u003e这里引入\u003ccode\u003efilebase\u003c/code\u003e后，相当于多个节点来更新，需要保证\u003ccode\u003eIPNS\u003c/code\u003e地址上一致的。\u003c/p\u003e\n\u003cp\u003e所以需要将云主机的密钥导出后，导入到\u003ccode\u003efilebase\u003c/code\u003e。\u003c/p\u003e\n\u003cp\u003e之前使用的是\u003ccode\u003eipfs\u003c/code\u003e默认密钥，这个是无法导出的，所以只能重新生成一个密钥,\n\u003ccode\u003eipfs-action\u003c/code\u003e为密钥名字，改成你自己的：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eipfs key gen ipfs-action\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026gt; k51qzi5uqu5dh5kbbff1ucw3ksphpy3vxx4en4dbtfh90pvw4mzd8nfm5r5fnl\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cstrong\u003e注意：\u003c/strong\u003e\u003ccode\u003efilebase\u003c/code\u003e还不支持\u003ccode\u003etype/size\u003c/code\u003e参数，这里必须使用默认方式创建，否则在\u003ccode\u003efilebase\u003c/code\u003e导入已有密钥会报错。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/keep-your-ipfs-site-online-with-filebase-ipns/20240904-214210.png_320x.avif 320w, https://liudon.com/posts/keep-your-ipfs-site-online-with-filebase-ipns/20240904-214210.png_480x.avif 480w, https://liudon.com/posts/keep-your-ipfs-site-online-with-filebase-ipns/20240904-214210.png_720x.avif 720w, https://liudon.com/posts/keep-your-ipfs-site-online-with-filebase-ipns/20240904-214210.png_800x.avif 800w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/keep-your-ipfs-site-online-with-filebase-ipns/20240904-214210.png_320x.webp 320w, https://liudon.com/posts/keep-your-ipfs-site-online-with-filebase-ipns/20240904-214210.png_480x.webp 480w, https://liudon.com/posts/keep-your-ipfs-site-online-with-filebase-ipns/20240904-214210.png_720x.webp 720w, https://liudon.com/posts/keep-your-ipfs-site-online-with-filebase-ipns/20240904-214210.png_800x.webp 800w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/keep-your-ipfs-site-online-with-filebase-ipns/20240904-214210.png\" alt=\"chat\"\n         width=\"800\" height=\"990\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e查看已有密钥：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eipfs key list -l\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026gt; k51qzi5uqu5djx9olgjcibdiurrr09w75v6rdfx0cvwye295k787sssssf0d9d self        \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026gt; k51qzi5uqu5dktnw0vc8j9ci42e8gk741ici7ofpv40mo4f6e1ossssnc7uwg ipfs-action\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e导出密钥：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eipfs\u003c/span\u003e \u003cspan class=\"n\"\u003ekey\u003c/span\u003e \u003cspan class=\"k\"\u003eexport\u003c/span\u003e \u003cspan class=\"n\"\u003eipfs\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eaction\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e执行后，当前目录下会生成一个\u003ccode\u003eipfs-action.key\u003c/code\u003e文件，内容为二进制。\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003efilebase\u003c/code\u003e导入key要求为base64编码，将其转为base64编码：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecat ipfs-action.key | base64\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026gt; 5oiR5piv5rWL6K+V\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e记住这里的base64内容，下面会用到。\u003c/p\u003e\n\u003ch5 id=\"创建name\"\u003e创建NAME\u003c/h5\u003e\n\u003cp\u003e进入\u003ca href=\"https://console.filebase.com/names\"\u003efilebase控制台\u003c/a\u003e，点击\u003ccode\u003eCreate Name\u003c/code\u003e。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/keep-your-ipfs-site-online-with-filebase-ipns/20240904-214908.png_320x.avif 320w, https://liudon.com/posts/keep-your-ipfs-site-online-with-filebase-ipns/20240904-214908.png_480x.avif 480w, https://liudon.com/posts/keep-your-ipfs-site-online-with-filebase-ipns/20240904-214908.png_720x.avif 720w, https://liudon.com/posts/keep-your-ipfs-site-online-with-filebase-ipns/20240904-214908.png_940x.avif 940w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/keep-your-ipfs-site-online-with-filebase-ipns/20240904-214908.png_320x.webp 320w, https://liudon.com/posts/keep-your-ipfs-site-online-with-filebase-ipns/20240904-214908.png_480x.webp 480w, https://liudon.com/posts/keep-your-ipfs-site-online-with-filebase-ipns/20240904-214908.png_720x.webp 720w, https://liudon.com/posts/keep-your-ipfs-site-online-with-filebase-ipns/20240904-214908.png_940x.webp 940w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/keep-your-ipfs-site-online-with-filebase-ipns/20240904-214908.png\" alt=\"input\"\n         width=\"940\" height=\"1348\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eLabel: 备注，可以随便填\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCID: 填入IPFS的cid地址\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eName Network: 固定选IPNS\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eEnabled：固定选Yes\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eImport Existing Private Key (Optional)：填入第一步的base64内容\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e确定提交。\u003c/p\u003e\n\u003ch5 id=\"修改workflow\"\u003e修改workflow\u003c/h5\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eIPFS\u003c/span\u003e \u003cspan class=\"n\"\u003eupload\u003c/span\u003e \u003cspan class=\"n\"\u003eto\u003c/span\u003e \u003cspan class=\"n\"\u003efilebase\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003efilebase\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eipfs\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eaction\u003c/span\u003e\u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003emaster\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003epath\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"o\"\u003e./\u003c/span\u003e\u003cspan class=\"n\"\u003epublic\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eservice\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003efilebase\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003epinName\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eipfs\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eaction\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003efilebaseBucket\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"n\"\u003esecrets\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eFILEBASE_BUCKET\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003efilebaseKey\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"n\"\u003esecrets\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eFILEBASE_KEY\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003efilebaseSecret\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"n\"\u003esecrets\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eFILEBASE_SECRET\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003ekey\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eipfs\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eaction\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e新增\u003ccode\u003ekey\u003c/code\u003e参数，值为第二步\u003ccode\u003eLabel\u003c/code\u003e填入的内容。\u003c/p\u003e\n\u003cp\u003e提交后，执行workflow，在执行结果里找到\u003ccode\u003eIPNS\u003c/code\u003e地址。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eRun\u003c/span\u003e \u003cspan class=\"n\"\u003efilebase\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eipfs\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eaction\u003c/span\u003e\u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003emaster\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eParsing\u003c/span\u003e \u003cspan class=\"n\"\u003eoptions\u003c/span\u003e\u003cspan class=\"o\"\u003e...\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eParsed\u003c/span\u003e \u003cspan class=\"n\"\u003eOptions\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;path\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/home/runner/work/***.github.io/***.github.io/public\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;service\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;filebase\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;host\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;ipfs.io\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;port\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;5001\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;protocol\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;https\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;headers\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:{},\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;key\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;ipfs-action\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;pinName\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;ipfs-action\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;pinataKey\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;pinataSecret\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;pinataPinName\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;filebaseBucket\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;***\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;filebaseKey\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;***\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;filebaseSecret\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;***\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;infuraProjectId\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;infuraProjectSecret\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;timeout\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;60000\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;verbose\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"bp\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;pattern\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;public/**/*\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eAdding\u003c/span\u003e \u003cspan class=\"n\"\u003efiles\u003c/span\u003e\u003cspan class=\"o\"\u003e...\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eStarting\u003c/span\u003e \u003cspan class=\"n\"\u003efilebase\u003c/span\u003e \u003cspan class=\"n\"\u003eclient\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eStarted\u003c/span\u003e \u003cspan class=\"n\"\u003efilebase\u003c/span\u003e \u003cspan class=\"n\"\u003eclient\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eStoring\u003c/span\u003e \u003cspan class=\"n\"\u003efiles\u003c/span\u003e\u003cspan class=\"o\"\u003e...\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eStored\u003c/span\u003e \u003cspan class=\"n\"\u003efiles\u003c/span\u003e\u003cspan class=\"o\"\u003e...\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eCID\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003ebafybeihagzsdupyrecky7bnstzckgf5flxbrdz542jmfaep4xtbj6aa2ea\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eUpdating\u003c/span\u003e \u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"o\"\u003e...\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eUpdated\u003c/span\u003e \u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"o\"\u003e...\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eDone\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eUpload\u003c/span\u003e \u003cspan class=\"n\"\u003eto\u003c/span\u003e \u003cspan class=\"n\"\u003eIPFS\u003c/span\u003e \u003cspan class=\"n\"\u003efinished\u003c/span\u003e \u003cspan class=\"n\"\u003esuccessfully\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"n\"\u003ecid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;bafybeihagzsdupyrecky7bnstzckgf5flxbrdz542jmfaep4xtbj6aa2ea\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"n\"\u003eipfs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;bafybeihagzsdupyrecky7bnstzckgf5flxbrdz542jmfaep4xtbj6aa2ea\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"n\"\u003eipns\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;k51qzi5uqu5dktnw0vc8j9ci42e8gk741ici7ofpv40mo4f6e1ovj1isnc7uwg\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch5 id=\"更新dnslink\"\u003e更新DNSlink\u003c/h5\u003e\n\u003cp\u003e更新域名的dnslink值：\u003c/p\u003e\n\u003cp\u003e普通域名\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/keep-your-ipfs-site-online-with-filebase-ipns/20240904-215553.png_320x.avif 320w, https://liudon.com/posts/keep-your-ipfs-site-online-with-filebase-ipns/20240904-215553.png_480x.avif 480w, https://liudon.com/posts/keep-your-ipfs-site-online-with-filebase-ipns/20240904-215553.png_720x.avif 720w, https://liudon.com/posts/keep-your-ipfs-site-online-with-filebase-ipns/20240904-215553.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/keep-your-ipfs-site-online-with-filebase-ipns/20240904-215553.png_320x.webp 320w, https://liudon.com/posts/keep-your-ipfs-site-online-with-filebase-ipns/20240904-215553.png_480x.webp 480w, https://liudon.com/posts/keep-your-ipfs-site-online-with-filebase-ipns/20240904-215553.png_720x.webp 720w, https://liudon.com/posts/keep-your-ipfs-site-online-with-filebase-ipns/20240904-215553.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/keep-your-ipfs-site-online-with-filebase-ipns/20240904-215553.png\" alt=\"dns\"\n         width=\"1080\" height=\"246\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003eeth域名\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/keep-your-ipfs-site-online-with-filebase-ipns/WechatIMG16.jpg_320x.avif 320w, https://liudon.com/posts/keep-your-ipfs-site-online-with-filebase-ipns/WechatIMG16.jpg_480x.avif 480w, https://liudon.com/posts/keep-your-ipfs-site-online-with-filebase-ipns/WechatIMG16.jpg_720x.avif 720w, https://liudon.com/posts/keep-your-ipfs-site-online-with-filebase-ipns/WechatIMG16.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/keep-your-ipfs-site-online-with-filebase-ipns/WechatIMG16.jpg_320x.webp 320w, https://liudon.com/posts/keep-your-ipfs-site-online-with-filebase-ipns/WechatIMG16.jpg_480x.webp 480w, https://liudon.com/posts/keep-your-ipfs-site-online-with-filebase-ipns/WechatIMG16.jpg_720x.webp 720w, https://liudon.com/posts/keep-your-ipfs-site-online-with-filebase-ipns/WechatIMG16.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/keep-your-ipfs-site-online-with-filebase-ipns/WechatIMG16.jpg\" alt=\"eth\"\n         width=\"1080\" height=\"2341\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e第一次和外国人在线沟通，时差原因搞了两天才把\u003ccode\u003efilebase\u003c/code\u003e导入报错的问题解决。 😂😂😂\u003c/p\u003e\n\u003cp\u003e另外吐槽一下\u003ccode\u003efilebase\u003c/code\u003e服务，sdk已经有相关实现了，文档都还没更新。\u003c/p\u003e\n","date_published":"2024-09-04T22:39:37+08:00","tags":["ipfs","filebase","github"]},{"title":"一次简短的青岛之行","id":"https://liudon.com/posts/the-trip-of-qingdao/","url":"https://liudon.com/posts/the-trip-of-qingdao/","summary":"\u003cp\u003e刚放暑假的时候，就答应了娃带她去一趟青岛。\u003c/p\u003e\n\u003cp\u003e8月份要回老家，所以定在了7月中下旬出发。\u003c/p\u003e\n\u003cp\u003e车票/酒店都订好了，结果来了个台风格美。\u003c/p\u003e\n\u003cp\u003e出发前一周一直在查天气，就怕去了一直下雨。\u003c/p\u003e","content_html":"\u003cp\u003e刚放暑假的时候，就答应了娃带她去一趟青岛。\u003c/p\u003e\n\u003cp\u003e8月份要回老家，所以定在了7月中下旬出发。\u003c/p\u003e\n\u003cp\u003e车票/酒店都订好了，结果来了个台风格美。\u003c/p\u003e\n\u003cp\u003e出发前一周一直在查天气，就怕去了一直下雨。\u003c/p\u003e\n\u003cp\u003e看了台风的预测路径，感觉可能能赶在台风来之前的空档，硬着头皮出发吧。\u003c/p\u003e\n\u003cp\u003e7月26日乘坐高铁G203，中午12点左右到达青岛。\u003c/p\u003e\n\u003cp\u003e老天很给面子，是个晴天，还有点晒。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-trip-of-qingdao/route.png_320x.avif 320w, https://liudon.com/posts/the-trip-of-qingdao/route.png_480x.avif 480w, https://liudon.com/posts/the-trip-of-qingdao/route.png_720x.avif 720w, https://liudon.com/posts/the-trip-of-qingdao/route.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-trip-of-qingdao/route.png_320x.webp 320w, https://liudon.com/posts/the-trip-of-qingdao/route.png_480x.webp 480w, https://liudon.com/posts/the-trip-of-qingdao/route.png_720x.webp 720w, https://liudon.com/posts/the-trip-of-qingdao/route.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-trip-of-qingdao/route.png\" alt=\"出行计划\"\n         width=\"1080\" height=\"543\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e本来的计划路线：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e第一天：\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e中午到达青岛 -\u0026gt; 天主教堂 -\u0026gt; 栈桥 -\u0026gt; 八大关 -\u0026gt; 第二海水浴场\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e第二天：\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e海底世界/极地海洋馆 -\u0026gt; 石老人海水浴场 -\u0026gt; 五四广场/奥帆中心夜景\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e第三天：\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e酒店休息返京\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e按这个路线，定了两个酒店，一个在栈桥附近，一个在海洋馆附近。\u003c/p\u003e\n\u003cp\u003e到了青岛后，先去酒店放行李，然后打车去吃饭。\u003c/p\u003e\n\u003cp\u003e青岛的第一顿饭，我们选了吃海鲜，事前查了些攻略，选择了栈桥附近的燕欣饭馆。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-trip-of-qingdao/yanxin.png_320x.avif 320w, https://liudon.com/posts/the-trip-of-qingdao/yanxin.png_480x.avif 480w, https://liudon.com/posts/the-trip-of-qingdao/yanxin.png_720x.avif 720w, https://liudon.com/posts/the-trip-of-qingdao/yanxin.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-trip-of-qingdao/yanxin.png_320x.webp 320w, https://liudon.com/posts/the-trip-of-qingdao/yanxin.png_480x.webp 480w, https://liudon.com/posts/the-trip-of-qingdao/yanxin.png_720x.webp 720w, https://liudon.com/posts/the-trip-of-qingdao/yanxin.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-trip-of-qingdao/yanxin.png\" alt=\"燕欣饭馆\"\n         width=\"1080\" height=\"1441\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e中午很饿，上来就吃，忘记拍照了，只有吃完后的照片了。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-trip-of-qingdao/chiwan.png_320x.avif 320w, https://liudon.com/posts/the-trip-of-qingdao/chiwan.png_480x.avif 480w, https://liudon.com/posts/the-trip-of-qingdao/chiwan.png_720x.avif 720w, https://liudon.com/posts/the-trip-of-qingdao/chiwan.png_960x.avif 960w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-trip-of-qingdao/chiwan.png_320x.webp 320w, https://liudon.com/posts/the-trip-of-qingdao/chiwan.png_480x.webp 480w, https://liudon.com/posts/the-trip-of-qingdao/chiwan.png_720x.webp 720w, https://liudon.com/posts/the-trip-of-qingdao/chiwan.png_960x.webp 960w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-trip-of-qingdao/chiwan.png\" alt=\"一扫而光\"\n         width=\"960\" height=\"720\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e油焖大虾相当不错，海肠捞饭非常好吃，韭菜很鲜。\u003c/p\u003e\n\u003cp\u003e3个人，一共花了240元，非常推荐的一家店。\u003c/p\u003e\n\u003cp\u003e吃完饭，溜达到天主教堂打卡。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-trip-of-qingdao/jiaotang.png_320x.avif 320w, https://liudon.com/posts/the-trip-of-qingdao/jiaotang.png_480x.avif 480w, https://liudon.com/posts/the-trip-of-qingdao/jiaotang.png_720x.avif 720w, https://liudon.com/posts/the-trip-of-qingdao/jiaotang.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-trip-of-qingdao/jiaotang.png_320x.webp 320w, https://liudon.com/posts/the-trip-of-qingdao/jiaotang.png_480x.webp 480w, https://liudon.com/posts/the-trip-of-qingdao/jiaotang.png_720x.webp 720w, https://liudon.com/posts/the-trip-of-qingdao/jiaotang.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-trip-of-qingdao/jiaotang.png\" alt=\"天主教堂\"\n         width=\"1080\" height=\"1441\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e然后是栈桥，人非常多，中午非常晒。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-trip-of-qingdao/zhanqiao.png_320x.avif 320w, https://liudon.com/posts/the-trip-of-qingdao/zhanqiao.png_480x.avif 480w, https://liudon.com/posts/the-trip-of-qingdao/zhanqiao.png_720x.avif 720w, https://liudon.com/posts/the-trip-of-qingdao/zhanqiao.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-trip-of-qingdao/zhanqiao.png_320x.webp 320w, https://liudon.com/posts/the-trip-of-qingdao/zhanqiao.png_480x.webp 480w, https://liudon.com/posts/the-trip-of-qingdao/zhanqiao.png_720x.webp 720w, https://liudon.com/posts/the-trip-of-qingdao/zhanqiao.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-trip-of-qingdao/zhanqiao.png\" alt=\"栈桥\"\n         width=\"1080\" height=\"1441\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e于是回酒店稍作休息，决定打车直奔第二海水浴场玩水。\u003c/p\u003e\n\u003cp\u003e踩水的感觉太好玩了，娃从一开始的有点害怕，到后面追着水玩。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-trip-of-qingdao/caishui.png_320x.avif 320w, https://liudon.com/posts/the-trip-of-qingdao/caishui.png_480x.avif 480w, https://liudon.com/posts/the-trip-of-qingdao/caishui.png_720x.avif 720w, https://liudon.com/posts/the-trip-of-qingdao/caishui.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-trip-of-qingdao/caishui.png_320x.webp 320w, https://liudon.com/posts/the-trip-of-qingdao/caishui.png_480x.webp 480w, https://liudon.com/posts/the-trip-of-qingdao/caishui.png_720x.webp 720w, https://liudon.com/posts/the-trip-of-qingdao/caishui.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-trip-of-qingdao/caishui.png\" alt=\"踩水\"\n         width=\"1080\" height=\"1441\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e玩完打车去的美团推荐的双合园，地方很小，需要等位。\u003c/p\u003e\n\u003cp\u003e吃下来，感觉不如第一顿好吃，菜品一般，不太推荐。\u003c/p\u003e\n\u003cp\u003e吃完已经9点了，错过了夜景时间，直接回酒店休息了。\u003c/p\u003e\n\u003cp\u003e第二天起床，发现外面下雨了，风很大，最终没逃过台风的影响。\u003c/p\u003e\n\u003cp\u003e昨天路过海洋馆，看了外面排队的人巨多，决定不去室内这种海洋馆了。\u003c/p\u003e\n\u003cp\u003e先去了银鱼巷溜达一圈，没啥看的，中午在1907青岛老味道吃的午饭，非常不推荐的一家店。\u003c/p\u003e\n\u003cp\u003e吃完饭打车到奥帆中心，想着坐船玩一圈，到了发现因为风大停运了。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-trip-of-qingdao/wusiguangchang.png_320x.avif 320w, https://liudon.com/posts/the-trip-of-qingdao/wusiguangchang.png_480x.avif 480w, https://liudon.com/posts/the-trip-of-qingdao/wusiguangchang.png_720x.avif 720w, https://liudon.com/posts/the-trip-of-qingdao/wusiguangchang.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-trip-of-qingdao/wusiguangchang.png_320x.webp 320w, https://liudon.com/posts/the-trip-of-qingdao/wusiguangchang.png_480x.webp 480w, https://liudon.com/posts/the-trip-of-qingdao/wusiguangchang.png_720x.webp 720w, https://liudon.com/posts/the-trip-of-qingdao/wusiguangchang.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-trip-of-qingdao/wusiguangchang.png\" alt=\"五四广场打卡\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e打卡完，直奔第三海水浴场玩水。\u003c/p\u003e\n\u003cp\u003e到了发现因为风大不让下水了，只能在沙滩上玩沙子了。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-trip-of-qingdao/disanhaishuiyuchang.png_320x.avif 320w, https://liudon.com/posts/the-trip-of-qingdao/disanhaishuiyuchang.png_480x.avif 480w, https://liudon.com/posts/the-trip-of-qingdao/disanhaishuiyuchang.png_720x.avif 720w, https://liudon.com/posts/the-trip-of-qingdao/disanhaishuiyuchang.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-trip-of-qingdao/disanhaishuiyuchang.png_320x.webp 320w, https://liudon.com/posts/the-trip-of-qingdao/disanhaishuiyuchang.png_480x.webp 480w, https://liudon.com/posts/the-trip-of-qingdao/disanhaishuiyuchang.png_720x.webp 720w, https://liudon.com/posts/the-trip-of-qingdao/disanhaishuiyuchang.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-trip-of-qingdao/disanhaishuiyuchang.png\" alt=\"第三海水浴场\"\n         width=\"1080\" height=\"1441\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e和娃一起抓了几只小螃蟹，虽然天气不好，娃玩的还是很开心。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-trip-of-qingdao/pangxie.png_320x.avif 320w, https://liudon.com/posts/the-trip-of-qingdao/pangxie.png_480x.avif 480w, https://liudon.com/posts/the-trip-of-qingdao/pangxie.png_720x.avif 720w, https://liudon.com/posts/the-trip-of-qingdao/pangxie.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-trip-of-qingdao/pangxie.png_320x.webp 320w, https://liudon.com/posts/the-trip-of-qingdao/pangxie.png_480x.webp 480w, https://liudon.com/posts/the-trip-of-qingdao/pangxie.png_720x.webp 720w, https://liudon.com/posts/the-trip-of-qingdao/pangxie.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-trip-of-qingdao/pangxie.png\" alt=\"赶海\"\n         width=\"1080\" height=\"1441\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e实在不想吃海鲜了，晚饭在酒店附近吃了个米村拌饭，发现旁边有家类似北京的老年厨房，非常便宜，菜品也不错，第二天早晨在这里解决了。\u003c/p\u003e\n\u003cp\u003e天气不好，晚上在酒店看电视了，点了个麦当劳夜宵，结果娃没吃多少，全我吃了，给我撑的。\u003c/p\u003e\n\u003cp\u003e第三天天晴了，但是风还是大。\u003c/p\u003e\n\u003cp\u003e决定到第二海水浴场看看运气，到了之后还是不让下水，在沙滩上玩了会沙子。\u003c/p\u003e\n\u003cp\u003e时间差不多，回酒店办退房。\u003c/p\u003e\n\u003cp\u003e然后步行到火车站，上车回京。\u003c/p\u003e\n\u003cp\u003e青岛之行就此结束了，尽管行程很短，天气不太好，但一家人在一起就很开心，唯一的教训就是晚上夜宵不要吃的太多。 😂\u003c/p\u003e\n","date_published":"2024-08-31T21:24:53+08:00","tags":["旅行"]},{"title":"解决 \"undeclared name: any (requires version go1.18 or later)\" 编译错误","id":"https://liudon.com/posts/solving-undeclared-name-any-requires-version-go1.18-or-later-compilation-error/","url":"https://liudon.com/posts/solving-undeclared-name-any-requires-version-go1.18-or-later-compilation-error/","summary":"\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$ go install google.golang.org/protobuf/cmd/protoc-gen-go@latest\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$ \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$ protoc-gen-go --version\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eprotoc-gen-go v1.34.2\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$ \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$ sh make.sh\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003euser.pb.go:123:45: undeclared name: any (requires version go1.18 or later)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$ \n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e流水线编译报错，其中\u003ccode\u003emake.sh\u003c/code\u003e文件代码：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eprotoc -I=./ --proto_path=./ --go_out=./ --go_opt=paths=source_relative user.proto \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ego build\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e同样的代码在本机编译就没问题，但是放到流水线里编译就报上面的错误。\u003c/p\u003e","content_html":"\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$ go install google.golang.org/protobuf/cmd/protoc-gen-go@latest\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$ \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$ protoc-gen-go --version\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eprotoc-gen-go v1.34.2\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$ \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$ sh make.sh\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003euser.pb.go:123:45: undeclared name: any (requires version go1.18 or later)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$ \n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e流水线编译报错，其中\u003ccode\u003emake.sh\u003c/code\u003e文件代码：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eprotoc -I=./ --proto_path=./ --go_out=./ --go_opt=paths=source_relative user.proto \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ego build\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e同样的代码在本机编译就没问题，但是放到流水线里编译就报上面的错误。\u003c/p\u003e\n\u003cp\u003e登到流水线编译机器上，看了下\u003ccode\u003ego\u003c/code\u003e的版本已经是\u003ccode\u003e1.18.1\u003c/code\u003e了，按理不应该报这个错误的。\u003c/p\u003e\n\u003cp\u003e关键之前流水线编译是没问题的，怀疑是开发分支代码的问题，用\u003ccode\u003emaster\u003c/code\u003e分支编译了一下，也还是报这个错误。\u003c/p\u003e\n\u003cp\u003e手动执行\u003ccode\u003emake.sh\u003c/code\u003e里的每条命令，发现是\u003ccode\u003eprotoc\u003c/code\u003e编译pb文件时报的这个错误。\u003c/p\u003e\n\u003cp\u003e经过一番查找后，发现是\u003ccode\u003eprotoc-gen-go\u003c/code\u003e在4月份更新了版本，引入了新特性。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://pkg.go.dev/google.golang.org/protobuf@v1.34.2/cmd/protoc-gen-go?tab=versions\"\u003eprotoc-gen-go\u0026rsquo;s versions\u003c/a\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eVersions in this module\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ev1\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    v1.34.2 Jun 11, 2024\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    v1.34.1 May 6, 2024\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    v1.34.0 Apr 30, 2024\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    v1.33.0 Mar 5, 2024\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    v1.32.0 Dec 22, 2023\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003ca href=\"https://protobuf.dev/editions/overview/\"\u003eProtobuf Editions Overview\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eProtobuf Editions replace the proto2 and proto3 designations that we have used for Protocol Buffers. Instead of adding syntax = \u0026ldquo;proto2\u0026rdquo; or syntax = \u0026ldquo;proto3\u0026rdquo; at the top of proto definition files, you use an edition number, such as edition = \u0026ldquo;2024\u0026rdquo;, to specify the default behaviors your file will have. Editions enable the language to evolve incrementally over time.\u003c/p\u003e\n\u003cp\u003eInstead of the hardcoded behaviors that older versions have had, editions represent a collection of features with a default value (behavior) per feature. Features are options on a file, message, field, enum, and so on, that specify the behavior of protoc, the code generators, and protobuf runtimes. You can explicitly override a behavior at those different levels (file, message, field, …) when your needs don’t match the default behavior for the edition you’ve selected. You can also override your overrides. The section later in this topic on lexical scoping goes into more detail on that.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e改用历史版本后解决。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ego install google.golang.org/protobuf/cmd/protoc-gen-go@v1.33.0\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","date_published":"2024-06-14T20:41:20+08:00","tags":["go","protoc"]},{"title":"搭建自托管IPFS Gateway服务，替代Cloudflare的IPFS Gateway","id":"https://liudon.com/posts/replacing-cloudflare-ipfs-gateway-with-self-hosted-gateway/","url":"https://liudon.com/posts/replacing-cloudflare-ipfs-gateway-with-self-hosted-gateway/","summary":"\u003ch4 id=\"背景\"\u003e背景\u003c/h4\u003e\n\u003cp\u003e4月底的时候，Livid大佬提醒，\u003ccode\u003eCloudflare\u003c/code\u003e应该是调整了\u003ccode\u003eIPFS Gateway\u003c/code\u003e网关策略，我的\u003ca href=\"https://liudon.xyz\"\u003eIPFS镜像博客\u003c/a\u003e无法访问了。\u003c/p\u003e\n\u003cp\u003e没查到\u003ccode\u003eCloudflare\u003c/code\u003e的调整说明，不过还好\u003ccode\u003eIPFS\u003c/code\u003e官方也提供了公共网关\u003ccode\u003egateway.ipfs.io\u003c/code\u003e，将域名解析改到官网网关。\u003c/p\u003e","content_html":"\u003ch4 id=\"背景\"\u003e背景\u003c/h4\u003e\n\u003cp\u003e4月底的时候，Livid大佬提醒，\u003ccode\u003eCloudflare\u003c/code\u003e应该是调整了\u003ccode\u003eIPFS Gateway\u003c/code\u003e网关策略，我的\u003ca href=\"https://liudon.xyz\"\u003eIPFS镜像博客\u003c/a\u003e无法访问了。\u003c/p\u003e\n\u003cp\u003e没查到\u003ccode\u003eCloudflare\u003c/code\u003e的调整说明，不过还好\u003ccode\u003eIPFS\u003c/code\u003e官方也提供了公共网关\u003ccode\u003egateway.ipfs.io\u003c/code\u003e，将域名解析改到官网网关。\u003c/p\u003e\n\u003cp\u003e但还是无法访问，被\u003ccode\u003eCloudflare\u003c/code\u003e拦截了。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eError 1014 Ray ID: 887cc7fcfa2804bb • 2024-05-22 12:24:05 UTC\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCNAME Cross-User Banned\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eWhat happened?\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eYou\u0026#39;ve requested a page on a website that is part of the Cloudflare network. The host is configured as a CNAME across accounts on Cloudflare, which is not allowed by Cloudflare\u0026#39;s security policy.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eWhat can I do?\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eIf this is an R2 custom domain, it may still be initializing. If you have attempted to manually point a CNAME DNS record to your R2 bucket, you must do it using a custom domain. Refer to R2\u0026#39;s documentation for details.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eVisit our website to learn more about Cloudflare.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e这周在Discord群里，看到有人发消息，说是\u003ccode\u003eCloudflare\u003c/code\u003e将下线\u003ccode\u003eIPFS Gateway\u003c/code\u003e网关服务。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://blog.cloudflare.com/cloudflares-public-ipfs-gateways-and-supporting-interplanetary-shipyard\"\u003ehttps://blog.cloudflare.com/cloudflares-public-ipfs-gateways-and-supporting-interplanetary-shipyard\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eAll traffic using the cloudflare-ipfs.com or cf-ipfs.com hostname(s) will continue to work without interruption and be redirected to ipfs.io or dweb.link until August 14th, 2024, at which time the Cloudflare hostnames will no longer connect to IPFS and all users must switch the hostname they use to ipfs.io or dweb.link to ensure no service interruption takes place. If you are using either of the Cloudflare hostnames, please be sure to switch to one of the new ones as soon as possible ahead of the transition date to avoid any service interruptions!\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch4 id=\"方案调研\"\u003e方案调研\u003c/h4\u003e\n\u003cp\u003e经过一番搜索，找到了一篇\u003ca href=\"https://railway.app/template/PhPjgz\"\u003e自建IPFS Gateway网关的资料\u003c/a\u003e，里面用到了\u003ca href=\"https://github.com/ipfs/bifrost-gateway\"\u003ebifrost-gateway\u003c/a\u003e组件。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eTo run against a compatible, local trustless gateway provided by Kubo or IPFS Desktop:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$ PROXY_GATEWAY_URL=\u0026#34;http://127.0.0.1:8080\u0026#34; ./bifrost-gateway\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e看文档，可以通过这个命令搭建一个自己的网关服务，同时支持\u003ccode\u003eDNSLink\u003c/code\u003e方式访问。\u003c/p\u003e\n\u003cp\u003e太棒了，感觉可以自己搭一套网关，然后用\u003ccode\u003eNginx\u003c/code\u003e反代对外提供服务。\u003c/p\u003e\n\u003cp\u003e在之前\u003ca href=\"https://liudon.com/posts/deploy-blog-to-ipfs/\"\u003e将博客部署到星际文件系统(IPFS)\u003c/a\u003e文章中，已经通过\u003ccode\u003eKubo\u003c/code\u003e搭建了一套本地\u003ccode\u003eIPFS\u003c/code\u003e服务。\u003c/p\u003e\n\u003cp\u003e上机器验证一下可行性：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e启动Bifrost Gateway，网关默认地址为\u003ccode\u003ehttps://127.0.0.1:8081\u003c/code\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$ PROXY_GATEWAY_URL=\u0026#34;http://127.0.0.1:8080\u0026#34; ./bifrost-gateway\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2024/05/22 20:54:00 Starting bifrost-gateway dev-build\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2024/05/22 20:54:00 Proxy backend (PROXY_GATEWAY_URL) at http://127.0.0.1:8080\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2024/05/22 20:54:00 BLOCK_CACHE_SIZE: 1024\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2024/05/22 20:54:00 GRAPH_BACKEND: false\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2024/05/22 20:54:00 Legacy RPC at /api/v0 (KUBO_RPC_URL) provided by http://127.0.0.1:5001\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2024/05/22 20:54:00 Path gateway listening on http://127.0.0.1:8081\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2024/05/22 20:54:00   Smoke test (JPG): http://127.0.0.1:8081/ipfs/bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2024/05/22 20:54:00 Subdomain gateway configured on dweb.link and http://localhost:8081\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2024/05/22 20:54:00   Smoke test (Subdomain+DNSLink+UnixFS+HAMT): http://localhost:8081/ipns/en.wikipedia-on-ipfs.org/wiki/\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2024/05/22 20:54:00 Metrics exposed at http://127.0.0.1:8041/debug/metrics/prometheus\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e在另外一个终端下，执行命令\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$ curl \u0026#39;http://127.0.0.1:8081/\u0026#39; -H\u0026#34;Host:liudon.xyz\u0026#34; -I\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHTTP/1.1 200 OK\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAccept-Ranges: bytes\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAccess-Control-Allow-Headers: Content-Type\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAccess-Control-Allow-Headers: Range\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAccess-Control-Allow-Headers: User-Agent\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAccess-Control-Allow-Headers: X-Requested-With\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAccess-Control-Allow-Methods: GET\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAccess-Control-Allow-Methods: HEAD\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAccess-Control-Allow-Methods: OPTIONS\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAccess-Control-Allow-Origin: *\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAccess-Control-Expose-Headers: Content-Length\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAccess-Control-Expose-Headers: Content-Range\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAccess-Control-Expose-Headers: X-Chunked-Output\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAccess-Control-Expose-Headers: X-Ipfs-Path\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAccess-Control-Expose-Headers: X-Ipfs-Roots\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAccess-Control-Expose-Headers: X-Stream-Output\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eContent-Length: 26283\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eContent-Type: text/html\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eEtag: \u0026#34;QmebCXeD6XDB9xsVvX5Te91EeF5t7sk65A3adsLQ9bostj\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eLast-Modified: Wed, 22 May 2024 12:57:29 GMT\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eX-Ipfs-Path: /ipns/liudon.xyz/\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eX-Ipfs-Roots: QmebCXeD6XDB9xsVvX5Te91EeF5t7sk65A3adsLQ9bostj\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eDate: Wed, 22 May 2024 12:57:29 GMT\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e验证可行，不过我记得\u003ccode\u003eKubo\u003c/code\u003e默认就有网关服务的，试一下直接通过\u003ccode\u003eKubo\u003c/code\u003e默认网关的情况。\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eKubo默认网关地址为http://127.0.0.1:8080，注意不要对外网提供8080端口访问，否则会被别人当成公共网关使用\u003c/em\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$ curl \u0026#39;http://127.0.0.1:8080/\u0026#39; -H\u0026#34;Host:liudon.xyz\u0026#34; -I\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHTTP/1.1 200 OK\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAccept-Ranges: bytes\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAccess-Control-Allow-Headers: Content-Type\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAccess-Control-Allow-Headers: Range\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAccess-Control-Allow-Headers: User-Agent\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAccess-Control-Allow-Headers: X-Requested-With\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAccess-Control-Allow-Methods: GET\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAccess-Control-Allow-Origin: *\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAccess-Control-Expose-Headers: Content-Length\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAccess-Control-Expose-Headers: Content-Range\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAccess-Control-Expose-Headers: X-Chunked-Output\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAccess-Control-Expose-Headers: X-Ipfs-Path\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAccess-Control-Expose-Headers: X-Ipfs-Roots\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAccess-Control-Expose-Headers: X-Stream-Output\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eContent-Length: 26283\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eContent-Type: text/html\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eEtag: \u0026#34;QmebCXeD6XDB9xsVvX5Te91EeF5t7sk65A3adsLQ9bostj\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eLast-Modified: Wed, 22 May 2024 12:59:25 GMT\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eX-Ipfs-Path: /ipns/liudon.xyz/\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eX-Ipfs-Roots: QmebCXeD6XDB9xsVvX5Te91EeF5t7sk65A3adsLQ9bostj\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eDate: Wed, 22 May 2024 12:59:25 GMT\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e也是可以的，那就没必要多搞一套bifrost网关了。\u003c/p\u003e\n\u003ch4 id=\"具体实现\"\u003e具体实现\u003c/h4\u003e\n\u003cp\u003e通过\u003ccode\u003eNginx\u003c/code\u003e反向代理转发到本地\u003ccode\u003eIPFS\u003c/code\u003e网关，只需要改一下解析就可以继续使用\u003ccode\u003eIPFS\u003c/code\u003e服务了。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/replacing-cloudflare-ipfs-gateway-with-self-hosted-gateway/20240522210154.png_320x.avif 320w, https://liudon.com/posts/replacing-cloudflare-ipfs-gateway-with-self-hosted-gateway/20240522210154.png_480x.avif 480w, https://liudon.com/posts/replacing-cloudflare-ipfs-gateway-with-self-hosted-gateway/20240522210154.png_720x.avif 720w, https://liudon.com/posts/replacing-cloudflare-ipfs-gateway-with-self-hosted-gateway/20240522210154.png_904x.avif 904w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/replacing-cloudflare-ipfs-gateway-with-self-hosted-gateway/20240522210154.png_320x.webp 320w, https://liudon.com/posts/replacing-cloudflare-ipfs-gateway-with-self-hosted-gateway/20240522210154.png_480x.webp 480w, https://liudon.com/posts/replacing-cloudflare-ipfs-gateway-with-self-hosted-gateway/20240522210154.png_720x.webp 720w, https://liudon.com/posts/replacing-cloudflare-ipfs-gateway-with-self-hosted-gateway/20240522210154.png_904x.webp 904w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/replacing-cloudflare-ipfs-gateway-with-self-hosted-gateway/20240522210154.png\" alt=\"方案\"\n         width=\"904\" height=\"1040\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003ccode\u003eNginx\u003c/code\u003e反向代理\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eserver\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003elisten\u003c/span\u003e \u003cspan class=\"mi\"\u003e443\u003c/span\u003e \u003cspan class=\"n\"\u003essl\u003c/span\u003e \u003cspan class=\"n\"\u003ehttp2\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eserver_name\u003c/span\u003e \u003cspan class=\"n\"\u003eliudon\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003exyz\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003essl_certificate\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eetc\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003enginx\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003essl\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eliudon\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003exyz\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003efullchain\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecer\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003essl_certificate_key\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eetc\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003enginx\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003essl\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eliudon\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003exyz\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eliudon\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003exyz\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ekey\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003essl_protocols\u003c/span\u003e \u003cspan class=\"n\"\u003eTLSv1\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mi\"\u003e2\u003c/span\u003e \u003cspan class=\"n\"\u003eTLSv1\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mi\"\u003e3\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003essl_ciphers\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003essl_prefer_server_ciphers\u003c/span\u003e \u003cspan class=\"n\"\u003eon\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003essl_session_cache\u003c/span\u003e \u003cspan class=\"n\"\u003eshared\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"n\"\u003eSSL\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"mi\"\u003e10\u003c/span\u003e\u003cspan class=\"n\"\u003em\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003essl_session_timeout\u003c/span\u003e \u003cspan class=\"mi\"\u003e10\u003c/span\u003e\u003cspan class=\"n\"\u003em\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003elocation\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eproxy_pass\u003c/span\u003e \u003cspan class=\"n\"\u003ehttp\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e//\u003c/span\u003e\u003cspan class=\"mf\"\u003e127.0\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mf\"\u003e0.1\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"mi\"\u003e8080\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eproxy_set_header\u003c/span\u003e \u003cspan class=\"n\"\u003eHost\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ehost\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"err\"\u003e注意这里要传递反代的域名信息，限制只能访问我们自己\u003c/span\u003e\u003cspan class=\"n\"\u003ednslink对应的资源\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eaccess_log\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"k\"\u003evar\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"nb\"\u003elog\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003enginx\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eliudon\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003exyz\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eaccess\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003elog\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eerror_log\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"k\"\u003evar\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"nb\"\u003elog\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003enginx\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eliudon\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003exyz\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eerror\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003elog\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e申请\u003ccode\u003eLet's Encrypt\u003c/code\u003e证书，证书相关的就不多做介绍了，网上资料很多。\u003c/p\u003e\n\u003col start=\"2\"\u003e\n\u003cli\u003e更改DNS解析\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e原有的解析\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e类型：CNAME\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e名称：liudon.xyz\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e内容：cloudflare-ipfs.com\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e新的解析\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e类型：A\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e名称：liudon.xyz\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e内容：你的服务器公网IP\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e搞定，又可以继续白嫖\u003ccode\u003eIPFS\u003c/code\u003e服务了。\u003c/p\u003e\n","date_published":"2024-05-22T21:20:20+08:00","tags":["cloudflare","ipfs"]},{"title":"302跳转的跨域问题(CORS)","id":"https://liudon.com/posts/the-cors-issue-with-302-redirect/","url":"https://liudon.com/posts/the-cors-issue-with-302-redirect/","summary":"\u003cp\u003e302跳转的跨域问题\u003c/p\u003e\n\u003ch4 id=\"场景一302不返回跨域头\"\u003e场景一：302不返回跨域头\u003c/h4\u003e\n\u003cp\u003e\u003cstrong\u003e请求\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGET /302 HTTP/1.1\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHost: liudon.xyz\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eOrigin: https://www.baidu.com\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUser-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cstrong\u003e返回\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHTTP/1.1 200 OK\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCache-Control: private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCf-Ray: 88535773eaf5107e-HKG\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eContent-Length: 143\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eContent-Type: text/html\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eDate: Fri, 17 May 2024 11:42:00 GMT\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eExpires: Thu, 01 Jan 1970 00:00:01 GMT\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eLocation: https://liudon.org\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eServer: cloudflare\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eVary: Accept-Encoding\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cstrong\u003e浏览器报错\u003c/strong\u003e\u003c/p\u003e","content_html":"\u003cp\u003e302跳转的跨域问题\u003c/p\u003e\n\u003ch4 id=\"场景一302不返回跨域头\"\u003e场景一：302不返回跨域头\u003c/h4\u003e\n\u003cp\u003e\u003cstrong\u003e请求\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGET /302 HTTP/1.1\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHost: liudon.xyz\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eOrigin: https://www.baidu.com\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUser-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cstrong\u003e返回\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHTTP/1.1 200 OK\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCache-Control: private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCf-Ray: 88535773eaf5107e-HKG\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eContent-Length: 143\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eContent-Type: text/html\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eDate: Fri, 17 May 2024 11:42:00 GMT\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eExpires: Thu, 01 Jan 1970 00:00:01 GMT\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eLocation: https://liudon.org\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eServer: cloudflare\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eVary: Accept-Encoding\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cstrong\u003e浏览器报错\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAccess to fetch at \u0026#39;https://liudon.xyz/302\u0026#39; from origin \u0026#39;https://www.baidu.com\u0026#39; has been blocked by CORS policy: No \u0026#39;Access-Control-Allow-Origin\u0026#39; header is present on the requested resource. If an opaque response serves your needs, set the request\u0026#39;s mode to \u0026#39;no-cors\u0026#39; to fetch the resource with CORS disabled.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-cors-issue-with-302-redirect/302.png_320x.avif 320w, https://liudon.com/posts/the-cors-issue-with-302-redirect/302.png_480x.avif 480w, https://liudon.com/posts/the-cors-issue-with-302-redirect/302.png_720x.avif 720w, https://liudon.com/posts/the-cors-issue-with-302-redirect/302.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-cors-issue-with-302-redirect/302.png_320x.webp 320w, https://liudon.com/posts/the-cors-issue-with-302-redirect/302.png_480x.webp 480w, https://liudon.com/posts/the-cors-issue-with-302-redirect/302.png_720x.webp 720w, https://liudon.com/posts/the-cors-issue-with-302-redirect/302.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-cors-issue-with-302-redirect/302.png\" alt=\"302\"\n         width=\"1080\" height=\"124\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003ch4 id=\"场景二302跳转返回跨域头\"\u003e场景二：302跳转返回跨域头\u003c/h4\u003e\n\u003cp\u003e\u003cstrong\u003e请求\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGET /302_return_origin_header HTTP/1.1\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHost: liudon.xyz\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eOrigin: https://www.baidu.com\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUser-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cstrong\u003e返回\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHTTP/1.1 200 OK\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAccess-Control-Allow-Origin: https://www.baidu.com\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCache-Control: private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCf-Ray: 88535773eaf5107e-HKG\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eContent-Length: 143\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eContent-Type: text/html\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eDate: Fri, 17 May 2024 11:42:00 GMT\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eExpires: Thu, 01 Jan 1970 00:00:01 GMT\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eLocation: https://liudon.org\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eServer: cloudflare\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eVary: Accept-Encoding\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cstrong\u003e浏览器报错\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAccess to fetch at \u0026#39;https://liudon.org/\u0026#39; (redirected from \u0026#39;https://liudon.xyz/302_return_origin_header\u0026#39;) from origin \u0026#39;https://www.baidu.com\u0026#39; has been blocked by CORS policy: No \u0026#39;Access-Control-Allow-Origin\u0026#39; header is present on the requested resource. If an opaque response serves your needs, set the request\u0026#39;s mode to \u0026#39;no-cors\u0026#39; to fetch the resource with CORS disabled.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-cors-issue-with-302-redirect/302_return_origin_header.png_320x.avif 320w, https://liudon.com/posts/the-cors-issue-with-302-redirect/302_return_origin_header.png_480x.avif 480w, https://liudon.com/posts/the-cors-issue-with-302-redirect/302_return_origin_header.png_720x.avif 720w, https://liudon.com/posts/the-cors-issue-with-302-redirect/302_return_origin_header.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-cors-issue-with-302-redirect/302_return_origin_header.png_320x.webp 320w, https://liudon.com/posts/the-cors-issue-with-302-redirect/302_return_origin_header.png_480x.webp 480w, https://liudon.com/posts/the-cors-issue-with-302-redirect/302_return_origin_header.png_720x.webp 720w, https://liudon.com/posts/the-cors-issue-with-302-redirect/302_return_origin_header.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-cors-issue-with-302-redirect/302_return_origin_header.png\" alt=\"302 return origin header\"\n         width=\"1080\" height=\"70\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e注意，这里302跳转请求没有报错，是跳转后的连接报了跨域错误。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eLocation请求\u003c/strong\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGET / HTTP/1.1\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eHost: liudon.org\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eOrigin: null\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eReferer: https://www.baidu.com/\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUser-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-cors-issue-with-302-redirect/location.png_320x.avif 320w, https://liudon.com/posts/the-cors-issue-with-302-redirect/location.png_480x.avif 480w, https://liudon.com/posts/the-cors-issue-with-302-redirect/location.png_720x.avif 720w, https://liudon.com/posts/the-cors-issue-with-302-redirect/location.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-cors-issue-with-302-redirect/location.png_320x.webp 320w, https://liudon.com/posts/the-cors-issue-with-302-redirect/location.png_480x.webp 480w, https://liudon.com/posts/the-cors-issue-with-302-redirect/location.png_720x.webp 720w, https://liudon.com/posts/the-cors-issue-with-302-redirect/location.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-cors-issue-with-302-redirect/location.png\" alt=\"location\"\n         width=\"1080\" height=\"847\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e302返回了跨域头，所以浏览器请求了Location地址。\u003c/p\u003e\n\u003cp\u003e但为什么两次请求header头里的\u003ccode\u003eOrigin\u003c/code\u003e字段值不一致呢？第二次Location请求为什么\u003ccode\u003eOrigin\u003c/code\u003e字段值是null？\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e第一次：\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eOrigin: https://www.baidu.com\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e第二次\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eOrigin: null\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e经过一番搜索，终于找到了一些资料。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe Origin header value may be null in a number of cases, including (non-exhaustively):\u003c/p\u003e\n\u003cp\u003eOrigins whose scheme is not one of http, https, ftp, ws, wss, or gopher (including blob, file and data).\nCross-origin images and media data, including that in \u003cimg\u003e, \u003cvideo\u003e and \u003caudio\u003e elements.\nDocuments created programmatically using createDocument(), generated from a data: URL, or that do not have a creator browsing context.\nRedirects across origins.\niframes with a sandbox attribute that doesn\u0026rsquo;t contain the value allow-same-origin.\nResponses that are network errors.\nReferrer-Policy set to no-referrer for non-cors request modes (e.g. simple form posts).\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e出自 \u003ca href=\"https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Origin#description\"\u003ehttps://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Origin#description\u003c/a\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eA request request has a redirect-tainted origin if these steps return true:\u003c/p\u003e\n\u003cp\u003eLet lastURL be null.\u003c/p\u003e\n\u003cp\u003eFor each url of request’s URL list:\u003c/p\u003e\n\u003cp\u003eIf lastURL is null, then set lastURL to url and continue.\u003c/p\u003e\n\u003cp\u003eIf url’s origin is not same origin with lastURL’s origin and request’s origin is not same origin with lastURL’s origin, then return true.\u003c/p\u003e\n\u003cp\u003eSet lastURL to url.\nReturn false.\nSerializing a request origin, given a request request, is to run these steps:\u003c/p\u003e\n\u003cp\u003eIf request has a redirect-tainted origin, then return \u0026ldquo;null\u0026rdquo;.\u003c/p\u003e\n\u003cp\u003eReturn request’s origin, serialized.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e出自 \u003ca href=\"https://fetch.spec.whatwg.org/#concept-request-tainted-origin\"\u003ehttps://fetch.spec.whatwg.org/#concept-request-tainted-origin\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e简单说就是如果302跳转的域与上一次请求域不同的话，就会将Origin设置为\u003ccode\u003enull\u003c/code\u003e。\u003c/p\u003e\n","date_published":"2024-05-17T20:13:57+08:00","tags":["cors"]},{"title":"sqlcommenter 原理与 GORM 实践：为 SQL 添加请求标识","id":"https://liudon.com/posts/gorm-supports-sqlcommenter/","url":"https://liudon.com/posts/gorm-supports-sqlcommenter/","summary":"sqlcommenter 如何通过 SQL 注释关联应用请求？本文介绍其基本思路，并以 GORM 插件为例，从 Context 获取请求 ID，为 SQL 自动添加注释，讲解 Callback 与自定义 Clause 的实现。","content_html":"\u003cp\u003esqlcommenter（SQL commenter）通过在 SQL 注释中携带应用上下文，帮助把数据库查询与发起它的代码或请求关联起来。本文以 GORM 为例，介绍如何从 Context 读取请求 ID，通过插件自动添加 SQL 注释，减少逐条修改业务查询的工作。\u003c/p\u003e\n\u003ch2 id=\"sqlcommenter-是什么能解决什么问题\"\u003esqlcommenter 是什么，能解决什么问题？\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://google.github.io/sqlcommenter/\"\u003esqlcommenter\u003c/a\u003e 是一组为 ORM 等组件提供 SQL 注释能力的中间件和插件。它将应用上下文写入查询语句，便于分析数据库性能和查询来源。\u003c/p\u003e\n\u003cp\u003e本文希望实现的效果是，在 SQL 前添加内部生成的 UUID 请求标识 \u003ccode\u003erid\u003c/code\u003e：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-sql\" data-lang=\"sql\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/* rid=550e8400-e29b-41d4-a716-446655440000 */\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eSELECT\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eFROM\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eusers\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e当数据库查询日志或慢查询日志保留这段注释，且应用日志也记录同一个 \u003ccode\u003erid\u003c/code\u003e 时，就可以用它查找对应请求。添加注释本身不会自动完成日志采集、日志关联或分布式追踪。\u003c/p\u003e\n\u003ch2 id=\"本文方案与-sqlcommenter-规范的区别\"\u003e本文方案与 sqlcommenter 规范的区别\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://google.github.io/sqlcommenter/spec/\"\u003esqlcommenter 规范\u003c/a\u003e 定义了键值编码、值的单引号包裹、排序和注释追加等规则。普通 SQL 注释不等于完整的 sqlcommenter 实现。\u003c/p\u003e\n\u003cp\u003e本文演示的是借鉴这一思路的 GORM 请求标识注释插件，使用前置的 \u003ccode\u003e/* rid=UUID */\u003c/code\u003e，没有实现完整规范，也不假定标准解析器能直接识别它。如果需要与遵循该规范的工具互通，应按规范处理注释格式。\u003c/p\u003e\n\u003cp\u003e这里约定 \u003ccode\u003erid\u003c/code\u003e 由应用内部生成，格式为 UUID，并在请求开始时写入 Context。代码中的 \u003ccode\u003exx\u003c/code\u003e 仅用于未传入 \u003ccode\u003erid\u003c/code\u003e 时的占位，不具备唯一请求标识的作用。\u003c/p\u003e\n\u003ch2 id=\"gorm-hints为单次操作添加-sql-注释\"\u003eGORM hints：为单次操作添加 SQL 注释\u003c/h2\u003e\n\u003cp\u003eGORM 提供了 \u003ca href=\"https://github.com/go-gorm/hints\"\u003ehints 组件\u003c/a\u003e，可以在指定 Clause 附近插入注释。这提供了构建 SQL 注释的能力，但不会自动读取请求上下文或完成 sqlcommenter 的序列化规则。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;gorm.io/hints\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eDB\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eClauses\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ehints\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eComment\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;select\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;master\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)).\u003c/span\u003e\u003cspan class=\"nf\"\u003eFind\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nx\"\u003eUser\u003c/span\u003e\u003cspan class=\"p\"\u003e{})\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// SELECT /*master*/ * FROM `users`;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eDB\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eClauses\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ehints\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eCommentBefore\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;insert\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;node2\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)).\u003c/span\u003e\u003cspan class=\"nf\"\u003eCreate\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nx\"\u003euser\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// /*node2*/ INSERT INTO `users` ...;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eDB\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eClauses\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ehints\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eCommentAfter\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;where\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;hint\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)).\u003c/span\u003e\u003cspan class=\"nf\"\u003eFind\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nx\"\u003eUser\u003c/span\u003e\u003cspan class=\"p\"\u003e{},\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;id = ?\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// SELECT * FROM `users` WHERE id = ? /* hint */\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e按上面的写法，需要在相应操作中显式传入 \u003ccode\u003e.Clauses(...)\u003c/code\u003e。我的需求是给同一个 GORM 实例上的操作统一添加请求标识，因此选择用插件注册 Callback。\u003c/p\u003e\n\u003ch2 id=\"使用-callback-和自定义-clause-自动添加-rid\"\u003e使用 Callback 和自定义 Clause 自动添加 rid\u003c/h2\u003e\n\u003cp\u003e插件分两种情况处理：SQL 尚未构建时，添加自定义 \u003ccode\u003eCOMMENT\u003c/code\u003e Clause，并让它排在构建顺序的开头；SQL 已经存在时（例如部分原生 SQL 操作），直接在已有 SQL 前写入注释，保留原有参数。\u003c/p\u003e\n\u003ch3 id=\"插件代码pluginsgormgo\"\u003e插件代码：plugins/gorm.go\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003epackage\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eplugins\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;fmt\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003egorm\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;gorm.io/gorm\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003egormclause\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;gorm.io/gorm/clause\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003etype\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eComment\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003estruct\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eContent\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ec\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eComment\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eName\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;COMMENT\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ec\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eComment\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eBuild\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ebuilder\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003egormclause\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eBuilder\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ebuilder\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eWriteString\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/* \u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ebuilder\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eWriteString\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ec\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eContent\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ebuilder\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eWriteString\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34; */\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ec\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eComment\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eMergeClause\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003emergeClause\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003egormclause\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eClause\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ec\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eComment\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eModifyStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003estmt\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003egorm\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eclause\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003estmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eClauses\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003ec\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eName\u003c/span\u003e\u003cspan class=\"p\"\u003e()]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"c1\"\u003e// 独立 COMMENT Clause 没有自定义 Builder，需要设置 Expression 才会构建。\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"c1\"\u003e// 仅设置 BeforeExpression 而让 Expression 为 nil，不会触发这里的 Build。\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eclause\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eExpression\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ec\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003estmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eClauses\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003ec\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eName\u003c/span\u003e\u003cspan class=\"p\"\u003e()]\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eclause\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003etype\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eCommentClausePlugin\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003estruct\u003c/span\u003e\u003cspan class=\"p\"\u003e{}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// NewCommentClausePlugin 创建请求标识注释插件。\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eNewCommentClausePlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eCommentClausePlugin\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nx\"\u003eCommentClausePlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e{}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Name plugin name\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eep\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eCommentClausePlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eName\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;CommentClausePlugin\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Initialize register BuildClauses\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eep\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eCommentClausePlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eInitialize\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003egorm\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDB\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003eerror\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nf\"\u003einitClauses\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nf\"\u003eCreate\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nf\"\u003eBefore\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;gorm:create\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"nf\"\u003eRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;CommentClausePlugin\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eAddAnnotation\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e!=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nf\"\u003eDelete\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nf\"\u003eBefore\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;gorm:delete\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"nf\"\u003eRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;CommentClausePlugin\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eAddAnnotation\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e!=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nf\"\u003eQuery\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nf\"\u003eBefore\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;gorm:query\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"nf\"\u003eRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;CommentClausePlugin\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eAddAnnotation\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e!=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nf\"\u003eUpdate\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nf\"\u003eBefore\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;gorm:update\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"nf\"\u003eRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;CommentClausePlugin\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eAddAnnotation\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e!=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nf\"\u003eRaw\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nf\"\u003eBefore\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;gorm:raw\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"nf\"\u003eRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;CommentClausePlugin\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eAddAnnotation\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e!=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nf\"\u003eRow\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nf\"\u003eBefore\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;gorm:row\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"nf\"\u003eRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;CommentClausePlugin\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eAddAnnotation\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e!=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eAddAnnotation\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003egorm\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDB\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eError\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e!=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003erid\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;xx\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"c1\"\u003e// 从context上下文里取rid信息\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ev\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eok\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eContext\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eValue\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;rid\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e).(\u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eok\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003erid\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ev\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003econtent\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003efmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eSprintf\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;rid=%s\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003erid\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eSQL\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eLen\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eoldSQL\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eSQL\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eString\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eSQL\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eReset\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eSQL\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eWriteString\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003efmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eSprintf\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;/* %s */ %s\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003econtent\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eoldSQL\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eAddClause\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eComment\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"nx\"\u003eContent\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003econtent\u003c/span\u003e\u003cspan class=\"p\"\u003e})\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// initClauses init SQL clause\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003einitClauses\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003egorm\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDB\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eError\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e!=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ecreateClause\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003eappend\u003c/span\u003e\u003cspan class=\"p\"\u003e([]\u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;COMMENT\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e},\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nf\"\u003eCreate\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nx\"\u003eClauses\u003c/span\u003e\u003cspan class=\"o\"\u003e...\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003edeleteClause\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003eappend\u003c/span\u003e\u003cspan class=\"p\"\u003e([]\u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;COMMENT\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e},\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nf\"\u003eDelete\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nx\"\u003eClauses\u003c/span\u003e\u003cspan class=\"o\"\u003e...\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003equeryClause\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003eappend\u003c/span\u003e\u003cspan class=\"p\"\u003e([]\u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;COMMENT\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e},\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nf\"\u003eQuery\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nx\"\u003eClauses\u003c/span\u003e\u003cspan class=\"o\"\u003e...\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eupdateClause\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003eappend\u003c/span\u003e\u003cspan class=\"p\"\u003e([]\u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;COMMENT\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e},\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nf\"\u003eUpdate\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nx\"\u003eClauses\u003c/span\u003e\u003cspan class=\"o\"\u003e...\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003erawClause\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003eappend\u003c/span\u003e\u003cspan class=\"p\"\u003e([]\u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;COMMENT\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e},\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nf\"\u003eRaw\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nx\"\u003eClauses\u003c/span\u003e\u003cspan class=\"o\"\u003e...\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003erowClause\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003eappend\u003c/span\u003e\u003cspan class=\"p\"\u003e([]\u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;COMMENT\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e},\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nf\"\u003eRow\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nx\"\u003eClauses\u003c/span\u003e\u003cspan class=\"o\"\u003e...\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nf\"\u003eCreate\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nx\"\u003eClauses\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ecreateClause\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nf\"\u003eDelete\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nx\"\u003eClauses\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edeleteClause\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nf\"\u003eQuery\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nx\"\u003eClauses\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003equeryClause\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nf\"\u003eUpdate\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nx\"\u003eClauses\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eupdateClause\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nf\"\u003eRaw\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nx\"\u003eClauses\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003erawClause\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nf\"\u003eRow\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nx\"\u003eClauses\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003erowClause\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e这里容易踩到的坑是 \u003ccode\u003eExpression\u003c/code\u003e：对于这个没有自定义 \u003ccode\u003eBuilder\u003c/code\u003e 的独立 Clause，仅设置 \u003ccode\u003eBeforeExpression\u003c/code\u003e 还不够。需要设置 \u003ccode\u003eclause.Expression = c\u003c/code\u003e，通用的 \u003ccode\u003eClause.Build()\u003c/code\u003e 才会继续构建内容。这也是我当时顺着 GORM SQL 生成链路排查后才定位到的问题。\u003c/p\u003e\n\u003cp\u003e另一个关键点是已有 SQL 分支必须写入完整的 \u003ccode\u003e/* ... */\u003c/code\u003e。如果只把 \u003ccode\u003erid=...\u003c/code\u003e 拼到语句前，会得到类似 \u003ccode\u003erid=xx SELECT ...\u003c/code\u003e 的错误 SQL。\u003c/p\u003e\n\u003ch2 id=\"注册插件并传入请求-context\"\u003e注册插件并传入请求 Context\u003c/h2\u003e\n\u003cp\u003e下面示例使用模块名 \u003ccode\u003eexample.com/sqlcommenter-demo\u003c/code\u003e，目录下分别放置 \u003ccode\u003emain.go\u003c/code\u003e 和 \u003ccode\u003eplugins/gorm.go\u003c/code\u003e。实际项目中，将插件导入路径替换为自己的模块路径。\u003c/p\u003e\n\u003cp\u003e本次更新使用 GORM v1.25.9、MySQL 驱动 v1.5.6 和 uuid v1.6.0 验证了编译，以及查询、创建、更新、删除、原生查询和 \u003ccode\u003eExec\u003c/code\u003e 的 DryRun SQL 生成结果。该验证未连接实际数据库，数据库日志是否保留注释仍需在部署环境确认。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ego mod init example.com/sqlcommenter-demo\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ego get gorm.io/gorm@v1.25.9 gorm.io/driver/mysql@v1.5.6 github.com/google/uuid@v1.6.0\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"maingo\"\u003emain.go\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003epackage\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003emain\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;context\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;example.com/sqlcommenter-demo/plugins\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;gorm.io/driver/mysql\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003egorm\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;gorm.io/gorm\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;github.com/google/uuid\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003etype\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eProduct\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003estruct\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nx\"\u003egorm\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eModel\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nx\"\u003eCode\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nx\"\u003ePrice\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003euint\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003emain\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003edsn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4\u0026amp;parseTime=True\u0026amp;loc=Local\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003egorm\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eOpen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003emysql\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eOpen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003edsn\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nx\"\u003egorm\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eConfig\u003c/span\u003e\u003cspan class=\"p\"\u003e{})\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e!=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nb\"\u003epanic\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eUse\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eplugins\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eNewCommentClausePlugin\u003c/span\u003e\u003cspan class=\"p\"\u003e());\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e!=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nb\"\u003epanic\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// 演示环境建表；已有业务表时使用项目自己的迁移流程。\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eAutoMigrate\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nx\"\u003eProduct\u003c/span\u003e\u003cspan class=\"p\"\u003e{});\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e!=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nb\"\u003epanic\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// 请求入口生成 UUID，并在应用日志中记录同一个 rid。\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003ectx\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003econtext\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eWithValue\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003econtext\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eBackground\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;rid\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003euuid\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eNew\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nf\"\u003eString\u003c/span\u003e\u003cspan class=\"p\"\u003e())\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eWithContext\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ectx\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"nf\"\u003eCreate\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nx\"\u003eProduct\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"nx\"\u003eCode\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;D42\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ePrice\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e100\u003c/span\u003e\u003cspan class=\"p\"\u003e}).\u003c/span\u003e\u003cspan class=\"nx\"\u003eError\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e!=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"nb\"\u003epanic\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e替换 DSN 并确保 MySQL 数据库已创建后，运行 \u003ccode\u003ego run .\u003c/code\u003e。\u003ccode\u003edb.Use()\u003c/code\u003e 为这个 GORM 实例注册插件，\u003ccode\u003eWithContext()\u003c/code\u003e 则把请求标识传到当前操作；其他独立创建的 GORM 实例需要分别注册。\u003c/p\u003e\n\u003ch2 id=\"查看生成的-sql-与使用限制\"\u003e查看生成的 SQL 与使用限制\u003c/h2\u003e\n\u003cp\u003e在调用数据库之前，也可以通过 \u003ccode\u003eDryRun\u003c/code\u003e 观察查询 SQL 和参数：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003evar\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eproducts\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[]\u003c/span\u003e\u003cspan class=\"nx\"\u003eProduct\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003etx\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eWithContext\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ectx\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"nf\"\u003eSession\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nx\"\u003egorm\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eSession\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"nx\"\u003eDryRun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e}).\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nf\"\u003eWhere\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;code = ?\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;D42\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"nf\"\u003eFind\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nx\"\u003eproducts\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003etx\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eError\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e!=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nb\"\u003epanic\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003etx\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eError\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003ePrintln\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003etx\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eSQL\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eString\u003c/span\u003e\u003cspan class=\"p\"\u003e())\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003efmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003ePrintln\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003etx\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eVars\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e将这段代码放到前面的 \u003ccode\u003emain()\u003c/code\u003e 中，并添加 \u003ccode\u003efmt\u003c/code\u003e 导入。SQL 开头应包含本次 Context 中的 \u003ccode\u003erid\u003c/code\u003e，条件参数仍保存在 \u003ccode\u003eStatement.Vars\u003c/code\u003e 中。\u003ccode\u003eDryRun\u003c/code\u003e 用于查看构建结果，不证明数据库端已经执行或记录了注释。\u003c/p\u003e\n\u003cp\u003e使用时需要注意：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003erid\u003c/code\u003e 来自内部 UUID 生成逻辑。示例沿用字符串 Context key \u003ccode\u003e\u0026quot;rid\u0026quot;\u003c/code\u003e，实际项目应与请求入口的写入方式保持一致。\u003c/li\u003e\n\u003cli\u003eSQL 注释不改变查询条件，数据库日志是否保留它需要在实际环境确认；不要在注释中携带密码或业务敏感信息。\u003c/li\u003e\n\u003cli\u003e示例覆盖默认 Callback 路径。若项目替换了回调、手动指定 \u003ccode\u003eBuildClauses\u003c/code\u003e，或其他插件也修改 SQL，需要验证组合后的结果。\u003c/li\u003e\n\u003cli\u003e本文代码不提供完整 sqlcommenter 规范兼容性，也没有实现重复注释检测；不要把同一份已加注释 SQL 反复送入该逻辑。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e这样就把请求 Context、GORM Callback、自定义 Clause 和最终 SQL 串起来了。阻塞了两天的问题，终于解决了！😁\u003c/p\u003e\n\u003cp\u003e关于 \u003ccode\u003eprocessor.Execute\u003c/code\u003e 如何执行回调、\u003ccode\u003eStatement.Build\u003c/code\u003e 如何构建 Clause，可以继续阅读：\u003ca href=\"https://liudon.com/posts/how-gorm-generates-sql/\"\u003eGORM 源码分析：从 processor.Execute 看 SQL 是如何生成的\u003c/a\u003e。\u003c/p\u003e\n","date_published":"2024-04-18T21:25:24+08:00","tags":["gorm","sqlcommenter"]},{"title":"GORM 源码分析：从 processor.Execute 看 SQL 是如何生成的","id":"https://liudon.com/posts/how-gorm-generates-sql/","url":"https://liudon.com/posts/how-gorm-generates-sql/","summary":"GORM 的 processor.Execute 为什么没有直接拼接 SQL？本文以 First 查询为例，从 callbacks.go 的回调入口追踪到 BuildQuerySQL、Statement.Build 和 QueryContext，解释 SQL 的生成与执行过程。","content_html":"\u003cp\u003e在 \u003ccode\u003egorm\u003c/code\u003e 下实现 \u003ca href=\"https://google.github.io/sqlcommenter/\"\u003esqlcommenter\u003c/a\u003e 的过程中遇到一些问题，顺便把 GORM 从查询方法到 SQL 生成、执行的流程梳理了一遍。\u003c/p\u003e\n\u003cp\u003e如果你在阅读 GORM 源码或者 Debug 调用链时追踪到了 \u003ccode\u003ecallbacks.go\u003c/code\u003e 中的 \u003ccode\u003efunc (p *processor) Execute\u003c/code\u003e，可能会发现：\u003ccode\u003eExecute\u003c/code\u003e 本身并没有直接拼接 SQL。那么调用 \u003ccode\u003eFirst\u003c/code\u003e、\u003ccode\u003eFind\u003c/code\u003e 等方法后，SQL 到底是在哪里生成的？\u003c/p\u003e\n\u003cp\u003e本文以 \u003ccode\u003eFirst\u003c/code\u003e 查询为例，继续向下追踪 \u003ccode\u003eQuery\u003c/code\u003e、\u003ccode\u003eBuildQuerySQL\u003c/code\u003e、\u003ccode\u003eStatement.Build\u003c/code\u003e 和 \u003ccode\u003eClause.Build\u003c/code\u003e，看看 GORM 是如何生成并最终执行 SQL 的。\u003c/p\u003e\n\u003ch2 id=\"先看结论gorm-sql-生成与执行主路径\"\u003e先看结论：GORM SQL 生成与执行主路径\u003c/h2\u003e\n\u003cp\u003e以下展示普通 \u003ccode\u003eFirst\u003c/code\u003e 查询的简化主路径，省略其他回调；部分 Clause 也可能由数据库方言提供的自定义 Builder 构建。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edb.First(\u0026amp;product, 1)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  ↓\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etx.callbacks.Query()       获取 query processor\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  ↓\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eprocessor.Execute()       遍历 p.fns，执行已注册的回调\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  ↓\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003egorm:query → Query()\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  ├─ BuildQuerySQL()\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  │    └─ Statement.Build()\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  │         └─ Clause.Build() 或自定义 ClauseBuilder\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  │              └─ 写入 Statement.SQL，收集 Statement.Vars\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  └─ 非 DryRun 且无错误时：QueryContext() → gorm.Scan()\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003ccode\u003eprocessor.Execute\u003c/code\u003e 负责准备查询上下文、执行 Callback 以及处理日志和清理工作。默认查询回调 \u003ccode\u003eQuery()\u003c/code\u003e 调用 \u003ccode\u003eBuildQuerySQL()\u003c/code\u003e，再由 \u003ccode\u003eStatement.Build()\u003c/code\u003e 按顺序构建各个 Clause，最终将 SQL 和参数交给底层连接执行。\u003c/p\u003e\n\u003ch2 id=\"从-first-开始追踪-gorm-查询流程\"\u003e从 First 开始追踪 GORM 查询流程\u003c/h2\u003e\n\u003ch3 id=\"gorm-使用示例\"\u003eGORM 使用示例\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003epackage\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003emain\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;gorm.io/driver/mysql\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;gorm.io/gorm\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003etype\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eProduct\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003estruct\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nx\"\u003egorm\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eModel\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nx\"\u003eCode\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nx\"\u003ePrice\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003euint\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003emain\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"c1\"\u003e// 参考 https://github.com/go-sql-driver/mysql#dsn-data-source-name 获取详情\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nx\"\u003edsn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4\u0026amp;parseTime=True\u0026amp;loc=Local\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003egorm\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eOpen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003emysql\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eOpen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003edsn\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nx\"\u003egorm\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eConfig\u003c/span\u003e\u003cspan class=\"p\"\u003e{})\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e!=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nb\"\u003epanic\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"kd\"\u003evar\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eproduct\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eProduct\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eFirst\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nx\"\u003eproduct\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"nx\"\u003eError\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e!=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c1\"\u003e// 根据整型主键查找\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nb\"\u003epanic\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e我们以 \u003ccode\u003eFirst\u003c/code\u003e 查询为例，看一下它如何设置查询条件并进入回调执行流程。\u003c/p\u003e\n\u003ch3 id=\"first-做了什么\"\u003eFirst 做了什么\u003c/h3\u003e\n\u003cp\u003e在 \u003ca href=\"https://github.com/go-gorm/gorm/blob/master/finisher_api.go\"\u003efinisher_api.go\u003c/a\u003e 文件中声明了 \u003ccode\u003eFirst\u003c/code\u003e 方法。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// First finds the first record ordered by primary key, matching given conditions conds\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eDB\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eFirst\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003edest\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003einterface\u003c/span\u003e\u003cspan class=\"p\"\u003e{},\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003econds\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e...\u003c/span\u003e\u003cspan class=\"kd\"\u003einterface\u003c/span\u003e\u003cspan class=\"p\"\u003e{})\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003etx\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eDB\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"c1\"\u003e// 设置 LIMIT 1 和按主键排序的 ORDER BY Clause\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003etx\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eLimit\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"nf\"\u003eOrder\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eclause\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eOrderByColumn\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eColumn\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eclause\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eColumn\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"nx\"\u003eTable\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eclause\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eCurrentTable\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eName\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eclause\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ePrimaryKey\u003c/span\u003e\u003cspan class=\"p\"\u003e},\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"p\"\u003e})\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"c1\"\u003e// 这里如果有指定条件的话，注册一个Where类型的Clause\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003elen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003econds\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eexprs\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003etx\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eBuildCondition\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003econds\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003econds\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e:]\u003c/span\u003e\u003cspan class=\"o\"\u003e...\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003elen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eexprs\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003etx\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eAddClause\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eclause\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eWhere\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"nx\"\u003eExprs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eexprs\u003c/span\u003e\u003cspan class=\"p\"\u003e})\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003etx\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eRaiseErrorOnNotFound\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003etx\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDest\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003etx\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ecallbacks\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eQuery\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nf\"\u003eExecute\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003etx\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003ccode\u003eFirst()\u003c/code\u003e 先设置 \u003ccode\u003eLIMIT\u003c/code\u003e、\u003ccode\u003eORDER BY\u003c/code\u003e 和查询条件，再保存结果接收对象 \u003ccode\u003eDest\u003c/code\u003e，最后通过 \u003ccode\u003etx.callbacks.Query().Execute(tx)\u003c/code\u003e 进入 query processor。\u003c/p\u003e\n\u003ch2 id=\"gorm-回调执行入口processorexecute\"\u003eGORM 回调执行入口：processor.Execute\u003c/h2\u003e\n\u003cp\u003e在 \u003ca href=\"https://github.com/go-gorm/gorm/blob/master/gorm.go\"\u003egorm.go\u003c/a\u003e 文件中，可以找到 \u003ccode\u003etx.callbacks\u003c/code\u003e 对应的字段定义。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003etype\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eConfig\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003estruct\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"o\"\u003e...\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ecallbacks\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003ecallbacks\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ecacheStore\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003esync\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eMap\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003ca href=\"https://github.com/go-gorm/gorm/blob/master/callbacks.go\"\u003ecallbacks.go\u003c/a\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// callbacks gorm callbacks manager\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003etype\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ecallbacks\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003estruct\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eprocessors\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003emap\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eprocessor\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003etype\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eprocessor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003estruct\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eDB\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eClauses\u003c/span\u003e\u003cspan class=\"w\"\u003e   \u003c/span\u003e\u003cspan class=\"p\"\u003e[]\u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003efns\u003c/span\u003e\u003cspan class=\"w\"\u003e       \u003c/span\u003e\u003cspan class=\"p\"\u003e[]\u003c/span\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eDB\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ecallbacks\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[]\u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003ecallback\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003etype\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ecallback\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003estruct\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e\u003cspan class=\"w\"\u003e      \u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ebefore\u003c/span\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eafter\u003c/span\u003e\u003cspan class=\"w\"\u003e     \u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eremove\u003c/span\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"kt\"\u003ebool\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ereplace\u003c/span\u003e\u003cspan class=\"w\"\u003e   \u003c/span\u003e\u003cspan class=\"kt\"\u003ebool\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ematch\u003c/span\u003e\u003cspan class=\"w\"\u003e     \u003c/span\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eDB\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003ebool\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ehandler\u003c/span\u003e\u003cspan class=\"w\"\u003e   \u003c/span\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eDB\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eprocessor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eprocessor\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// 返回query类型的processor\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ecs\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003ecallbacks\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eQuery\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eprocessor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ecs\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eprocessors\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;query\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ep\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eprocessor\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eExecute\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eDB\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eDB\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"c1\"\u003e// call scopes\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003elen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003escopes\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eexecuteScopes\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"kd\"\u003evar\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ecurTime\u003c/span\u003e\u003cspan class=\"w\"\u003e           \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003etime\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eNow\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003estmt\u003c/span\u003e\u003cspan class=\"w\"\u003e              \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eresetBuildClauses\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003ebool\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"c1\"\u003e// 注意这里的stmt.BuildClauses，后面会用到这个信息\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003elen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003estmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eBuildClauses\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003estmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eBuildClauses\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eClauses\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eresetBuildClauses\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eoptimizer\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eok\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDest\u003c/span\u003e\u003cspan class=\"p\"\u003e.(\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatementModifier\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eok\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eoptimizer\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eModifyStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003estmt\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"c1\"\u003e// assign model values\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003estmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eModel\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003estmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eModel\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003estmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDest\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eelse\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003estmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDest\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003estmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDest\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003estmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eModel\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"c1\"\u003e// parse model values\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003estmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eModel\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e!=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003estmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eParse\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003estmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eModel\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e!=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(!\u003c/span\u003e\u003cspan class=\"nx\"\u003eerrors\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eIs\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eschema\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eErrUnsupportedDataType\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e||\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003estmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eTable\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003estmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eTableExpr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003estmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eSQL\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eLen\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerrors\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eIs\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eschema\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eErrUnsupportedDataType\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003estmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eTable\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003estmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eTableExpr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eAddError\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003efmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eErrorf\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;%w: Table not set, please set it like: db.Model(\u0026amp;user) or db.Table(\\\u0026#34;users\\\u0026#34;)\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eelse\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eAddError\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"c1\"\u003e// assign stmt.ReflectValue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003estmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDest\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e!=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003estmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eReflectValue\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ereflect\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eValueOf\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003estmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDest\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003estmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eReflectValue\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eKind\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ereflect\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ePtr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003estmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eReflectValue\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eIsNil\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003estmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eReflectValue\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eCanAddr\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003estmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eReflectValue\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eSet\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ereflect\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eNew\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003estmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eReflectValue\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eType\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nf\"\u003eElem\u003c/span\u003e\u003cspan class=\"p\"\u003e()))\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003estmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eReflectValue\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003estmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eReflectValue\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eElem\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e!\u003c/span\u003e\u003cspan class=\"nx\"\u003estmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eReflectValue\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eIsValid\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eAddError\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eErrInvalidValue\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"c1\"\u003e// 根据优先级执行不同callback的回调方法\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003e_\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ef\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003erange\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efns\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"nf\"\u003ef\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003estmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eSQL\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eLen\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eLogger\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eTrace\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003estmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eContext\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ecurTime\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003eint64\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003esql\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003evars\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003estmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eSQL\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eString\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003estmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eVars\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eok\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eLogger\u003c/span\u003e\u003cspan class=\"p\"\u003e.(\u003c/span\u003e\u003cspan class=\"nx\"\u003eParamsFilter\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eok\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003esql\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003evars\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003efilter\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eParamsFilter\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003estmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eContext\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003estmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eSQL\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eString\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003estmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eVars\u003c/span\u003e\u003cspan class=\"o\"\u003e...\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDialector\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eExplain\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003esql\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003evars\u003c/span\u003e\u003cspan class=\"o\"\u003e...\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eRowsAffected\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e},\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eError\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e!\u003c/span\u003e\u003cspan class=\"nx\"\u003estmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDB\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDryRun\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003estmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eSQL\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eReset\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003estmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eVars\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eresetBuildClauses\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003estmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eBuildClauses\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"processorexecute-为什么没有直接生成-sql\"\u003eprocessor.Execute 为什么没有直接生成 SQL？\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003e(*callbacks).Query()\u003c/code\u003e 返回 query processor；它和后面真正处理查询的回调函数 \u003ccode\u003eQuery(db *gorm.DB)\u003c/code\u003e 是两个不同的方法或函数。\u003c/p\u003e\n\u003cp\u003e进入 \u003ccode\u003eprocessor.Execute()\u003c/code\u003e 后，关键在于这一段：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003e_\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ef\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003erange\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003efns\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nf\"\u003ef\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e它会依次执行当前 processor 中已注册并排序的 Callback。默认 query processor 包含 \u003ccode\u003egorm:query\u003c/code\u003e、\u003ccode\u003egorm:preload\u003c/code\u003e 和 \u003ccode\u003egorm:after_query\u003c/code\u003e，其中 \u003ccode\u003egorm:query\u003c/code\u003e 对应的 \u003ccode\u003eQuery()\u003c/code\u003e 负责主查询 SQL 的构建、执行和结果扫描，之后才继续执行 \u003ccode\u003ePreload()\u003c/code\u003e 和 \u003ccode\u003eAfterQuery()\u003c/code\u003e。\u003c/p\u003e\n\u003cp\u003e此外，\u003ccode\u003eExecute()\u003c/code\u003e 会执行 scopes，设置 Model 和 Dest，解析模型并准备反射值。下面这段则在 \u003ccode\u003eStatement.BuildClauses\u003c/code\u003e 为空时，提供当前 processor 的默认 Clause 构建顺序：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003elen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003estmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eBuildClauses\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003estmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eBuildClauses\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eClauses\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eresetBuildClauses\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e后面的 \u003ccode\u003eBuildQuerySQL()\u003c/code\u003e 会使用这个顺序。如果调用方已经设置了 \u003ccode\u003eBuildClauses\u003c/code\u003e，这里不会覆盖它。\u003c/p\u003e\n\u003ch3 id=\"debug-时为什么可能看不到-statementsql\"\u003eDebug 时为什么可能看不到 Statement.SQL？\u003c/h3\u003e\n\u003cp\u003e回调执行完毕后，\u003ccode\u003eExecute()\u003c/code\u003e 会记录 SQL 日志，并在非 \u003ccode\u003eDryRun\u003c/code\u003e 模式下清空 \u003ccode\u003eStatement.SQL\u003c/code\u003e 和 \u003ccode\u003eStatement.Vars\u003c/code\u003e。因此，在 \u003ccode\u003eFirst()\u003c/code\u003e 返回后查看这两个字段，可能已经看不到刚才执行的 SQL。\u003c/p\u003e\n\u003cp\u003e调试时可以在 \u003ccode\u003eQueryContext()\u003c/code\u003e 调用前观察 SQL 和参数，或者使用 \u003ccode\u003eDryRun\u003c/code\u003e 查看构建结果。\u003ccode\u003eDryRun\u003c/code\u003e 会跳过这里的数据库查询，并保留 SQL 和参数。若本次执行临时设置了 \u003ccode\u003eBuildClauses\u003c/code\u003e，结束时也会将它恢复为空。\u003c/p\u003e\n\u003cp\u003e仅在堆栈里看到 \u003ccode\u003ecallbacks.go\u003c/code\u003e 或 \u003ccode\u003eprocessor.Execute\u003c/code\u003e，不能据此确定报错原因，还需要结合具体错误以及它发生在模型解析、回调、查询执行还是结果扫描阶段来判断。\u003c/p\u003e\n\u003ch2 id=\"gorm-默认-query-callback-是如何注册的\"\u003eGORM 默认 Query Callback 是如何注册的\u003c/h2\u003e\n\u003cp\u003e接下来看看内置 Callback 的注册过程。本文使用的 MySQL 驱动会在初始化时调用 \u003ccode\u003ecallbacks.RegisterDefaultCallbacks()\u003c/code\u003e。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/go-gorm/mysql/blob/master/mysql.go\"\u003emysql.go\u003c/a\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003evar\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"c1\"\u003e// CreateClauses create clauses\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eCreateClauses\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[]\u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;INSERT\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;VALUES\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;ON CONFLICT\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"c1\"\u003e// QueryClauses query clauses\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eQueryClauses\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[]\u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e{}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"c1\"\u003e// UpdateClauses update clauses\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eUpdateClauses\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[]\u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;UPDATE\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;SET\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;WHERE\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;ORDER BY\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;LIMIT\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"c1\"\u003e// DeleteClauses delete clauses\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eDeleteClauses\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[]\u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;DELETE\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;FROM\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;WHERE\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;ORDER BY\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;LIMIT\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003edefaultDatetimePrecision\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e3\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e...\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003edialector\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eDialector\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eInitialize\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003egorm\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDB\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003eerror\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edialector\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDriverName\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003edialector\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDriverName\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;mysql\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edialector\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDefaultDatetimePrecision\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003edialector\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDefaultDatetimePrecision\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nx\"\u003edefaultDatetimePrecision\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edialector\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eConn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e!=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eConnPool\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edialector\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eConn\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eelse\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eConnPool\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003esql\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eOpen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003edialector\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDriverName\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edialector\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDSN\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e!=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ewithReturning\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e!\u003c/span\u003e\u003cspan class=\"nx\"\u003edialector\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eConfig\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eSkipInitializeWithVersion\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eConnPool\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eQueryRowContext\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003econtext\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eBackground\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;SELECT VERSION()\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"nf\"\u003eScan\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nx\"\u003edialector\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eServerVersion\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e!=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003estrings\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eContains\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003edialector\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eServerVersion\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;MariaDB\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003edialector\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eConfig\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDontSupportRenameIndex\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003edialector\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eConfig\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDontSupportRenameColumn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003edialector\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eConfig\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDontSupportForShareClause\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003edialector\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eConfig\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDontSupportNullAsDefaultValue\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ewithReturning\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003echeckVersion\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003edialector\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eServerVersion\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;10.5\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eelse\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003estrings\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eHasPrefix\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003edialector\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eServerVersion\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;5.6.\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003edialector\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eConfig\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDontSupportRenameIndex\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003edialector\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eConfig\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDontSupportRenameColumn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003edialector\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eConfig\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDontSupportForShareClause\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003edialector\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eConfig\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDontSupportDropConstraint\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eelse\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003estrings\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eHasPrefix\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003edialector\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eServerVersion\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;5.7.\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003edialector\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eConfig\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDontSupportRenameColumn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003edialector\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eConfig\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDontSupportForShareClause\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003edialector\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eConfig\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDontSupportDropConstraint\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eelse\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003estrings\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eHasPrefix\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003edialector\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eServerVersion\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;5.\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003edialector\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eConfig\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDisableDatetimePrecision\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003edialector\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eConfig\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDontSupportRenameIndex\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003edialector\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eConfig\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDontSupportRenameColumn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003edialector\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eConfig\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDontSupportForShareClause\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003edialector\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eConfig\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDontSupportDropConstraint\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003estrings\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eContains\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003edialector\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eServerVersion\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;TiDB\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003edialector\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eConfig\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDontSupportRenameColumnUnique\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"c1\"\u003e// register callbacks\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ecallbackConfig\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nx\"\u003ecallbacks\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eConfig\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eCreateClauses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eCreateClauses\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eQueryClauses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nx\"\u003eQueryClauses\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eUpdateClauses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eUpdateClauses\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eDeleteClauses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eDeleteClauses\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e!\u003c/span\u003e\u003cspan class=\"nx\"\u003edialector\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eConfig\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDisableWithReturning\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ewithReturning\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e!\u003c/span\u003e\u003cspan class=\"nx\"\u003eutils\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eContains\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ecallbackConfig\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eCreateClauses\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;RETURNING\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ecallbackConfig\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eCreateClauses\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003eappend\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ecallbackConfig\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eCreateClauses\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;RETURNING\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e!\u003c/span\u003e\u003cspan class=\"nx\"\u003eutils\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eContains\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ecallbackConfig\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eUpdateClauses\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;RETURNING\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ecallbackConfig\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eUpdateClauses\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003eappend\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ecallbackConfig\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eUpdateClauses\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;RETURNING\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e!\u003c/span\u003e\u003cspan class=\"nx\"\u003eutils\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eContains\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ecallbackConfig\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDeleteClauses\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;RETURNING\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ecallbackConfig\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDeleteClauses\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003eappend\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ecallbackConfig\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDeleteClauses\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;RETURNING\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"c1\"\u003e// 注册默认callback\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ecallbacks\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eRegisterDefaultCallbacks\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ecallbackConfig\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ek\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ev\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003erange\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edialector\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eClauseBuilders\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eClauseBuilders\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003ek\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ev\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003ca href=\"https://github.com/go-gorm/gorm/blob/master/callbacks/callbacks.go\"\u003ecallbacks.go\u003c/a\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003evar\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ecreateClauses\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[]\u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;INSERT\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;VALUES\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;ON CONFLICT\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003equeryClauses\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[]\u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;SELECT\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;FROM\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;WHERE\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;GROUP BY\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;ORDER BY\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;LIMIT\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;FOR\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eupdateClauses\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[]\u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;UPDATE\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;SET\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;WHERE\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003edeleteClauses\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[]\u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;DELETE\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;FROM\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;WHERE\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003etype\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eConfig\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003estruct\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eLastInsertIDReversed\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003ebool\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eCreateClauses\u003c/span\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"p\"\u003e[]\u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eQueryClauses\u003c/span\u003e\u003cspan class=\"w\"\u003e         \u003c/span\u003e\u003cspan class=\"p\"\u003e[]\u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eUpdateClauses\u003c/span\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"p\"\u003e[]\u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eDeleteClauses\u003c/span\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"p\"\u003e[]\u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eRegisterDefaultCallbacks\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003egorm\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDB\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003econfig\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eConfig\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eenableTransaction\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003egorm\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDB\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003ebool\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e!\u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eSkipDefaultTransaction\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003elen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003econfig\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eCreateClauses\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003econfig\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eCreateClauses\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ecreateClauses\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003elen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003econfig\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eQueryClauses\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003econfig\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eQueryClauses\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003equeryClauses\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003elen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003econfig\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDeleteClauses\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003econfig\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDeleteClauses\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edeleteClauses\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003elen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003econfig\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eUpdateClauses\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003econfig\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eUpdateClauses\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eupdateClauses\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// 注册不同类型的callback\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ecreateCallback\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nf\"\u003eCreate\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ecreateCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eMatch\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eenableTransaction\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"nf\"\u003eRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;gorm:begin_transaction\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eBeginTransaction\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ecreateCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;gorm:before_create\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eBeforeCreate\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ecreateCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;gorm:save_before_associations\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eSaveBeforeAssociations\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ecreateCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;gorm:create\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eCreate\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003econfig\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ecreateCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;gorm:save_after_associations\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eSaveAfterAssociations\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ecreateCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;gorm:after_create\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eAfterCreate\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ecreateCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eMatch\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eenableTransaction\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"nf\"\u003eRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;gorm:commit_or_rollback_transaction\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eCommitOrRollbackTransaction\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ecreateCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eClauses\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003econfig\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eCreateClauses\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003equeryCallback\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nf\"\u003eQuery\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003equeryCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;gorm:query\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eQuery\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003equeryCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;gorm:preload\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ePreload\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003equeryCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;gorm:after_query\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eAfterQuery\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003equeryCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eClauses\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003econfig\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eQueryClauses\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003edeleteCallback\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nf\"\u003eDelete\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003edeleteCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eMatch\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eenableTransaction\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"nf\"\u003eRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;gorm:begin_transaction\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eBeginTransaction\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003edeleteCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;gorm:before_delete\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eBeforeDelete\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003edeleteCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;gorm:delete_before_associations\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eDeleteBeforeAssociations\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003edeleteCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;gorm:delete\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eDelete\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003econfig\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003edeleteCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;gorm:after_delete\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eAfterDelete\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003edeleteCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eMatch\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eenableTransaction\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"nf\"\u003eRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;gorm:commit_or_rollback_transaction\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eCommitOrRollbackTransaction\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003edeleteCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eClauses\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003econfig\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDeleteClauses\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eupdateCallback\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nf\"\u003eUpdate\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eupdateCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eMatch\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eenableTransaction\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"nf\"\u003eRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;gorm:begin_transaction\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eBeginTransaction\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eupdateCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;gorm:setup_reflect_value\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eSetupUpdateReflectValue\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eupdateCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;gorm:before_update\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eBeforeUpdate\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eupdateCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;gorm:save_before_associations\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eSaveBeforeAssociations\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eupdateCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;gorm:update\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eUpdate\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003econfig\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eupdateCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;gorm:save_after_associations\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eSaveAfterAssociations\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eupdateCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;gorm:after_update\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eAfterUpdate\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eupdateCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eMatch\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eenableTransaction\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"nf\"\u003eRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;gorm:commit_or_rollback_transaction\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eCommitOrRollbackTransaction\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eupdateCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eClauses\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003econfig\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eUpdateClauses\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003erowCallback\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nf\"\u003eRow\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003erowCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;gorm:row\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eRowQuery\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003erowCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eClauses\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003econfig\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eQueryClauses\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003erawCallback\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nf\"\u003eRaw\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003erawCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;gorm:raw\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eRawExec\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003erawCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eClauses\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003econfig\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eQueryClauses\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e查询场景最值得注意的是下面几行：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003equeryCallback\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nf\"\u003eQuery\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003equeryCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;gorm:query\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eQuery\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003equeryCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;gorm:preload\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ePreload\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003equeryCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;gorm:after_query\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eAfterQuery\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003equeryCallback\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eClauses\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003econfig\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eQueryClauses\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003ccode\u003eRegister()\u003c/code\u003e 将回调信息加入 \u003ccode\u003ep.callbacks\u003c/code\u003e，随后由 \u003ccode\u003eprocessor.compile()\u003c/code\u003e 调用 \u003ccode\u003esortCallbacks()\u003c/code\u003e 处理排序，生成 \u003ccode\u003ep.fns\u003c/code\u003e。因此，\u003ccode\u003eExecute()\u003c/code\u003e 遍历的是已经准备好的回调函数列表。\u003c/p\u003e\n\u003cp\u003eMySQL 驱动这里传入的 \u003ccode\u003eQueryClauses\u003c/code\u003e 是空列表，\u003ccode\u003eRegisterDefaultCallbacks()\u003c/code\u003e 会回退到 GORM 的默认顺序：\u003ccode\u003eSELECT\u003c/code\u003e、\u003ccode\u003eFROM\u003c/code\u003e、\u003ccode\u003eWHERE\u003c/code\u003e、\u003ccode\u003eGROUP BY\u003c/code\u003e、\u003ccode\u003eORDER BY\u003c/code\u003e、\u003ccode\u003eLIMIT\u003c/code\u003e、\u003ccode\u003eFOR\u003c/code\u003e。这个列表保存到 \u003ccode\u003equeryCallback.Clauses\u003c/code\u003e，也就是前面的 \u003ccode\u003ep.Clauses\u003c/code\u003e。\u003c/p\u003e\n\u003cp\u003e这里需要区分两个概念：\u003ccode\u003ep.Clauses\u003c/code\u003e / \u003ccode\u003eStatement.BuildClauses\u003c/code\u003e 保存构建顺序，而 \u003ccode\u003eStatement.Clauses\u003c/code\u003e 保存具体的 Clause 内容。\u003c/p\u003e\n\u003ch2 id=\"query连接-sql-构建与执行\"\u003eQuery：连接 SQL 构建与执行\u003c/h2\u003e\n\u003cp\u003e\u003ccode\u003egorm:query\u003c/code\u003e 对应的回调函数是 \u003ccode\u003eQuery\u003c/code\u003e，它在没有已有错误时调用 \u003ccode\u003eBuildQuerySQL()\u003c/code\u003e。构建完成后，只有在非 \u003ccode\u003eDryRun\u003c/code\u003e 且没有错误时，才会调用 \u003ccode\u003eConnPool.QueryContext()\u003c/code\u003e 执行查询，并通过 \u003ccode\u003egorm.Scan()\u003c/code\u003e 将结果写入目标对象。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/go-gorm/gorm/blob/master/callbacks/query.go\"\u003equery.go\u003c/a\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eQuery\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003egorm\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDB\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eError\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"c1\"\u003e// 调用BuildQuerySQL方法\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"nf\"\u003eBuildQuerySQL\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e!\u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDryRun\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eError\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003erows\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eConnPool\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eQueryContext\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eContext\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eSQL\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eString\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eVars\u003c/span\u003e\u003cspan class=\"o\"\u003e...\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e!=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eAddError\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003edefer\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eAddError\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003erows\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eClose\u003c/span\u003e\u003cspan class=\"p\"\u003e())\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}()\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003egorm\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eScan\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003erows\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eBuildQuerySQL\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003egorm\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDB\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eSchema\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e!=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003e_\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ec\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003erange\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eSchema\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eQueryClauses\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eAddClause\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ec\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eSQL\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eLen\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eSQL\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eGrow\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e100\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eclauseSelect\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eclause\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eSelect\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"nx\"\u003eDistinct\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDistinct\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eReflectValue\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eKind\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ereflect\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStruct\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eReflectValue\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eType\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eSchema\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eModelType\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"kd\"\u003evar\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003econds\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[]\u003c/span\u003e\u003cspan class=\"nx\"\u003eclause\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eExpression\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003e_\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eprimaryField\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003erange\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eSchema\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ePrimaryFields\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ev\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eisZero\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eprimaryField\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eValueOf\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eContext\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eReflectValue\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e!\u003c/span\u003e\u003cspan class=\"nx\"\u003eisZero\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003econds\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003eappend\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003econds\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eclause\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eEq\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"nx\"\u003eColumn\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eclause\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eColumn\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"nx\"\u003eTable\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eTable\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eName\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eprimaryField\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDBName\u003c/span\u003e\u003cspan class=\"p\"\u003e},\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eValue\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ev\u003c/span\u003e\u003cspan class=\"p\"\u003e})\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003elen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003econds\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eAddClause\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eclause\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eWhere\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"nx\"\u003eExprs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003econds\u003c/span\u003e\u003cspan class=\"p\"\u003e})\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003elen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eSelects\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eclauseSelect\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eColumns\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003emake\u003c/span\u003e\u003cspan class=\"p\"\u003e([]\u003c/span\u003e\u003cspan class=\"nx\"\u003eclause\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eColumn\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003elen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eSelects\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eidx\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003erange\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eSelects\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eSchema\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eclauseSelect\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eColumns\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eidx\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eclause\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eColumn\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"nx\"\u003eName\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eRaw\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eelse\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ef\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eSchema\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eLookUpField\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ef\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e!=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eclauseSelect\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eColumns\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eidx\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eclause\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eColumn\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"nx\"\u003eName\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ef\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDBName\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eelse\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eclauseSelect\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eColumns\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eidx\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eclause\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eColumn\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"nx\"\u003eName\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eRaw\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eelse\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eSchema\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e!=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003elen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eOmits\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eselectColumns\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003e_\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eSelectAndOmitColumns\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eclauseSelect\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eColumns\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003emake\u003c/span\u003e\u003cspan class=\"p\"\u003e([]\u003c/span\u003e\u003cspan class=\"nx\"\u003eclause\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eColumn\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003elen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eSchema\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDBNames\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003e_\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edbName\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003erange\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eSchema\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDBNames\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ev\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eok\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eselectColumns\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003edbName\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eok\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ev\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e||\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e!\u003c/span\u003e\u003cspan class=\"nx\"\u003eok\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eclauseSelect\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eColumns\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003eappend\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eclauseSelect\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eColumns\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eclause\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eColumn\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"nx\"\u003eTable\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eTable\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eName\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edbName\u003c/span\u003e\u003cspan class=\"p\"\u003e})\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eelse\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eSchema\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e!=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eReflectValue\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eIsValid\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003equeryFields\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eQueryFields\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e!\u003c/span\u003e\u003cspan class=\"nx\"\u003equeryFields\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003eswitch\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eReflectValue\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eKind\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003ecase\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ereflect\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStruct\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003equeryFields\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eReflectValue\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eType\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e!=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eSchema\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eModelType\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003ecase\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ereflect\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eSlice\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003equeryFields\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eReflectValue\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eType\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"nf\"\u003eElem\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e!=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eSchema\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eModelType\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003equeryFields\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003estmt\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003egorm\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"nx\"\u003eDB\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\u003c/span\u003e\u003cspan class=\"c1\"\u003e// smaller struct\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003estmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eParse\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDest\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eQueryFields\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e||\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003estmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eSchema\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eModelType\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e!=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eSchema\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eModelType\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eclauseSelect\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eColumns\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003emake\u003c/span\u003e\u003cspan class=\"p\"\u003e([]\u003c/span\u003e\u003cspan class=\"nx\"\u003eclause\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eColumn\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003elen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003estmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eSchema\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDBNames\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eidx\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edbName\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003erange\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003estmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eSchema\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDBNames\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eclauseSelect\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eColumns\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eidx\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eclause\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eColumn\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"nx\"\u003eTable\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eTable\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eName\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edbName\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"c1\"\u003e// inline joins\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003efromClause\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eclause\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eFrom\u003c/span\u003e\u003cspan class=\"p\"\u003e{}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ev\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eok\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eClauses\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;FROM\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"nx\"\u003eExpression\u003c/span\u003e\u003cspan class=\"p\"\u003e.(\u003c/span\u003e\u003cspan class=\"nx\"\u003eclause\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eFrom\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eok\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003efromClause\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ev\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003elen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eJoins\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e!=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e||\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003elen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003efromClause\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eJoins\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e!=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003elen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eSelects\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003elen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eOmits\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eSchema\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e!=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eclauseSelect\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eColumns\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003emake\u003c/span\u003e\u003cspan class=\"p\"\u003e([]\u003c/span\u003e\u003cspan class=\"nx\"\u003eclause\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eColumn\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003elen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eSchema\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDBNames\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eidx\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edbName\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003erange\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eSchema\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDBNames\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eclauseSelect\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eColumns\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eidx\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eclause\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eColumn\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"nx\"\u003eTable\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eTable\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eName\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edbName\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003especifiedRelationsName\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003emake\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kd\"\u003emap\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"kd\"\u003einterface\u003c/span\u003e\u003cspan class=\"p\"\u003e{})\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003e_\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ejoin\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003erange\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eJoins\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eSchema\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e!=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"kd\"\u003evar\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eisRelations\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003ebool\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c1\"\u003e// is relations or raw sql\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"kd\"\u003evar\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003erelations\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[]\u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eschema\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eRelationship\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003erelation\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eok\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eSchema\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eRelationships\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eRelations\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003ejoin\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eName\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eok\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eisRelations\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003erelations\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003eappend\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003erelations\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003erelation\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eelse\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"c1\"\u003e// handle nested join like \u0026#34;Manager.Company\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003enestedJoinNames\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003estrings\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eSplit\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ejoin\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eName\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;.\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003elen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003enestedJoinNames\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eisNestedJoin\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003egussNestedRelations\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003emake\u003c/span\u003e\u003cspan class=\"p\"\u003e([]\u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eschema\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eRelationship\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003elen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003enestedJoinNames\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ecurrentRelations\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eSchema\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eRelationships\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eRelations\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003e_\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003erelname\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003erange\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003enestedJoinNames\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"c1\"\u003e// incomplete match, only treated as raw sql\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003erelation\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eok\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ecurrentRelations\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003erelname\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eok\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003egussNestedRelations\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003eappend\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003egussNestedRelations\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003erelation\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ecurrentRelations\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003erelation\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eFieldSchema\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eRelationships\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eRelations\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eelse\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eisNestedJoin\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003ebreak\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eisNestedJoin\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eisRelations\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003erelations\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003egussNestedRelations\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eisRelations\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003egenJoinClause\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ejoinType\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eclause\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eJoinType\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eparentTableName\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003erelation\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eschema\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eRelationship\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eclause\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eJoin\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003etableAliasName\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003erelation\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eName\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eparentTableName\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e!=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eclause\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eCurrentTable\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003etableAliasName\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eutils\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eNestedRelationName\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eparentTableName\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003etableAliasName\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ecolumnStmt\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003egorm\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eTable\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003etableAliasName\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eDB\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eSchema\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003erelation\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eFieldSchema\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eSelects\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ejoin\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eSelects\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eOmits\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ejoin\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eOmits\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eselectColumns\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003erestricted\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ecolumnStmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eSelectAndOmitColumns\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003e_\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003es\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003erange\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003erelation\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eFieldSchema\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDBNames\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ev\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eok\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eselectColumns\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003es\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eok\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ev\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e||\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(!\u003c/span\u003e\u003cspan class=\"nx\"\u003eok\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e!\u003c/span\u003e\u003cspan class=\"nx\"\u003erestricted\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eclauseSelect\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eColumns\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003eappend\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eclauseSelect\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eColumns\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eclause\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eColumn\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eTable\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003etableAliasName\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eName\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nx\"\u003es\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eAlias\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eutils\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eNestedRelationName\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003etableAliasName\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003es\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e})\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eexprs\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003emake\u003c/span\u003e\u003cspan class=\"p\"\u003e([]\u003c/span\u003e\u003cspan class=\"nx\"\u003eclause\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eExpression\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003elen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003erelation\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eReferences\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eidx\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eref\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003erange\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003erelation\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eReferences\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eref\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eOwnPrimaryKey\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eexprs\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eidx\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eclause\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eEq\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eColumn\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eclause\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eColumn\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"nx\"\u003eTable\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eparentTableName\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eName\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eref\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ePrimaryKey\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDBName\u003c/span\u003e\u003cspan class=\"p\"\u003e},\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eValue\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nx\"\u003eclause\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eColumn\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"nx\"\u003eTable\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003etableAliasName\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eName\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eref\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eForeignKey\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDBName\u003c/span\u003e\u003cspan class=\"p\"\u003e},\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eelse\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eref\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ePrimaryValue\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eexprs\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eidx\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eclause\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eEq\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eColumn\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eclause\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eColumn\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"nx\"\u003eTable\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eparentTableName\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eName\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eref\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eForeignKey\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDBName\u003c/span\u003e\u003cspan class=\"p\"\u003e},\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eValue\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nx\"\u003eclause\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eColumn\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"nx\"\u003eTable\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003etableAliasName\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eName\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eref\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ePrimaryKey\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDBName\u003c/span\u003e\u003cspan class=\"p\"\u003e},\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eelse\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eexprs\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003eidx\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eclause\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eEq\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eColumn\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eclause\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eColumn\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"nx\"\u003eTable\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003etableAliasName\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eName\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eref\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eForeignKey\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDBName\u003c/span\u003e\u003cspan class=\"p\"\u003e},\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eValue\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nx\"\u003eref\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ePrimaryValue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eonStmt\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003egorm\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"nx\"\u003eTable\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003etableAliasName\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eDB\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eClauses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003emap\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"nx\"\u003eclause\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eClause\u003c/span\u003e\u003cspan class=\"p\"\u003e{}}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003e_\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ec\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003erange\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003erelation\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eFieldSchema\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eQueryClauses\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eonStmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eAddClause\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ec\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ejoin\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eOn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e!=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eonStmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eAddClause\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ejoin\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eOn\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ecs\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eok\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eonStmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eClauses\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;WHERE\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eok\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ewhere\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eok\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ecs\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eExpression\u003c/span\u003e\u003cspan class=\"p\"\u003e.(\u003c/span\u003e\u003cspan class=\"nx\"\u003eclause\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eWhere\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eok\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ewhere\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eBuild\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nx\"\u003eonStmt\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eonSQL\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eonStmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eSQL\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eString\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eonSQL\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e!=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003evars\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eonStmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eVars\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eidx\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ev\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003erange\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003evars\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ebindvar\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003estrings\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eBuilder\u003c/span\u003e\u003cspan class=\"p\"\u003e{}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eonStmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eVars\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003evars\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eidx\u003c/span\u003e\u003cspan class=\"o\"\u003e+\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDialector\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eBindVarTo\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nx\"\u003ebindvar\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nx\"\u003eonStmt\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ev\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eonSQL\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003estrings\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eReplace\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eonSQL\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ebindvar\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eString\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;?\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eexprs\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003eappend\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eexprs\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eclause\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eExpr\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"nx\"\u003eSQL\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eonSQL\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eVars\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003evars\u003c/span\u003e\u003cspan class=\"p\"\u003e})\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eclause\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eJoin\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eType\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"nx\"\u003ejoinType\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eTable\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eclause\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eTable\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"nx\"\u003eName\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003erelation\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eFieldSchema\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eTable\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eAlias\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003etableAliasName\u003c/span\u003e\u003cspan class=\"p\"\u003e},\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eON\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eclause\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eWhere\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"nx\"\u003eExprs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eexprs\u003c/span\u003e\u003cspan class=\"p\"\u003e},\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eparentTableName\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eclause\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eCurrentTable\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003e_\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003erel\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003erange\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003erelations\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"c1\"\u003e// joins table alias like \u0026#34;Manager, Company, Manager__Company\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003enestedAlias\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eutils\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eNestedRelationName\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eparentTableName\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003erel\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eName\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003e_\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eok\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003especifiedRelationsName\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003enestedAlias\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e!\u003c/span\u003e\u003cspan class=\"nx\"\u003eok\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003efromClause\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eJoins\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003eappend\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003efromClause\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eJoins\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003egenJoinClause\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ejoin\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eJoinType\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eparentTableName\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003erel\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003especifiedRelationsName\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003enestedAlias\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eparentTableName\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e!=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eclause\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eCurrentTable\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eparentTableName\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eutils\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eNestedRelationName\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eparentTableName\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003erel\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eName\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eelse\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eparentTableName\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003erel\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eName\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eelse\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003efromClause\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eJoins\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003eappend\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003efromClause\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eJoins\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eclause\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eJoin\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eExpression\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eclause\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eNamedExpr\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"nx\"\u003eSQL\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ejoin\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eName\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eVars\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ejoin\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eConds\u003c/span\u003e\u003cspan class=\"p\"\u003e},\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e})\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eelse\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003efromClause\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eJoins\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003eappend\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003efromClause\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eJoins\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eclause\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eJoin\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eExpression\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eclause\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eNamedExpr\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"nx\"\u003eSQL\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ejoin\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eName\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eVars\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ejoin\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eConds\u003c/span\u003e\u003cspan class=\"p\"\u003e},\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e})\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eAddClause\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003efromClause\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eelse\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eAddClauseIfNotExists\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eclause\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eFrom\u003c/span\u003e\u003cspan class=\"p\"\u003e{})\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eAddClauseIfNotExists\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eclauseSelect\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"c1\"\u003e// db.Statement.BuildClauses眼熟吗？还记得前面的stmt.BuildClauses吗？\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eBuild\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eBuildClauses\u003c/span\u003e\u003cspan class=\"o\"\u003e...\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"buildquerysql准备-clause-并进入-sql-拼接\"\u003eBuildQuerySQL：准备 Clause 并进入 SQL 拼接\u003c/h2\u003e\n\u003cp\u003e\u003ccode\u003eBuildQuerySQL()\u003c/code\u003e 的源码较长，主要根据当前 \u003ccode\u003eStatement\u003c/code\u003e 中的 Schema、Select、Join 等信息，补充或合并查询所需的 Clause。\u003ccode\u003eFirst()\u003c/code\u003e 等方法已经设置的查询条件也保存在 \u003ccode\u003eStatement\u003c/code\u003e 中，供后续构建使用。JOIN 在这里通常作为 \u003ccode\u003eFROM\u003c/code\u003e Clause 的一部分构建。\u003c/p\u003e\n\u003cp\u003e当 \u003ccode\u003eStatement.SQL\u003c/code\u003e 为空时，它会准备 SELECT、FROM 等内容，最后调用：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eAddClauseIfNotExists\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eclauseSelect\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eBuild\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eBuildClauses\u003c/span\u003e\u003cspan class=\"o\"\u003e...\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e这里的 \u003ccode\u003eBuildClauses\u003c/code\u003e 正是前面 \u003ccode\u003eExecute()\u003c/code\u003e 在需要时从 query processor 取得的构建顺序。如果已经存在 SQL，这一段不会重新拼接。\u003c/p\u003e\n\u003ch2 id=\"statementbuild按照-clause-顺序生成-sql\"\u003eStatement.Build：按照 Clause 顺序生成 SQL\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/go-gorm/gorm/blob/master/statement.go\"\u003estatement.go\u003c/a\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Build build sql with clauses names\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003estmt\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eBuild\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eclauses\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e...\u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"kd\"\u003evar\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003efirstClauseWritten\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003ebool\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003e_\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003erange\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eclauses\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ec\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eok\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003estmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eClauses\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eok\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003efirstClauseWritten\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003estmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eWriteByte\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sc\"\u003e\u0026#39; \u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003efirstClauseWritten\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eb\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eok\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003estmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDB\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eClauseBuilders\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eok\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\u003c/span\u003e\u003cspan class=\"nf\"\u003eb\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ec\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003estmt\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eelse\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ec\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eBuild\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003estmt\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003ccode\u003eStatement.Build()\u003c/code\u003e 按传入的 Clause 名称顺序，在 \u003ccode\u003eStatement.Clauses\u003c/code\u003e 中查找对应内容。若数据库方言提供了自定义 \u003ccode\u003eClauseBuilder\u003c/code\u003e，优先调用它；否则进入通用的 \u003ccode\u003eClause.Build()\u003c/code\u003e。\u003c/p\u003e\n\u003ch2 id=\"clausebuildsql-片段是怎么拼出来的\"\u003eClause.Build：SQL 片段是怎么拼出来的\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/go-gorm/gorm/blob/master/clause/clause.go\"\u003eclause.go\u003c/a\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// ClauseBuilder clause builder, allows to customize how to build clause\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003etype\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eClauseBuilder\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eClause\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eBuilder\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003etype\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eWriter\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003einterface\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nf\"\u003eWriteByte\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003ebyte\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003eerror\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nf\"\u003eWriteString\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003eerror\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Builder builder interface\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003etype\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eBuilder\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003einterface\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eWriter\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nf\"\u003eWriteQuoted\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003efield\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003einterface\u003c/span\u003e\u003cspan class=\"p\"\u003e{})\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nf\"\u003eAddVar\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eWriter\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e...\u003c/span\u003e\u003cspan class=\"kd\"\u003einterface\u003c/span\u003e\u003cspan class=\"p\"\u003e{})\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nf\"\u003eAddError\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eerror\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003eerror\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Clause\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003etype\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eClause\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003estruct\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eName\u003c/span\u003e\u003cspan class=\"w\"\u003e                \u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"c1\"\u003e// WHERE\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eBeforeExpression\u003c/span\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003eExpression\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eAfterNameExpression\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eExpression\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eAfterExpression\u003c/span\u003e\u003cspan class=\"w\"\u003e     \u003c/span\u003e\u003cspan class=\"nx\"\u003eExpression\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eExpression\u003c/span\u003e\u003cspan class=\"w\"\u003e          \u003c/span\u003e\u003cspan class=\"nx\"\u003eExpression\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eBuilder\u003c/span\u003e\u003cspan class=\"w\"\u003e             \u003c/span\u003e\u003cspan class=\"nx\"\u003eClauseBuilder\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Build build clause\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ec\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eClause\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eBuild\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ebuilder\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eBuilder\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ec\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eBuilder\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e!=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ec\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eBuilder\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ec\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ebuilder\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eelse\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ec\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eExpression\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e!=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ec\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eBeforeExpression\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e!=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ec\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eBeforeExpression\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eBuild\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ebuilder\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ebuilder\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eWriteByte\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sc\"\u003e\u0026#39; \u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ec\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eName\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e!=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ebuilder\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eWriteString\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ec\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eName\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ebuilder\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eWriteByte\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sc\"\u003e\u0026#39; \u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ec\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eAfterNameExpression\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e!=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ec\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eAfterNameExpression\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eBuild\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ebuilder\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ebuilder\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eWriteByte\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sc\"\u003e\u0026#39; \u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ec\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eExpression\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eBuild\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ebuilder\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ec\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eAfterExpression\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e!=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ebuilder\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eWriteByte\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sc\"\u003e\u0026#39; \u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ec\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eAfterExpression\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eBuild\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ebuilder\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003ccode\u003eClause.Build()\u003c/code\u003e 优先使用 Clause 自身的 \u003ccode\u003eBuilder\u003c/code\u003e。没有自定义 Builder 时，它会输出 Clause 名称，并调用 \u003ccode\u003eExpression.Build()\u003c/code\u003e 等方法生成具体内容。\u003c/p\u003e\n\u003cp\u003e以 \u003ccode\u003eSELECT\u003c/code\u003e 为例，下面的 \u003ccode\u003eSelect\u003c/code\u003e 实现负责输出字段列表或 \u003ccode\u003e*\u003c/code\u003e；\u003ccode\u003eSELECT\u003c/code\u003e 关键字则由外层 \u003ccode\u003eClause.Build()\u003c/code\u003e 输出。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// Select select attrs when querying, updating, creating\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003etype\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eSelect\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003estruct\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eDistinct\u003c/span\u003e\u003cspan class=\"w\"\u003e   \u003c/span\u003e\u003cspan class=\"kt\"\u003ebool\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eColumns\u003c/span\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e[]\u003c/span\u003e\u003cspan class=\"nx\"\u003eColumn\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eExpression\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eExpression\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003es\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eSelect\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eName\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;SELECT\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003es\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eSelect\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eBuild\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ebuilder\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eBuilder\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003elen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003es\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eColumns\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003es\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDistinct\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ebuilder\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eWriteString\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;DISTINCT \u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eidx\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003ecolumn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003erange\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003es\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eColumns\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eidx\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ebuilder\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eWriteByte\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sc\"\u003e\u0026#39;,\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ebuilder\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eWriteQuoted\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ecolumn\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eelse\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ebuilder\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eWriteByte\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"sc\"\u003e\u0026#39;*\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003es\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eSelect\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eMergeClause\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eclause\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eClause\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003es\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eExpression\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e!=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003es\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eDistinct\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eexpr\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eok\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003es\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eExpression\u003c/span\u003e\u003cspan class=\"p\"\u003e.(\u003c/span\u003e\u003cspan class=\"nx\"\u003eExpr\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eok\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eexpr\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eSQL\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;DISTINCT \u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e+\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eexpr\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eSQL\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eclause\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eExpression\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eexpr\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\t\u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eclause\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eExpression\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003es\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eExpression\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eelse\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eclause\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eExpression\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003es\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003ccode\u003eSELECT\u003c/code\u003e、\u003ccode\u003eWHERE\u003c/code\u003e、\u003ccode\u003eFROM\u003c/code\u003e 等 SQL 片段通过相应的构建方法写入 \u003ccode\u003eStatement.SQL\u003c/code\u003e。参数化条件的构建还会收集参数到 \u003ccode\u003eStatement.Vars\u003c/code\u003e，并通过数据库方言生成对应的占位符。\u003c/p\u003e\n\u003ch2 id=\"sql-最终在哪里执行\"\u003eSQL 最终在哪里执行？\u003c/h2\u003e\n\u003cp\u003e\u003ccode\u003eBuildQuerySQL()\u003c/code\u003e 返回后，控制流程回到 \u003ccode\u003eQuery()\u003c/code\u003e。在非 \u003ccode\u003eDryRun\u003c/code\u003e 且没有错误时，它调用：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003erows\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eerr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eConnPool\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eQueryContext\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eContext\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eSQL\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eString\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nx\"\u003edb\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eStatement\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eVars\u003c/span\u003e\u003cspan class=\"o\"\u003e...\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e这里将 SQL 字符串和参数分别传给底层连接。\u003ccode\u003eStatement.SQL.String()\u003c/code\u003e 中可能仍然包含占位符，并不等同于日志里已经代入参数的 SQL 展示文本。\u003c/p\u003e\n\u003cp\u003e查询成功后，\u003ccode\u003egorm.Scan()\u003c/code\u003e 读取结果并填充目标对象。等 \u003ccode\u003eQuery()\u003c/code\u003e 返回，\u003ccode\u003eExecute()\u003c/code\u003e 继续执行其余回调，最后处理日志和前面提到的 SQL 清理工作。\u003c/p\u003e\n\u003ch2 id=\"总结\"\u003e总结\u003c/h2\u003e\n\u003cp\u003e回过头看 \u003ccode\u003edb.First(\u0026amp;product, 1)\u003c/code\u003e，可以把主要职责归纳为：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003ccode\u003eFirst()\u003c/code\u003e 设置限制、排序、条件和结果接收对象，进入 query processor。\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eprocessor.Execute()\u003c/code\u003e 准备 Statement 并执行已注册的 Callback，结束时处理日志与清理。\u003c/li\u003e\n\u003cli\u003e默认 \u003ccode\u003egorm:query\u003c/code\u003e 回调 \u003ccode\u003eQuery()\u003c/code\u003e 调用 \u003ccode\u003eBuildQuerySQL()\u003c/code\u003e，准备 SQL 构建所需的 Clause。\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eStatement.Build()\u003c/code\u003e 按顺序构建各个 Clause，通过通用或自定义 Builder 写入 SQL 并收集参数。\u003c/li\u003e\n\u003cli\u003e在非 \u003ccode\u003eDryRun\u003c/code\u003e 且没有错误时，\u003ccode\u003eQuery()\u003c/code\u003e 通过 \u003ccode\u003eQueryContext()\u003c/code\u003e 执行 SQL，再扫描查询结果。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e所以，追踪到 \u003ccode\u003ecallbacks.go\u003c/code\u003e 中的 \u003ccode\u003eprocessor.Execute\u003c/code\u003e 后，可以继续沿 \u003ccode\u003ep.fns\u003c/code\u003e 找到 \u003ccode\u003egorm:query\u003c/code\u003e 对应的 \u003ccode\u003eQuery()\u003c/code\u003e，再进入 \u003ccode\u003eBuildQuerySQL()\u003c/code\u003e 和 \u003ccode\u003eStatement.Build()\u003c/code\u003e，定位 SQL 实际构建的位置。\u003c/p\u003e\n\u003cp\u003e看了几回源码，这次把 Callback、Statement 和 Clause 几部分串起来，总算搞清楚了一条查询 SQL 从 API 到生成、执行的主要过程。\u003c/p\u003e\n","date_published":"2024-04-18T21:14:24+08:00","tags":["gorm"]},{"title":"工银亚洲网银密码重置","id":"https://liudon.com/posts/%E5%B7%A5%E9%93%B6%E4%BA%9A%E6%B4%B2%E7%BD%91%E9%93%B6%E5%AF%86%E7%A0%81%E9%87%8D%E7%BD%AE/","url":"https://liudon.com/posts/%E5%B7%A5%E9%93%B6%E4%BA%9A%E6%B4%B2%E7%BD%91%E9%93%B6%E5%AF%86%E7%A0%81%E9%87%8D%E7%BD%AE/","summary":"\u003cp\u003e18年的时候办了张工银亚洲的银行卡，好几年没有用过了。\u003c/p\u003e\n\u003cp\u003e今年想起来了，发现网银登不上了，密码忘了。\u003c/p\u003e\n\u003cp\u003e最悲剧的是，试了超过10次，账户冻结了。\u003c/p\u003e\n\u003cp\u003e打95588咨询了一下，说是可以内地见证方式修改密码，只需要带上港澳通行证和身份证即可。\u003c/p\u003e","content_html":"\u003cp\u003e18年的时候办了张工银亚洲的银行卡，好几年没有用过了。\u003c/p\u003e\n\u003cp\u003e今年想起来了，发现网银登不上了，密码忘了。\u003c/p\u003e\n\u003cp\u003e最悲剧的是，试了超过10次，账户冻结了。\u003c/p\u003e\n\u003cp\u003e打95588咨询了一下，说是可以内地见证方式修改密码，只需要带上港澳通行证和身份证即可。\u003c/p\u003e\n\u003cp\u003e1月27日，东城出入境办理港澳通行证签注，排队半个小时左右，自助机操作。\u003c/p\u003e\n\u003cp\u003e顺路跑到附近可以见证开户的工行，说需要香港那边配合，人周末不上班，只能工作日。\u003c/p\u003e\n\u003cp\u003e电话西二旗支行，说是可以早上早点来办理，要不过年人多，没时间处理。\u003c/p\u003e\n\u003cp\u003e1月30日，早上直奔银行，赶在开门前到，第一个办理。\u003c/p\u003e\n\u003cp\u003e工作人员会指导你填写资料，填完后会给你两个信封，里面是重置后的网银密码。\u003c/p\u003e\n\u003cp\u003e1月31日下午，95588打电话，我以为是广告没接。\u003c/p\u003e\n\u003cp\u003e第二天早上反应过来，在路上的时候又打过来了。\u003c/p\u003e\n\u003cp\u003e香港那边直接电话，跟你确认身份信息后，下午就收到工行发来的已更新资料邮件。\u003c/p\u003e\n\u003cp\u003e其实这里密码就重置完了，因为我同时办理了更新通信地址，我以为是只更新了地址。\u003c/p\u003e\n\u003cp\u003e至此，整个流程就办完了，还是非常方便的。\u003c/p\u003e\n\u003cp\u003e另外，发现招银亚洲也没法登陆了，U盾过期了，又跑了一趟招行，重新办了个U盾。\u003c/p\u003e\n\u003cp\u003e好了，这下两个银行都可以正常使用了。\u003c/p\u003e\n","date_published":"2024-03-16T10:09:59+08:00","tags":[]},{"title":"加速Cloudflare访问","id":"https://liudon.com/posts/%E5%8A%A0%E9%80%9Fcloudflare%E8%AE%BF%E9%97%AE/","url":"https://liudon.com/posts/%E5%8A%A0%E9%80%9Fcloudflare%E8%AE%BF%E9%97%AE/","summary":"\u003ch4 id=\"背景\"\u003e背景\u003c/h4\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/%E5%8A%A0%E9%80%9Fcloudflare%E8%AE%BF%E9%97%AE/blog.png_320x.avif 320w, https://liudon.com/posts/%E5%8A%A0%E9%80%9Fcloudflare%E8%AE%BF%E9%97%AE/blog.png_480x.avif 480w, https://liudon.com/posts/%E5%8A%A0%E9%80%9Fcloudflare%E8%AE%BF%E9%97%AE/blog.png_720x.avif 720w, https://liudon.com/posts/%E5%8A%A0%E9%80%9Fcloudflare%E8%AE%BF%E9%97%AE/blog.png_828x.avif 828w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/%E5%8A%A0%E9%80%9Fcloudflare%E8%AE%BF%E9%97%AE/blog.png_320x.webp 320w, https://liudon.com/posts/%E5%8A%A0%E9%80%9Fcloudflare%E8%AE%BF%E9%97%AE/blog.png_480x.webp 480w, https://liudon.com/posts/%E5%8A%A0%E9%80%9Fcloudflare%E8%AE%BF%E9%97%AE/blog.png_720x.webp 720w, https://liudon.com/posts/%E5%8A%A0%E9%80%9Fcloudflare%E8%AE%BF%E9%97%AE/blog.png_828x.webp 828w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/%E5%8A%A0%E9%80%9Fcloudflare%E8%AE%BF%E9%97%AE/blog.png\" alt=\"博客架构\"\n         width=\"828\" height=\"753\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e这是当前的博客架构，文件保存在\u003ccode\u003eGithub\u003c/code\u003e仓库，通过\u003ccode\u003eCloudflare Page\u003c/code\u003e提供访问。\u003c/p\u003e","content_html":"\u003ch4 id=\"背景\"\u003e背景\u003c/h4\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/%E5%8A%A0%E9%80%9Fcloudflare%E8%AE%BF%E9%97%AE/blog.png_320x.avif 320w, https://liudon.com/posts/%E5%8A%A0%E9%80%9Fcloudflare%E8%AE%BF%E9%97%AE/blog.png_480x.avif 480w, https://liudon.com/posts/%E5%8A%A0%E9%80%9Fcloudflare%E8%AE%BF%E9%97%AE/blog.png_720x.avif 720w, https://liudon.com/posts/%E5%8A%A0%E9%80%9Fcloudflare%E8%AE%BF%E9%97%AE/blog.png_828x.avif 828w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/%E5%8A%A0%E9%80%9Fcloudflare%E8%AE%BF%E9%97%AE/blog.png_320x.webp 320w, https://liudon.com/posts/%E5%8A%A0%E9%80%9Fcloudflare%E8%AE%BF%E9%97%AE/blog.png_480x.webp 480w, https://liudon.com/posts/%E5%8A%A0%E9%80%9Fcloudflare%E8%AE%BF%E9%97%AE/blog.png_720x.webp 720w, https://liudon.com/posts/%E5%8A%A0%E9%80%9Fcloudflare%E8%AE%BF%E9%97%AE/blog.png_828x.webp 828w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/%E5%8A%A0%E9%80%9Fcloudflare%E8%AE%BF%E9%97%AE/blog.png\" alt=\"博客架构\"\n         width=\"828\" height=\"753\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e这是当前的博客架构，文件保存在\u003ccode\u003eGithub\u003c/code\u003e仓库，通过\u003ccode\u003eCloudflare Page\u003c/code\u003e提供访问。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/%E5%8A%A0%E9%80%9Fcloudflare%E8%AE%BF%E9%97%AE/slow.png_320x.avif 320w, https://liudon.com/posts/%E5%8A%A0%E9%80%9Fcloudflare%E8%AE%BF%E9%97%AE/slow.png_480x.avif 480w, https://liudon.com/posts/%E5%8A%A0%E9%80%9Fcloudflare%E8%AE%BF%E9%97%AE/slow.png_720x.avif 720w, https://liudon.com/posts/%E5%8A%A0%E9%80%9Fcloudflare%E8%AE%BF%E9%97%AE/slow.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/%E5%8A%A0%E9%80%9Fcloudflare%E8%AE%BF%E9%97%AE/slow.png_320x.webp 320w, https://liudon.com/posts/%E5%8A%A0%E9%80%9Fcloudflare%E8%AE%BF%E9%97%AE/slow.png_480x.webp 480w, https://liudon.com/posts/%E5%8A%A0%E9%80%9Fcloudflare%E8%AE%BF%E9%97%AE/slow.png_720x.webp 720w, https://liudon.com/posts/%E5%8A%A0%E9%80%9Fcloudflare%E8%AE%BF%E9%97%AE/slow.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/%E5%8A%A0%E9%80%9Fcloudflare%E8%AE%BF%E9%97%AE/slow.png\" alt=\"国内访问情况\"\n         width=\"1080\" height=\"311\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e众所周知，在国内，\u003ccode\u003eCloudflare\u003c/code\u003e的CDN属于反向加速，平均耗时在1.5s左右。\u003c/p\u003e\n\u003cp\u003e今天，我们就来讲一下，如何实现国内海外双线路博客访问。\u003c/p\u003e\n\u003ch4 id=\"大体思路\"\u003e大体思路\u003c/h4\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e海外继续走Cloudflare Page，国内再套一层CDN回源Cloudflare Page。\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCloudflare Page已经提供了一个cname域名A，形如xxx.pages.dev。\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e国内CDN添加域名后，也会提供一个cname域名B。\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e使用国内dns解析服务，配置cname双线路解析。\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"具体操作\"\u003e具体操作\u003c/h4\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eCloudflare Page\u003c/code\u003e添加新域名解析\u003c/p\u003e\n\u003cp\u003e这个域名是为了给国内CDN回源使用，与博客当前域名不同即可。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/%E5%8A%A0%E9%80%9Fcloudflare%E8%AE%BF%E9%97%AE/page.png_320x.avif 320w, https://liudon.com/posts/%E5%8A%A0%E9%80%9Fcloudflare%E8%AE%BF%E9%97%AE/page.png_480x.avif 480w, https://liudon.com/posts/%E5%8A%A0%E9%80%9Fcloudflare%E8%AE%BF%E9%97%AE/page.png_720x.avif 720w, https://liudon.com/posts/%E5%8A%A0%E9%80%9Fcloudflare%E8%AE%BF%E9%97%AE/page.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/%E5%8A%A0%E9%80%9Fcloudflare%E8%AE%BF%E9%97%AE/page.png_320x.webp 320w, https://liudon.com/posts/%E5%8A%A0%E9%80%9Fcloudflare%E8%AE%BF%E9%97%AE/page.png_480x.webp 480w, https://liudon.com/posts/%E5%8A%A0%E9%80%9Fcloudflare%E8%AE%BF%E9%97%AE/page.png_720x.webp 720w, https://liudon.com/posts/%E5%8A%A0%E9%80%9Fcloudflare%E8%AE%BF%E9%97%AE/page.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/%E5%8A%A0%E9%80%9Fcloudflare%E8%AE%BF%E9%97%AE/page.png\" alt=\"Cloudflare Page添加域名\"\n         width=\"1080\" height=\"323\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e配置国内CDN\u003c/p\u003e\n\u003cp\u003e我用的腾讯云，其他服务商也是可以的。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/%E5%8A%A0%E9%80%9Fcloudflare%E8%AE%BF%E9%97%AE/cdn.png_320x.avif 320w, https://liudon.com/posts/%E5%8A%A0%E9%80%9Fcloudflare%E8%AE%BF%E9%97%AE/cdn.png_480x.avif 480w, https://liudon.com/posts/%E5%8A%A0%E9%80%9Fcloudflare%E8%AE%BF%E9%97%AE/cdn.png_720x.avif 720w, https://liudon.com/posts/%E5%8A%A0%E9%80%9Fcloudflare%E8%AE%BF%E9%97%AE/cdn.png_957x.avif 957w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/%E5%8A%A0%E9%80%9Fcloudflare%E8%AE%BF%E9%97%AE/cdn.png_320x.webp 320w, https://liudon.com/posts/%E5%8A%A0%E9%80%9Fcloudflare%E8%AE%BF%E9%97%AE/cdn.png_480x.webp 480w, https://liudon.com/posts/%E5%8A%A0%E9%80%9Fcloudflare%E8%AE%BF%E9%97%AE/cdn.png_720x.webp 720w, https://liudon.com/posts/%E5%8A%A0%E9%80%9Fcloudflare%E8%AE%BF%E9%97%AE/cdn.png_957x.webp 957w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/%E5%8A%A0%E9%80%9Fcloudflare%E8%AE%BF%E9%97%AE/cdn.png\" alt=\"添加CDN域名\"\n         width=\"957\" height=\"992\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e加速域名：填写博客对外访问的域名\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e回源地址和Host：填写第一步新加的域名\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e添加成功后，会有一个cname地址，这里是国内线路解析要用到的。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eDNS解析调整\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eCloudflare\u003c/code\u003e不支持双线路配置，国内服务商支持，我这里用的是腾讯云。\u003c/p\u003e\n\u003cp\u003e首先将域名的NS解析改为国内服务商的NS地址，修改后2周左右会收到\u003ccode\u003eCloudflare\u003c/code\u003e的邮件，不需要理会。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eliudon.com 的名称服务器不再指向 Cloudflare。它们现在指向：\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esandals.dnspod.net\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eheron.dnspod.net\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[not set]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[not set]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[not set]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e此更改意味着 liudon.com 不再使用 Cloudflare，因此不会再享受我们的安全和性能服务带来的优势。您的 DNS 记录将在 7 天内从我们的系统中彻底删除。\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e然后添加解析，默认走国内CDN，境外走\u003ccode\u003eCloudflare Page\u003c/code\u003e。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/%E5%8A%A0%E9%80%9Fcloudflare%E8%AE%BF%E9%97%AE/dns.png_320x.avif 320w, https://liudon.com/posts/%E5%8A%A0%E9%80%9Fcloudflare%E8%AE%BF%E9%97%AE/dns.png_480x.avif 480w, https://liudon.com/posts/%E5%8A%A0%E9%80%9Fcloudflare%E8%AE%BF%E9%97%AE/dns.png_720x.avif 720w, https://liudon.com/posts/%E5%8A%A0%E9%80%9Fcloudflare%E8%AE%BF%E9%97%AE/dns.png_1006x.avif 1006w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/%E5%8A%A0%E9%80%9Fcloudflare%E8%AE%BF%E9%97%AE/dns.png_320x.webp 320w, https://liudon.com/posts/%E5%8A%A0%E9%80%9Fcloudflare%E8%AE%BF%E9%97%AE/dns.png_480x.webp 480w, https://liudon.com/posts/%E5%8A%A0%E9%80%9Fcloudflare%E8%AE%BF%E9%97%AE/dns.png_720x.webp 720w, https://liudon.com/posts/%E5%8A%A0%E9%80%9Fcloudflare%E8%AE%BF%E9%97%AE/dns.png_1006x.webp 1006w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/%E5%8A%A0%E9%80%9Fcloudflare%E8%AE%BF%E9%97%AE/dns.png\" alt=\"DNS双线路解析\"\n         width=\"1006\" height=\"249\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch4 id=\"额外的问题\"\u003e额外的问题\u003c/h4\u003e\n\u003cp\u003e为了加速\u003ccode\u003eGoogle Analytics\u003c/code\u003e，使用\u003ccode\u003eCloudflare Worker\u003c/code\u003e进行了反代，具体见\u003ca href=\"https://liudon.com/posts/optimize-google-analytics/\"\u003e加速Google Analytics\u003c/a\u003e。\u003c/p\u003e\n\u003cp\u003e更改NS后，导致海外访问无法触发\u003ccode\u003eCloudflare Worker\u003c/code\u003e了，导致没有博客统计数据了。\u003c/p\u003e\n\u003cp\u003e经过一番搜索后，发现\u003ccode\u003eCloudflare Page\u003c/code\u003e有类似的\u003ccode\u003eFunction\u003c/code\u003e功能，只需要在网站根目录下新建\u003ccode\u003efunctions\u003c/code\u003e目录，添加对应文件即可。\u003c/p\u003e\n\u003cp\u003e这里以\u003ccode\u003eHugo\u003c/code\u003e静态博客举例说明：\u003c/p\u003e\n\u003cp\u003e在根目录的\u003ccode\u003estatic\u003c/code\u003e目录下，新建\u003ccode\u003efunctions\u003c/code\u003e目录，新建\u003ccode\u003eanalytics\u003c/code\u003e目录，添加\u003ccode\u003epost.js\u003c/code\u003e文件。\u003c/p\u003e\n\u003cp\u003e这个\u003ccode\u003eanalytics/post.js\u003c/code\u003e是为了对应原有\u003ccode\u003eWorker\u003c/code\u003e的访问地址\u003ccode\u003eanalytics/post\u003c/code\u003e，可自行修改。\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003epost.js\u003c/code\u003e文件代码如下：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eexport\u003c/span\u003e \u003cspan class=\"n\"\u003easync\u003c/span\u003e \u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003eonRequest\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003econtext\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003etry\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003eawait\u003c/span\u003e \u003cspan class=\"n\"\u003epostHandler\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003econtext\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"n\"\u003ecatch\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eResponse\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"err\"\u003e`\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003emessage\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\\\u003cspan class=\"n\"\u003en\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003estack\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"err\"\u003e`\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"n\"\u003estatus\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e500\u003c/span\u003e \u003cspan class=\"p\"\u003e});\u003c/span\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003easync\u003c/span\u003e \u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003epostHandler\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003econtext\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003eGA_DOMAIN\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;google-analytics.com\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003eGA_COLLECT_PATH\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;g\\/collect\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003eCOLLECT_PATH\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;analytics/post\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003eDOMAIN\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;这里填你博客的域名\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003eurl\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003econtext\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003erequest\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eurl\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003ecf_ip\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003econtext\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003erequest\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eheaders\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;CF-Connecting-IP\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003ecf_country\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003econtext\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003erequest\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecf\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecountry\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003ega_url\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eurl\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ereplace\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"err\"\u003e`\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003eDOMAIN\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"o\"\u003e/$\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003eCOLLECT_PATH\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"err\"\u003e`\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"err\"\u003e`\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003eGA_DOMAIN\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"o\"\u003e/$\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003eGA_COLLECT_PATH\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"err\"\u003e`\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003enewReq\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eawait\u003c/span\u003e \u003cspan class=\"n\"\u003ereadRequest\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003econtext\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003erequest\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ega_url\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003econtext\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ewaitUntil\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003efetch\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003enewReq\u003c/span\u003e\u003cspan class=\"p\"\u003e));\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eResponse\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003enull\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003estatus\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e204\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003estatusText\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;No Content\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003easync\u003c/span\u003e \u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003ereadRequest\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003erequest\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eurl\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"n\"\u003e_\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eheaders\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003erequest\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003enq\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"n\"\u003emethod\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003erequest\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003emethod\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"n\"\u003eheaders\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eOrigin\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eheaders\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;origin\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"s1\"\u003e\u0026#39;Cache-Control\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;max-age=0\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"s1\"\u003e\u0026#39;User-Agent\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eheaders\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;user-agent\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eAccept\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eheaders\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;accept\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"s1\"\u003e\u0026#39;Accept-Language\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eheaders\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;accept-language\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"s1\"\u003e\u0026#39;Content-Type\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eheaders\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;content-type\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;text/plain\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eReferer\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eheaders\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;referer\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"n\"\u003ebody\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003erequest\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ebody\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eRequest\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eurl\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003enq\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"优化效果\"\u003e优化效果\u003c/h4\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/%E5%8A%A0%E9%80%9Fcloudflare%E8%AE%BF%E9%97%AE/result.png_320x.avif 320w, https://liudon.com/posts/%E5%8A%A0%E9%80%9Fcloudflare%E8%AE%BF%E9%97%AE/result.png_480x.avif 480w, https://liudon.com/posts/%E5%8A%A0%E9%80%9Fcloudflare%E8%AE%BF%E9%97%AE/result.png_720x.avif 720w, https://liudon.com/posts/%E5%8A%A0%E9%80%9Fcloudflare%E8%AE%BF%E9%97%AE/result.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/%E5%8A%A0%E9%80%9Fcloudflare%E8%AE%BF%E9%97%AE/result.png_320x.webp 320w, https://liudon.com/posts/%E5%8A%A0%E9%80%9Fcloudflare%E8%AE%BF%E9%97%AE/result.png_480x.webp 480w, https://liudon.com/posts/%E5%8A%A0%E9%80%9Fcloudflare%E8%AE%BF%E9%97%AE/result.png_720x.webp 720w, https://liudon.com/posts/%E5%8A%A0%E9%80%9Fcloudflare%E8%AE%BF%E9%97%AE/result.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/%E5%8A%A0%E9%80%9Fcloudflare%E8%AE%BF%E9%97%AE/result.png\" alt=\"优化后的访问\"\n         width=\"1080\" height=\"284\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e有了国内CDN的加持，平均耗时优化到1s左右了。\u003c/p\u003e\n","date_published":"2024-02-21T20:25:49+08:00","tags":["cloudflare","博客优化"]},{"title":"2023年终总结","id":"https://liudon.com/posts/review-2023/","url":"https://liudon.com/posts/review-2023/","summary":"\u003cp\u003e2023年过完了，是时候来个总结了。\u003c/p\u003e\n\u003ch4 id=\"博客\"\u003e博客\u003c/h4\u003e\n\u003cp\u003e2023年一共更新了15篇内容，共计12000字。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/review-2023/20240104184720.png_320x.avif 320w, https://liudon.com/posts/review-2023/20240104184720.png_480x.avif 480w, https://liudon.com/posts/review-2023/20240104184720.png_720x.avif 720w, https://liudon.com/posts/review-2023/20240104184720.png_733x.avif 733w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/review-2023/20240104184720.png_320x.webp 320w, https://liudon.com/posts/review-2023/20240104184720.png_480x.webp 480w, https://liudon.com/posts/review-2023/20240104184720.png_720x.webp 720w, https://liudon.com/posts/review-2023/20240104184720.png_733x.webp 733w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/review-2023/20240104184720.png\" alt=\"Google Analytics全年统计\"\n         width=\"733\" height=\"436\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e","content_html":"\u003cp\u003e2023年过完了，是时候来个总结了。\u003c/p\u003e\n\u003ch4 id=\"博客\"\u003e博客\u003c/h4\u003e\n\u003cp\u003e2023年一共更新了15篇内容，共计12000字。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/review-2023/20240104184720.png_320x.avif 320w, https://liudon.com/posts/review-2023/20240104184720.png_480x.avif 480w, https://liudon.com/posts/review-2023/20240104184720.png_720x.avif 720w, https://liudon.com/posts/review-2023/20240104184720.png_733x.avif 733w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/review-2023/20240104184720.png_320x.webp 320w, https://liudon.com/posts/review-2023/20240104184720.png_480x.webp 480w, https://liudon.com/posts/review-2023/20240104184720.png_720x.webp 720w, https://liudon.com/posts/review-2023/20240104184720.png_733x.webp 733w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/review-2023/20240104184720.png\" alt=\"Google Analytics全年统计\"\n         width=\"733\" height=\"436\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e访问Top3的文章：\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://liudon.com/posts/deploy-blog-to-ipfs/\"\u003e将博客部署到星际文件系统(IPFS)\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://liudon.com/posts/using-github-actions-to-schedule-weibo-scraping/\"\u003e利用Github Actions定时抓取微博\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://liudon.com/posts/fix-blog-cls/\"\u003e优化博客的累计布局偏移(CLS)问题\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e主要是因为有在v2ex发帖导流，所以访问量高一些。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://liudon.com/posts/2023%E5%B9%B412%E6%9C%88%E5%8C%97%E4%BA%AC%E6%9A%B4%E9%9B%AA%E8%AE%B0%E5%BD%95/\"\u003e2023年12月北京暴雪记录\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e没想到的是一篇暴雪记录，收获了最多的评论，可能大家更容易共情。\u003c/p\u003e\n\u003cp\u003e不过从侧面也说明了技术的东西并没有太多人看，所以后来就不再分享导流了。\u003c/p\u003e\n\u003ch4 id=\"工作\"\u003e工作\u003c/h4\u003e\n\u003cp\u003e今年搬到了后厂村，见识了互联网的人流。\u003c/p\u003e\n\u003cp\u003e在23年最后一个工作日，下班路上，算了一下，这一年晚上9点半之后打车59次。\u003c/p\u003e\n\u003cp\u003e而且年底这段时间，打车愈发困难，至少要排队1个小时。\u003c/p\u003e\n\u003cp\u003e相比之前一坐坐一天，每天中午会绕公司大楼转两圈。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/review-2023/20240104190037.jpg_320x.avif 320w, https://liudon.com/posts/review-2023/20240104190037.jpg_480x.avif 480w, https://liudon.com/posts/review-2023/20240104190037.jpg_720x.avif 720w, https://liudon.com/posts/review-2023/20240104190037.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/review-2023/20240104190037.jpg_320x.webp 320w, https://liudon.com/posts/review-2023/20240104190037.jpg_480x.webp 480w, https://liudon.com/posts/review-2023/20240104190037.jpg_720x.webp 720w, https://liudon.com/posts/review-2023/20240104190037.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/review-2023/20240104190037.jpg\" alt=\"23年步行统计\"\n         width=\"1080\" height=\"1099\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003ch4 id=\"驾照\"\u003e驾照\u003c/h4\u003e\n\u003cp\u003e\u003ca href=\"https://liudon.com/posts/my-journey-of-learning-to-drive/\"\u003e驾照终于到手了\u003c/a\u003e。\u003c/p\u003e\n\u003cp\u003e趁着娃暑假、十一假期，开车上路了。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/review-2023/20240104190649.jpg_320x.avif 320w, https://liudon.com/posts/review-2023/20240104190649.jpg_480x.avif 480w, https://liudon.com/posts/review-2023/20240104190649.jpg_720x.avif 720w, https://liudon.com/posts/review-2023/20240104190649.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/review-2023/20240104190649.jpg_320x.webp 320w, https://liudon.com/posts/review-2023/20240104190649.jpg_480x.webp 480w, https://liudon.com/posts/review-2023/20240104190649.jpg_720x.webp 720w, https://liudon.com/posts/review-2023/20240104190649.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/review-2023/20240104190649.jpg\" alt=\"第一次开车上路\"\n         width=\"1080\" height=\"1920\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e参与了第一次摇号。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/review-2023/20240106165345.jpg_320x.avif 320w, https://liudon.com/posts/review-2023/20240106165345.jpg_480x.avif 480w, https://liudon.com/posts/review-2023/20240106165345.jpg_720x.avif 720w, https://liudon.com/posts/review-2023/20240106165345.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/review-2023/20240106165345.jpg_320x.webp 320w, https://liudon.com/posts/review-2023/20240106165345.jpg_480x.webp 480w, https://liudon.com/posts/review-2023/20240106165345.jpg_720x.webp 720w, https://liudon.com/posts/review-2023/20240106165345.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/review-2023/20240106165345.jpg\" alt=\"\"\n         width=\"1080\" height=\"2341\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003ch4 id=\"换了新手机\"\u003e换了新手机\u003c/h4\u003e\n\u003cp\u003e用了5年的iPhone7 plus，过地铁NFC时不时刷不开了，感觉得换手机了。\u003c/p\u003e\n\u003cp\u003e十一假期回来在官网订了15pro，需要11月21日才能发货。\u003c/p\u003e\n\u003cp\u003e订货后，老手机的问题越来越多，换手机变的急迫起来。\u003c/p\u003e\n\u003cp\u003e于是，开始刷实体店取货。\u003c/p\u003e\n\u003cp\u003e用了探火app监控，10月11日中午抢到一台王府井取货。\u003c/p\u003e\n\u003cp\u003e10月12日晚上8点出发，上16号线地铁后，老手机开始持续发烫，过一会自动黑屏了。\u003c/p\u003e\n\u003cp\u003e按键有触感，但是屏幕不亮，怎么捣鼓也不行，手机越来越烫，都有点怕它炸了。\u003c/p\u003e\n\u003cp\u003e换乘8号线的路上，试了试按住所有按键，手机重启了，看见苹果logo那一刻真好。\u003c/p\u003e\n\u003cp\u003e重启完总算正常了，进店排队取货，提前了一个月拿到了新手机。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/review-2023/20240105132858.jpg_320x.avif 320w, https://liudon.com/posts/review-2023/20240105132858.jpg_480x.avif 480w, https://liudon.com/posts/review-2023/20240105132858.jpg_720x.avif 720w, https://liudon.com/posts/review-2023/20240105132858.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/review-2023/20240105132858.jpg_320x.webp 320w, https://liudon.com/posts/review-2023/20240105132858.jpg_480x.webp 480w, https://liudon.com/posts/review-2023/20240105132858.jpg_720x.webp 720w, https://liudon.com/posts/review-2023/20240105132858.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/review-2023/20240105132858.jpg\" alt=\"王府井Apple Store\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/review-2023/20240105132906.jpg_320x.avif 320w, https://liudon.com/posts/review-2023/20240105132906.jpg_480x.avif 480w, https://liudon.com/posts/review-2023/20240105132906.jpg_720x.avif 720w, https://liudon.com/posts/review-2023/20240105132906.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/review-2023/20240105132906.jpg_320x.webp 320w, https://liudon.com/posts/review-2023/20240105132906.jpg_480x.webp 480w, https://liudon.com/posts/review-2023/20240105132906.jpg_720x.webp 720w, https://liudon.com/posts/review-2023/20240105132906.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/review-2023/20240105132906.jpg\" alt=\"取完手机\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e升级体验非常好，使用丝滑，再也不用插着充电器玩手机了，感谢老婆。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/review-2023/20240105133752.jpg_320x.avif 320w, https://liudon.com/posts/review-2023/20240105133752.jpg_480x.avif 480w, https://liudon.com/posts/review-2023/20240105133752.jpg_720x.avif 720w, https://liudon.com/posts/review-2023/20240105133752.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/review-2023/20240105133752.jpg_320x.webp 320w, https://liudon.com/posts/review-2023/20240105133752.jpg_480x.webp 480w, https://liudon.com/posts/review-2023/20240105133752.jpg_720x.webp 720w, https://liudon.com/posts/review-2023/20240105133752.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/review-2023/20240105133752.jpg\" alt=\"大风\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/review-2023/20240105133758.jpg_320x.avif 320w, https://liudon.com/posts/review-2023/20240105133758.jpg_480x.avif 480w, https://liudon.com/posts/review-2023/20240105133758.jpg_720x.avif 720w, https://liudon.com/posts/review-2023/20240105133758.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/review-2023/20240105133758.jpg_320x.webp 320w, https://liudon.com/posts/review-2023/20240105133758.jpg_480x.webp 480w, https://liudon.com/posts/review-2023/20240105133758.jpg_720x.webp 720w, https://liudon.com/posts/review-2023/20240105133758.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/review-2023/20240105133758.jpg\" alt=\"公司大楼\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/review-2023/20240105133747.jpg_320x.avif 320w, https://liudon.com/posts/review-2023/20240105133747.jpg_480x.avif 480w, https://liudon.com/posts/review-2023/20240105133747.jpg_720x.avif 720w, https://liudon.com/posts/review-2023/20240105133747.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/review-2023/20240105133747.jpg_320x.webp 320w, https://liudon.com/posts/review-2023/20240105133747.jpg_480x.webp 480w, https://liudon.com/posts/review-2023/20240105133747.jpg_720x.webp 720w, https://liudon.com/posts/review-2023/20240105133747.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/review-2023/20240105133747.jpg\" alt=\"枫叶\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/review-2023/20240105133803.jpg_320x.avif 320w, https://liudon.com/posts/review-2023/20240105133803.jpg_480x.avif 480w, https://liudon.com/posts/review-2023/20240105133803.jpg_720x.avif 720w, https://liudon.com/posts/review-2023/20240105133803.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/review-2023/20240105133803.jpg_320x.webp 320w, https://liudon.com/posts/review-2023/20240105133803.jpg_480x.webp 480w, https://liudon.com/posts/review-2023/20240105133803.jpg_720x.webp 720w, https://liudon.com/posts/review-2023/20240105133803.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/review-2023/20240105133803.jpg\" alt=\"秋\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/review-2023/20240105133808.jpg_320x.avif 320w, https://liudon.com/posts/review-2023/20240105133808.jpg_480x.avif 480w, https://liudon.com/posts/review-2023/20240105133808.jpg_720x.avif 720w, https://liudon.com/posts/review-2023/20240105133808.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/review-2023/20240105133808.jpg_320x.webp 320w, https://liudon.com/posts/review-2023/20240105133808.jpg_480x.webp 480w, https://liudon.com/posts/review-2023/20240105133808.jpg_720x.webp 720w, https://liudon.com/posts/review-2023/20240105133808.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/review-2023/20240105133808.jpg\" alt=\"冬\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/review-2023/20240105133819.jpg_320x.avif 320w, https://liudon.com/posts/review-2023/20240105133819.jpg_480x.avif 480w, https://liudon.com/posts/review-2023/20240105133819.jpg_720x.avif 720w, https://liudon.com/posts/review-2023/20240105133819.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/review-2023/20240105133819.jpg_320x.webp 320w, https://liudon.com/posts/review-2023/20240105133819.jpg_480x.webp 480w, https://liudon.com/posts/review-2023/20240105133819.jpg_720x.webp 720w, https://liudon.com/posts/review-2023/20240105133819.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/review-2023/20240105133819.jpg\" alt=\"冬\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/review-2023/20240105133739.jpg_320x.avif 320w, https://liudon.com/posts/review-2023/20240105133739.jpg_480x.avif 480w, https://liudon.com/posts/review-2023/20240105133739.jpg_720x.avif 720w, https://liudon.com/posts/review-2023/20240105133739.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/review-2023/20240105133739.jpg_320x.webp 320w, https://liudon.com/posts/review-2023/20240105133739.jpg_480x.webp 480w, https://liudon.com/posts/review-2023/20240105133739.jpg_720x.webp 720w, https://liudon.com/posts/review-2023/20240105133739.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/review-2023/20240105133739.jpg\" alt=\"秋天的百望山\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/review-2023/20240105133814.jpg_320x.avif 320w, https://liudon.com/posts/review-2023/20240105133814.jpg_480x.avif 480w, https://liudon.com/posts/review-2023/20240105133814.jpg_720x.avif 720w, https://liudon.com/posts/review-2023/20240105133814.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/review-2023/20240105133814.jpg_320x.webp 320w, https://liudon.com/posts/review-2023/20240105133814.jpg_480x.webp 480w, https://liudon.com/posts/review-2023/20240105133814.jpg_720x.webp 720w, https://liudon.com/posts/review-2023/20240105133814.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/review-2023/20240105133814.jpg\" alt=\"冬天的百望山\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/review-2023/20240105133825.jpg_320x.avif 320w, https://liudon.com/posts/review-2023/20240105133825.jpg_480x.avif 480w, https://liudon.com/posts/review-2023/20240105133825.jpg_720x.avif 720w, https://liudon.com/posts/review-2023/20240105133825.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/review-2023/20240105133825.jpg_320x.webp 320w, https://liudon.com/posts/review-2023/20240105133825.jpg_480x.webp 480w, https://liudon.com/posts/review-2023/20240105133825.jpg_720x.webp 720w, https://liudon.com/posts/review-2023/20240105133825.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/review-2023/20240105133825.jpg\" alt=\"冬天的百望山\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003ch4 id=\"财务\"\u003e财务\u003c/h4\u003e\n\u003cp\u003e提前还了两笔房贷，希望明年可以把商贷还完。\u003c/p\u003e\n\u003cp\u003e股市收益率-1.11%，港股套牢中，美股稍微回了点血。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/review-2023/20240104191508.jpg_320x.avif 320w, https://liudon.com/posts/review-2023/20240104191508.jpg_480x.avif 480w, https://liudon.com/posts/review-2023/20240104191508.jpg_720x.avif 720w, https://liudon.com/posts/review-2023/20240104191508.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/review-2023/20240104191508.jpg_320x.webp 320w, https://liudon.com/posts/review-2023/20240104191508.jpg_480x.webp 480w, https://liudon.com/posts/review-2023/20240104191508.jpg_720x.webp 720w, https://liudon.com/posts/review-2023/20240104191508.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/review-2023/20240104191508.jpg\" alt=\"股市收益\"\n         width=\"1080\" height=\"939\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e本命年了，希望一切顺利。\u003c/p\u003e\n\u003cp\u003e祝大家新年快乐！\u003c/p\u003e\n","date_published":"2024-01-04T18:41:20+08:00","tags":["年终总结"]},{"title":"2023年12月北京暴雪记录","id":"https://liudon.com/posts/2023%E5%B9%B412%E6%9C%88%E5%8C%97%E4%BA%AC%E6%9A%B4%E9%9B%AA%E8%AE%B0%E5%BD%95/","url":"https://liudon.com/posts/2023%E5%B9%B412%E6%9C%88%E5%8C%97%E4%BA%AC%E6%9A%B4%E9%9B%AA%E8%AE%B0%E5%BD%95/","summary":"\u003cblockquote\u003e\n\u003cp\u003e记录暴雪下普通打工人的生活。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch4 id=\"12月14日-周四\"\u003e12月14日 周四\u003c/h4\u003e\n\u003cp\u003e北京的雪已经连着下了两天了。\u003c/p\u003e\n\u003cp\u003e12月11日，也是因为下雪，晚上打车打到10点半才叫到车。\u003c/p\u003e\n\u003cp\u003e所以这次下雪后，晚上就早走了。\u003c/p\u003e","content_html":"\u003cblockquote\u003e\n\u003cp\u003e记录暴雪下普通打工人的生活。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch4 id=\"12月14日-周四\"\u003e12月14日 周四\u003c/h4\u003e\n\u003cp\u003e北京的雪已经连着下了两天了。\u003c/p\u003e\n\u003cp\u003e12月11日，也是因为下雪，晚上打车打到10点半才叫到车。\u003c/p\u003e\n\u003cp\u003e所以这次下雪后，晚上就早走了。\u003c/p\u003e\n\u003cp\u003e7:15坐上公司摆渡车，7:40左右到西二旗。\u003c/p\u003e\n\u003cp\u003e下车前刷微博看到有说昌平线故障，还没细看就到站下车了，还没想到事情的严重性。\u003c/p\u003e\n\u003cp\u003e路口已经有交警在指挥交通，看见两辆消防车在等红灯，事后想可能是去救援的。\u003c/p\u003e\n\u003cp\u003e走到进站口，就听到有人喊，“昌平线故障不停车，请更换其他交通工具”。\u003c/p\u003e\n\u003cp\u003e我坐13号线，继续往前走，就看到了下面的情景。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/2023%E5%B9%B412%E6%9C%88%E5%8C%97%E4%BA%AC%E6%9A%B4%E9%9B%AA%E8%AE%B0%E5%BD%95/WechatIMG150.jpg_320x.avif 320w, https://liudon.com/posts/2023%E5%B9%B412%E6%9C%88%E5%8C%97%E4%BA%AC%E6%9A%B4%E9%9B%AA%E8%AE%B0%E5%BD%95/WechatIMG150.jpg_480x.avif 480w, https://liudon.com/posts/2023%E5%B9%B412%E6%9C%88%E5%8C%97%E4%BA%AC%E6%9A%B4%E9%9B%AA%E8%AE%B0%E5%BD%95/WechatIMG150.jpg_720x.avif 720w, https://liudon.com/posts/2023%E5%B9%B412%E6%9C%88%E5%8C%97%E4%BA%AC%E6%9A%B4%E9%9B%AA%E8%AE%B0%E5%BD%95/WechatIMG150.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/2023%E5%B9%B412%E6%9C%88%E5%8C%97%E4%BA%AC%E6%9A%B4%E9%9B%AA%E8%AE%B0%E5%BD%95/WechatIMG150.jpg_320x.webp 320w, https://liudon.com/posts/2023%E5%B9%B412%E6%9C%88%E5%8C%97%E4%BA%AC%E6%9A%B4%E9%9B%AA%E8%AE%B0%E5%BD%95/WechatIMG150.jpg_480x.webp 480w, https://liudon.com/posts/2023%E5%B9%B412%E6%9C%88%E5%8C%97%E4%BA%AC%E6%9A%B4%E9%9B%AA%E8%AE%B0%E5%BD%95/WechatIMG150.jpg_720x.webp 720w, https://liudon.com/posts/2023%E5%B9%B412%E6%9C%88%E5%8C%97%E4%BA%AC%E6%9A%B4%E9%9B%AA%E8%AE%B0%E5%BD%95/WechatIMG150.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/2023%E5%B9%B412%E6%9C%88%E5%8C%97%E4%BA%AC%E6%9A%B4%E9%9B%AA%E8%AE%B0%E5%BD%95/WechatIMG150.jpg\" alt=\"西二旗进站口\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e栏杆里全是人，后面的人还在不断的往里进。\u003c/p\u003e\n\u003cp\u003e看了下门口的人不动，人太多，不敢进去，先看看情况。\u003c/p\u003e\n\u003cp\u003e过了一会，有人喊13号线也停了，扭头赶紧走。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/2023%E5%B9%B412%E6%9C%88%E5%8C%97%E4%BA%AC%E6%9A%B4%E9%9B%AA%E8%AE%B0%E5%BD%95/WechatIMG151.jpg_320x.avif 320w, https://liudon.com/posts/2023%E5%B9%B412%E6%9C%88%E5%8C%97%E4%BA%AC%E6%9A%B4%E9%9B%AA%E8%AE%B0%E5%BD%95/WechatIMG151.jpg_480x.avif 480w, https://liudon.com/posts/2023%E5%B9%B412%E6%9C%88%E5%8C%97%E4%BA%AC%E6%9A%B4%E9%9B%AA%E8%AE%B0%E5%BD%95/WechatIMG151.jpg_720x.avif 720w, https://liudon.com/posts/2023%E5%B9%B412%E6%9C%88%E5%8C%97%E4%BA%AC%E6%9A%B4%E9%9B%AA%E8%AE%B0%E5%BD%95/WechatIMG151.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/2023%E5%B9%B412%E6%9C%88%E5%8C%97%E4%BA%AC%E6%9A%B4%E9%9B%AA%E8%AE%B0%E5%BD%95/WechatIMG151.jpg_320x.webp 320w, https://liudon.com/posts/2023%E5%B9%B412%E6%9C%88%E5%8C%97%E4%BA%AC%E6%9A%B4%E9%9B%AA%E8%AE%B0%E5%BD%95/WechatIMG151.jpg_480x.webp 480w, https://liudon.com/posts/2023%E5%B9%B412%E6%9C%88%E5%8C%97%E4%BA%AC%E6%9A%B4%E9%9B%AA%E8%AE%B0%E5%BD%95/WechatIMG151.jpg_720x.webp 720w, https://liudon.com/posts/2023%E5%B9%B412%E6%9C%88%E5%8C%97%E4%BA%AC%E6%9A%B4%E9%9B%AA%E8%AE%B0%E5%BD%95/WechatIMG151.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/2023%E5%B9%B412%E6%9C%88%E5%8C%97%E4%BA%AC%E6%9A%B4%E9%9B%AA%E8%AE%B0%E5%BD%95/WechatIMG151.jpg\" alt=\"打车等候人数\"\n         width=\"1080\" height=\"2340\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e第一反应打车，看了下，排队900人，直接放弃，换公交。\u003c/p\u003e\n\u003cp\u003e最近的公交站在西二旗大街，走吧。\u003c/p\u003e\n\u003cp\u003e到公交站一看，人更多，本来路就窄，全是人，走都没法走。\u003c/p\u003e\n\u003cp\u003e公交也没戏了，继续走吧，走过这段到前面看看再。\u003c/p\u003e\n\u003cp\u003e事后看说有的车被挤爆了，吓的别的车都不敢开门了。\u003c/p\u003e\n\u003cp\u003e走的有点冷，闻见一股香味，一看手机快8点半了，找个地吃点东西先。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/2023%E5%B9%B412%E6%9C%88%E5%8C%97%E4%BA%AC%E6%9A%B4%E9%9B%AA%E8%AE%B0%E5%BD%95/WechatIMG152.jpg_320x.avif 320w, https://liudon.com/posts/2023%E5%B9%B412%E6%9C%88%E5%8C%97%E4%BA%AC%E6%9A%B4%E9%9B%AA%E8%AE%B0%E5%BD%95/WechatIMG152.jpg_480x.avif 480w, https://liudon.com/posts/2023%E5%B9%B412%E6%9C%88%E5%8C%97%E4%BA%AC%E6%9A%B4%E9%9B%AA%E8%AE%B0%E5%BD%95/WechatIMG152.jpg_720x.avif 720w, https://liudon.com/posts/2023%E5%B9%B412%E6%9C%88%E5%8C%97%E4%BA%AC%E6%9A%B4%E9%9B%AA%E8%AE%B0%E5%BD%95/WechatIMG152.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/2023%E5%B9%B412%E6%9C%88%E5%8C%97%E4%BA%AC%E6%9A%B4%E9%9B%AA%E8%AE%B0%E5%BD%95/WechatIMG152.jpg_320x.webp 320w, https://liudon.com/posts/2023%E5%B9%B412%E6%9C%88%E5%8C%97%E4%BA%AC%E6%9A%B4%E9%9B%AA%E8%AE%B0%E5%BD%95/WechatIMG152.jpg_480x.webp 480w, https://liudon.com/posts/2023%E5%B9%B412%E6%9C%88%E5%8C%97%E4%BA%AC%E6%9A%B4%E9%9B%AA%E8%AE%B0%E5%BD%95/WechatIMG152.jpg_720x.webp 720w, https://liudon.com/posts/2023%E5%B9%B412%E6%9C%88%E5%8C%97%E4%BA%AC%E6%9A%B4%E9%9B%AA%E8%AE%B0%E5%BD%95/WechatIMG152.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/2023%E5%B9%B412%E6%9C%88%E5%8C%97%E4%BA%AC%E6%9A%B4%E9%9B%AA%E8%AE%B0%E5%BD%95/WechatIMG152.jpg\" alt=\"吉祥馄饨\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e一碗馄饨下肚，暖和多了，继续上路。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/2023%E5%B9%B412%E6%9C%88%E5%8C%97%E4%BA%AC%E6%9A%B4%E9%9B%AA%E8%AE%B0%E5%BD%95/WechatIMG153.jpg_320x.avif 320w, https://liudon.com/posts/2023%E5%B9%B412%E6%9C%88%E5%8C%97%E4%BA%AC%E6%9A%B4%E9%9B%AA%E8%AE%B0%E5%BD%95/WechatIMG153.jpg_480x.avif 480w, https://liudon.com/posts/2023%E5%B9%B412%E6%9C%88%E5%8C%97%E4%BA%AC%E6%9A%B4%E9%9B%AA%E8%AE%B0%E5%BD%95/WechatIMG153.jpg_720x.avif 720w, https://liudon.com/posts/2023%E5%B9%B412%E6%9C%88%E5%8C%97%E4%BA%AC%E6%9A%B4%E9%9B%AA%E8%AE%B0%E5%BD%95/WechatIMG153.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/2023%E5%B9%B412%E6%9C%88%E5%8C%97%E4%BA%AC%E6%9A%B4%E9%9B%AA%E8%AE%B0%E5%BD%95/WechatIMG153.jpg_320x.webp 320w, https://liudon.com/posts/2023%E5%B9%B412%E6%9C%88%E5%8C%97%E4%BA%AC%E6%9A%B4%E9%9B%AA%E8%AE%B0%E5%BD%95/WechatIMG153.jpg_480x.webp 480w, https://liudon.com/posts/2023%E5%B9%B412%E6%9C%88%E5%8C%97%E4%BA%AC%E6%9A%B4%E9%9B%AA%E8%AE%B0%E5%BD%95/WechatIMG153.jpg_720x.webp 720w, https://liudon.com/posts/2023%E5%B9%B412%E6%9C%88%E5%8C%97%E4%BA%AC%E6%9A%B4%E9%9B%AA%E8%AE%B0%E5%BD%95/WechatIMG153.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/2023%E5%B9%B412%E6%9C%88%E5%8C%97%E4%BA%AC%E6%9A%B4%E9%9B%AA%E8%AE%B0%E5%BD%95/WechatIMG153.jpg\" alt=\"路上\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e走的小腿有点酸了，终于到公交站了。\u003c/p\u003e\n\u003cp\u003e等了一小会，总算上车了。\u003c/p\u003e\n\u003cp\u003e车也不敢开的快，10迈左右。\u003c/p\u003e\n\u003cp\u003e晚上10点，终于到家了。\u003c/p\u003e\n\u003cp\u003e路上花费\u003cstrong\u003e2小时45分钟\u003c/strong\u003e。\u003c/p\u003e\n\u003ch4 id=\"12月15日-周五\"\u003e12月15日 周五\u003c/h4\u003e\n\u003cp\u003e早上坐公交到地铁站。\u003c/p\u003e\n\u003cfigure\u003e\u003cvideo\n        controls\n        playsinline\n        preload=\"none\"\n        poster=\"/posts/2023%E5%B9%B412%E6%9C%88%E5%8C%97%E4%BA%AC%E6%9A%B4%E9%9B%AA%E8%AE%B0%E5%BD%95/QWh2AALxlx08aXnxzCB201041200h2nD0E018.mp4.poster.webp\"\n        width=\"720\"\n        height=\"1280\"\n        style=\"--video-ratio: 720 / 1280\"\n    \u003e\n        \u003csource\n            src=\"/posts/2023%E5%B9%B412%E6%9C%88%E5%8C%97%E4%BA%AC%E6%9A%B4%E9%9B%AA%E8%AE%B0%E5%BD%95/QWh2AALxlx08aXnxzCB201041200h2nD0E018.mp4\"\n            type=\"video/mp4\"\n        /\u003e\n\n        您的浏览器不支持 HTML5 视频。\n    \u003c/video\u003e\n\n\u003c/figure\u003e\n\u003cp\u003e霍营地铁站盛况，人挤满了整个通道。\u003c/p\u003e\n\u003cp\u003e立马出站，换乘公交。\u003c/p\u003e\n\u003cp\u003e路上花费\u003cstrong\u003e2小时\u003c/strong\u003e。\u003c/p\u003e\n","date_published":"2023-12-16T10:15:33+08:00","tags":[]},{"title":"使用Hugo实现响应式和优化的图片","id":"https://liudon.com/posts/responsive-and-optimized-images-with-hugo/","url":"https://liudon.com/posts/responsive-and-optimized-images-with-hugo/","summary":"记录基于 Hugo Image Processing 和 Page Bundle 生成响应式 WebP 图片的历史实现。本站当前方案已升级为多尺寸 AVIF/WebP 预生成与构建缓存。","content_html":"\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003e更新说明（2026-09）\u003c/strong\u003e：本文记录的是 2023 年基于 PaperMod 的 Hugo 响应式图片方案，代码已不再用于本站。当前实现改为 Sharp 预生成多尺寸 AVIF/WebP、媒体缓存和 Terminal 主题共享图片组件，详见\u003ca href=\"https://liudon.com/posts/blog-performance-optimization/\"\u003e博客加速实践\u003c/a\u003e。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e继续我们的\u003ca href=\"/tags/%E5%8D%9A%E5%AE%A2%E4%BC%98%E5%8C%96/\"\u003e博客优化之旅\u003c/a\u003e，本篇内容我们将介绍如何使用\u003ccode\u003eHugo\u003c/code\u003e实现响应式和优化的图片。\u003c/p\u003e\n\u003ch4 id=\"问题\"\u003e问题\u003c/h4\u003e\n\u003cp\u003e在之前文章里，通过腾讯云数据万象实现了图片优化能力，具体的可参考文章\u003ca href=\"https://liudon.com/posts/hugo-auto-generate-image-width-and-height/\"\u003e累计布局偏移修复方案改进 —— 自动生成图片宽高\u003c/a\u003e。\u003c/p\u003e\n\u003cp\u003e经过一段运行后，发现这里有一个弊端。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eRun hugo --gc --minify --cleanDestinationDir\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eStart building sites … \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ehugo v0.119.0-b84644c008e0dc2c4b67bd69cccf87a41a03937e linux/amd64 BuildDate=2023-09-24T15:20:17Z VendorInfo=gohugoio\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eERROR Failed to get JSON resource \u0026#34;https://static.***.com/64412246-9050f100-d0c1-11e9-893a-f9b0766533ad.png?imageInfo\u0026amp;t=1698674110\u0026#34;: Get \u0026#34;https://static.***.com/64412246-9050f100-d0c1-11e9-893a-f9b0766533ad.png?imageInfo\u0026amp;t=1698674110\u0026#34;: stream error: stream ID 1; STREAM_CLOSED; received from peer\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eERROR Failed to get JSON resource \u0026#34;https://static.***.com/SkRx5uFwQ8Cliyq.jpg?imageInfo\u0026amp;t=1698674110\u0026#34;: Get \u0026#34;https://static.***.com/SkRx5uFwQ8Cliyq.jpg?imageInfo\u0026amp;t=1698674110\u0026#34;: stream error: stream ID 3; STREAM_CLOSED; received from peer\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e随着图片数量增多，因为需要调接口查询图片信息，这里构建耗时变长，同时也特别容易出现超时导致构建失败。\u003c/p\u003e\n\u003cp\u003e失败的时候，需要手动重跑构建，自动化发布卡壳了。\u003c/p\u003e\n\u003ch4 id=\"优化\"\u003e优化\u003c/h4\u003e\n\u003cp\u003e经过一番搜索，发现其实\u003ccode\u003eHugo\u003c/code\u003e本身是支持图片处理能力的。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003eImage processing\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eResize, crop, rotate, filter, and convert images.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://gohugo.io/content-management/image-processing/\"\u003ehttps://gohugo.io/content-management/image-processing/\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e下面以我使用的\u003ca href=\"https://github.com/adityatelange/hugo-PaperMod/\"\u003ePaperMod主题\u003c/a\u003e为例，讲下如何通过\u003ccode\u003eimage processing\u003c/code\u003e实现图片响应式优化。\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eimage processing\u003c/code\u003e需要用到\u003ccode\u003ePage bundles\u003c/code\u003e，所以\u003cstrong\u003e文章目录结构需要调整\u003c/strong\u003e，\n将一篇文章的资源（md文件，图片等）放在一个目录下。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003econtent/\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e├── posts\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│   ├── my-post\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│   │   ├── content1.md\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│   │   ├── content2.md\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│   │   ├── image1.jpg\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│   │   ├── image2.png\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│   │   └── index.md\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│   └── my-other-post\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e│       └── index.md\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e目录结构调整完毕后，接下来修改图片显示文件代码。\u003c/p\u003e\n\u003cp\u003e本文当时使用的 Hugo 版本需要 Extended 版本生成 WebP；当前 Hugo 的图片处理能力已经更新，具体格式支持请以\u003ca href=\"https://gohugo.io/content-management/image-processing/\"\u003e官方 Image Processing 文档\u003c/a\u003e为准。\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003ePagerMod\u003c/code\u003e主题涉及到图片显示的一共三个文件：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e_default/_markup/render-image.html，对应markdown图片语法解析。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003erespSizes\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eslice\u003c/span\u003e \u003cspan class=\"mi\"\u003e480\u003c/span\u003e \u003cspan class=\"mi\"\u003e720\u003c/span\u003e \u003cspan class=\"mi\"\u003e1080\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e \u003cspan class=\"o\"\u003e/*\u003c/span\u003e\u003cspan class=\"err\"\u003e生成的图片规格\u003c/span\u003e\u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003edataSzes\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;(min-width: 768px) 720px, 100vw\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eholder\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;GIP\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ehint\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;photo\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;box\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eDestination\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eDestination\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eText\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eText\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eTitle\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eTitle\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e/*\u003c/span\u003e\u003cspan class=\"err\"\u003e内容图片响应式开关配置，默认为\u003c/span\u003e\u003cspan class=\"bp\"\u003etrue\u003c/span\u003e\u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eresponsiveImages\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePage\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eParams\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eresponsiveImages\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003edefault\u003c/span\u003e \u003cspan class=\"n\"\u003esite\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eParams\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eresponsiveImages\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003edefault\u003c/span\u003e \u003cspan class=\"bp\"\u003etrue\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"n\"\u003ewith\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003esrc\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePage\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eResources\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eGetMatch\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eDestination\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eresponsiveImages\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003epicture\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"o\"\u003e/*\u003c/span\u003e\u003cspan class=\"err\"\u003e只有使用了\u003c/span\u003e\u003cspan class=\"n\"\u003ehugo扩展版本的\u003c/span\u003e\u003cspan class=\"err\"\u003e，才生成\u003c/span\u003e\u003cspan class=\"n\"\u003ewebp格式图片\u003c/span\u003e\u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"ow\"\u003eand\u003c/span\u003e \u003cspan class=\"n\"\u003ehugo\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eIsExtended\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ene\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eMediaType\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eType\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;image/webp\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003esource\u003c/span\u003e \u003cspan class=\"n\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;image/webp\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003esrcset\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003ewith\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003erespSizes\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"nb\"\u003erange\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"p\"\u003e}},\u003c/span\u003e \u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eResize\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nb\"\u003eprint\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;x webp \u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ehint\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34; \u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003efilter\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eRelPermalink\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003eabsURL\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e \u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\u003cspan class=\"n\"\u003ew\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34; sizes=\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003edataSzes\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34; /\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003esource\u003c/span\u003e \u003cspan class=\"n\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ $src.MediaType.Type }}\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003esrcset\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003ewith\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003erespSizes\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"nb\"\u003erange\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003ege\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eWidth\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"p\"\u003e}},\u003c/span\u003e \u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eResize\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nb\"\u003eprint\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;x jpg \u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003efilter\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eRelPermalink\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003eabsURL\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e \u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\u003cspan class=\"n\"\u003ew\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}},\u003c/span\u003e \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePermalink\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"n\"\u003eprintf\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"si\"\u003e%d\u003c/span\u003e\u003cspan class=\"s2\"\u003ew\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eWidth\u003c/span\u003e\u003cspan class=\"p\"\u003e)}}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34; sizes=\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003edataSzes\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34; /\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eimg\u003c/span\u003e \u003cspan class=\"n\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ $Destination | safeURL }}\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003ewidth\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ .Width }}\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eheight\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ .Height }}\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003ealt\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ $Text }}\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003etitle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ $Title }}\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eloading\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;lazy\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"n\"\u003epicture\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eimg\u003c/span\u003e \u003cspan class=\"n\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ $Destination | safeURL }}\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003ewidth\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ $src.Width }}\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eheight\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ $src.Height }}\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003ealt\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ $Text }}\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003etitle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ $Title }}\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eloading\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;lazy\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003epartials/cover.html，对应文章封面解析。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003erespSizes\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eslice\u003c/span\u003e \u003cspan class=\"mi\"\u003e480\u003c/span\u003e \u003cspan class=\"mi\"\u003e720\u003c/span\u003e \u003cspan class=\"mi\"\u003e1080\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003edataSzes\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;(min-width: 768px) 720px, 100vw\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eholder\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;GIP\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ehint\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;photo\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;box\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003ewith\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecxt\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e/*\u003c/span\u003e \u003cspan class=\"n\"\u003eApply\u003c/span\u003e \u003cspan class=\"n\"\u003eproper\u003c/span\u003e \u003cspan class=\"n\"\u003econtext\u003c/span\u003e \u003cspan class=\"n\"\u003efrom\u003c/span\u003e \u003cspan class=\"n\"\u003edict\u003c/span\u003e \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"ow\"\u003eand\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eParams\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecover\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eimage\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"ow\"\u003enot\u003c/span\u003e \u003cspan class=\"o\"\u003e$.\u003c/span\u003e\u003cspan class=\"n\"\u003eisHidden\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ealt\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eParams\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecover\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ealt\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003edefault\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eParams\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecover\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecaption\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003eplainify\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003efigure\u003c/span\u003e \u003cspan class=\"k\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;entry-cover\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e/*\u003c/span\u003e\u003cspan class=\"err\"\u003e封面响应式图片配置开关，默认为\u003c/span\u003e\u003cspan class=\"bp\"\u003etrue\u003c/span\u003e\u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eresponsiveImages\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eParams\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecover\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eresponsiveImages\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003edefault\u003c/span\u003e \u003cspan class=\"n\"\u003esite\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eParams\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecover\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eresponsiveImages\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003edefault\u003c/span\u003e \u003cspan class=\"bp\"\u003etrue\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eaddLink\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"ow\"\u003eand\u003c/span\u003e \u003cspan class=\"n\"\u003esite\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eParams\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecover\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003elinkFullImages\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"ow\"\u003enot\u003c/span\u003e \u003cspan class=\"o\"\u003e$.\u003c/span\u003e\u003cspan class=\"n\"\u003eIsHome\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ecover\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eResources\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eByType\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;image\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eGetMatch\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eprintf\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;*\u003c/span\u003e\u003cspan class=\"si\"\u003e%s\u003c/span\u003e\u003cspan class=\"s2\"\u003e*\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eParams\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecover\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ecover\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}{{\u003c/span\u003e\u003cspan class=\"o\"\u003e/*\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e \u003cspan class=\"n\"\u003eit\u003c/span\u003e \u003cspan class=\"n\"\u003eis\u003c/span\u003e \u003cspan class=\"n\"\u003epresent\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003epage\u003c/span\u003e \u003cspan class=\"n\"\u003ebundle\u003c/span\u003e \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eaddLink\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003ea\u003c/span\u003e \u003cspan class=\"n\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ (path.Join .RelPermalink .Params.cover.image) | absURL }}\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003etarget\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;_blank\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;noopener noreferrer\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eresponsiveImages\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003epicture\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"ow\"\u003eand\u003c/span\u003e \u003cspan class=\"n\"\u003ehugo\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eIsExtended\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ene\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ecover\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eMediaType\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eType\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;image/webp\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003esource\u003c/span\u003e \u003cspan class=\"n\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;image/webp\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003esrcset\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003ewith\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003erespSizes\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"nb\"\u003erange\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"p\"\u003e}},\u003c/span\u003e \u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ecover\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eResize\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nb\"\u003eprint\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;x webp \u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ehint\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34; \u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003efilter\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eRelPermalink\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003eabsURL\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e \u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\u003cspan class=\"n\"\u003ew\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34; sizes=\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003edataSzes\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34; /\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003esource\u003c/span\u003e \u003cspan class=\"n\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ $cover.MediaType.Type }}\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003esrcset\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003ewith\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003erespSizes\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"nb\"\u003erange\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003ege\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ecover\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eWidth\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"p\"\u003e}},\u003c/span\u003e \u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ecover\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eResize\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nb\"\u003eprint\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;x jpg \u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003efilter\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eRelPermalink\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003eabsURL\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e \u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\u003cspan class=\"n\"\u003ew\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}},\u003c/span\u003e \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ecover\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePermalink\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"n\"\u003eprintf\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"si\"\u003e%d\u003c/span\u003e\u003cspan class=\"s2\"\u003ew\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ecover\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eWidth\u003c/span\u003e\u003cspan class=\"p\"\u003e)}}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34; sizes=\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003edataSzes\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34; /\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eimg\u003c/span\u003e \u003cspan class=\"n\"\u003eloading\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;lazy\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ $cover.Permalink }}\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003ealt\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ $alt }}\u0026#34;\u003c/span\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003ewidth\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ $cover.Width }}\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eheight\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ $cover.Height }}\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"n\"\u003epicture\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"p\"\u003e}}{{\u003c/span\u003e\u003cspan class=\"o\"\u003e/*\u003c/span\u003e \u003cspan class=\"n\"\u003eUnprocessable\u003c/span\u003e \u003cspan class=\"n\"\u003eimage\u003c/span\u003e \u003cspan class=\"ow\"\u003eor\u003c/span\u003e \u003cspan class=\"n\"\u003eresponsive\u003c/span\u003e \u003cspan class=\"n\"\u003eimages\u003c/span\u003e \u003cspan class=\"n\"\u003edisabled\u003c/span\u003e \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eimg\u003c/span\u003e \u003cspan class=\"n\"\u003eloading\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;lazy\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ (path.Join .RelPermalink .Params.cover.image) | absURL }}\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003ealt\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ $alt }}\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"p\"\u003e}}{{\u003c/span\u003e\u003cspan class=\"o\"\u003e/*\u003c/span\u003e \u003cspan class=\"n\"\u003eFor\u003c/span\u003e \u003cspan class=\"n\"\u003eabsolute\u003c/span\u003e \u003cspan class=\"n\"\u003eurls\u003c/span\u003e \u003cspan class=\"ow\"\u003eand\u003c/span\u003e \u003cspan class=\"n\"\u003eexternal\u003c/span\u003e \u003cspan class=\"n\"\u003elinks\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eno\u003c/span\u003e \u003cspan class=\"n\"\u003eimg\u003c/span\u003e \u003cspan class=\"n\"\u003eprocessing\u003c/span\u003e \u003cspan class=\"n\"\u003ehere\u003c/span\u003e \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eaddLink\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003ea\u003c/span\u003e \u003cspan class=\"n\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ (.Params.cover.image) | absURL }}\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003etarget\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;_blank\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;noopener noreferrer\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eimg\u003c/span\u003e \u003cspan class=\"n\"\u003eloading\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;lazy\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ (.Params.cover.image) | absURL }}\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003ealt\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ $alt }}\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eaddLink\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"n\"\u003ea\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e/*\u003c/span\u003e  \u003cspan class=\"n\"\u003eDisplay\u003c/span\u003e \u003cspan class=\"n\"\u003eCaption\u003c/span\u003e  \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"ow\"\u003enot\u003c/span\u003e \u003cspan class=\"o\"\u003e$.\u003c/span\u003e\u003cspan class=\"n\"\u003eIsHome\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"n\"\u003ewith\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eParams\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecover\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecaption\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003ep\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003emarkdownify\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"n\"\u003ep\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"n\"\u003efigure\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"p\"\u003e}}{{\u003c/span\u003e\u003cspan class=\"o\"\u003e/*\u003c/span\u003e \u003cspan class=\"n\"\u003eEnd\u003c/span\u003e \u003cspan class=\"n\"\u003eimage\u003c/span\u003e \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}{{\u003c/span\u003e\u003cspan class=\"o\"\u003e/*\u003c/span\u003e \u003cspan class=\"n\"\u003eEnd\u003c/span\u003e \u003cspan class=\"n\"\u003econtext\u003c/span\u003e \u003cspan class=\"o\"\u003e*/\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eshortcodes/figure.html，对应文章内\u003ccode\u003efigure\u003c/code\u003e语法解析。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003erespSizes\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eslice\u003c/span\u003e \u003cspan class=\"mi\"\u003e480\u003c/span\u003e \u003cspan class=\"mi\"\u003e720\u003c/span\u003e \u003cspan class=\"mi\"\u003e1080\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003edataSzes\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;(min-width: 768px) 720px, 100vw\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eholder\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;GIP\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ehint\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;photo\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003efilter\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;box\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003esrc\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eGet\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;src\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ealign\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eGet\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;align\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ealt\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eGet\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;alt\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ecaption\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eGet\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;caption\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e/*\u003c/span\u003e\u003cspan class=\"err\"\u003e内容图片响应式开关配置，默认为\u003c/span\u003e\u003cspan class=\"bp\"\u003etrue\u003c/span\u003e\u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eresponsiveImages\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePage\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eParams\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eresponsiveImages\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003edefault\u003c/span\u003e \u003cspan class=\"n\"\u003esite\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eParams\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eresponsiveImages\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003edefault\u003c/span\u003e \u003cspan class=\"bp\"\u003etrue\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003efigure\u003c/span\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"ow\"\u003eor\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eGet\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;class\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eeq\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eGet\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;align\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;center\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e \u003cspan class=\"k\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003eeq\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eGet\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;align\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;center\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\u003cspan class=\"n\"\u003ealign\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ecenter\u003c/span\u003e \u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003ewith\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eGet\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;class\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e}}{{\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e \u003cspan class=\"p\"\u003e}}{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eGet\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;link\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003ea\u003c/span\u003e \u003cspan class=\"n\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ .Get \u0026#34;\u003c/span\u003e\u003cspan class=\"n\"\u003elink\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34; }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"n\"\u003ewith\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eGet\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;target\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e \u003cspan class=\"n\"\u003etarget\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ . }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"p\"\u003e}}{{\u003c/span\u003e \u003cspan class=\"n\"\u003ewith\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eGet\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;rel\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e \u003cspan class=\"n\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ . }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"n\"\u003ewith\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003esrc\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$.\u003c/span\u003e\u003cspan class=\"n\"\u003ePage\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eResources\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eGetMatch\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eGet\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;src\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003epicture\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eresponsiveImages\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"ow\"\u003eand\u003c/span\u003e \u003cspan class=\"n\"\u003ehugo\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eIsExtended\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ene\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eMediaType\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eType\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;image/webp\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003esource\u003c/span\u003e \u003cspan class=\"n\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;image/webp\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003esrcset\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003ewith\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003erespSizes\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"nb\"\u003erange\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"p\"\u003e}},\u003c/span\u003e \u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eResize\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nb\"\u003eprint\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;x webp \u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ehint\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34; \u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003efilter\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eRelPermalink\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003eabsURL\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e \u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\u003cspan class=\"n\"\u003ew\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34; sizes=\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003edataSzes\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34; /\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003esource\u003c/span\u003e \u003cspan class=\"n\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ $src.MediaType.Type }}\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003esrcset\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003ewith\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003erespSizes\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"nb\"\u003erange\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003ege\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eWidth\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"p\"\u003e}},\u003c/span\u003e \u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eResize\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nb\"\u003eprint\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;x jpg \u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003efilter\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eRelPermalink\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003eabsURL\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e \u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\u003cspan class=\"n\"\u003ew\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}},\u003c/span\u003e \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePermalink\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"n\"\u003eprintf\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"si\"\u003e%d\u003c/span\u003e\u003cspan class=\"s2\"\u003ew\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eWidth\u003c/span\u003e\u003cspan class=\"p\"\u003e)}}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34; sizes=\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003edataSzes\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34; /\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eimg\u003c/span\u003e \u003cspan class=\"n\"\u003eloading\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;lazy\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ $src }}{{- if eq ($align) \u0026#34;\u003c/span\u003e\u003cspan class=\"n\"\u003ecenter\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34; }}#center{{- end }}\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"ow\"\u003eor\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ealt\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ecaption\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003ealt\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ with $alt }}{{ . }}{{ else }}{{ $caption | markdownify| plainify }}{{ end }}\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003ewith\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eWidth\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e \u003cspan class=\"n\"\u003ewidth\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ . }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003ewith\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eHeight\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e \u003cspan class=\"n\"\u003eheight\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ . }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e/\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;!--\u003c/span\u003e \u003cspan class=\"n\"\u003eClosing\u003c/span\u003e \u003cspan class=\"n\"\u003eimg\u003c/span\u003e \u003cspan class=\"n\"\u003etag\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"n\"\u003epicture\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eGet\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;link\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"n\"\u003ea\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"ow\"\u003eor\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"ow\"\u003eor\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eGet\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;title\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eGet\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;caption\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eGet\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;attr\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003efigcaption\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"n\"\u003ewith\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eGet\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;title\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"ow\"\u003eor\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eGet\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;caption\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eGet\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;attr\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003ep\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eGet\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;caption\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003emarkdownify\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003ewith\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eGet\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;attrlink\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003ea\u003c/span\u003e \u003cspan class=\"n\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ . }}\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eGet\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;attr\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003emarkdownify\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eGet\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;attrlink\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"n\"\u003ea\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"n\"\u003ep\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"n\"\u003efigcaption\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"n\"\u003efigure\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"使用效果\"\u003e使用效果\u003c/h4\u003e\n\u003cp\u003e正常插入\u003ccode\u003ejpg/png\u003c/code\u003e图片，构建后会自动生成webp/原始格式下不同规格的图片。\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003emarkdown图片显示\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/responsive-and-optimized-images-with-hugo/render-image.png_320x.avif 320w, https://liudon.com/posts/responsive-and-optimized-images-with-hugo/render-image.png_480x.avif 480w, https://liudon.com/posts/responsive-and-optimized-images-with-hugo/render-image.png_720x.avif 720w, https://liudon.com/posts/responsive-and-optimized-images-with-hugo/render-image.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/responsive-and-optimized-images-with-hugo/render-image.png_320x.webp 320w, https://liudon.com/posts/responsive-and-optimized-images-with-hugo/render-image.png_480x.webp 480w, https://liudon.com/posts/responsive-and-optimized-images-with-hugo/render-image.png_720x.webp 720w, https://liudon.com/posts/responsive-and-optimized-images-with-hugo/render-image.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/responsive-and-optimized-images-with-hugo/render-image.png\" alt=\"render-image\"\n         width=\"1080\" height=\"808\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003efigure短代码显示\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/responsive-and-optimized-images-with-hugo/figure.png_320x.avif 320w, https://liudon.com/posts/responsive-and-optimized-images-with-hugo/figure.png_480x.avif 480w, https://liudon.com/posts/responsive-and-optimized-images-with-hugo/figure.png_720x.avif 720w, https://liudon.com/posts/responsive-and-optimized-images-with-hugo/figure.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/responsive-and-optimized-images-with-hugo/figure.png_320x.webp 320w, https://liudon.com/posts/responsive-and-optimized-images-with-hugo/figure.png_480x.webp 480w, https://liudon.com/posts/responsive-and-optimized-images-with-hugo/figure.png_720x.webp 720w, https://liudon.com/posts/responsive-and-optimized-images-with-hugo/figure.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/responsive-and-optimized-images-with-hugo/figure.png\" alt=\"figure\"\n         width=\"1080\" height=\"766\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e封面显示\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/responsive-and-optimized-images-with-hugo/cover.png_320x.avif 320w, https://liudon.com/posts/responsive-and-optimized-images-with-hugo/cover.png_480x.avif 480w, https://liudon.com/posts/responsive-and-optimized-images-with-hugo/cover.png_720x.avif 720w, https://liudon.com/posts/responsive-and-optimized-images-with-hugo/cover.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/responsive-and-optimized-images-with-hugo/cover.png_320x.webp 320w, https://liudon.com/posts/responsive-and-optimized-images-with-hugo/cover.png_480x.webp 480w, https://liudon.com/posts/responsive-and-optimized-images-with-hugo/cover.png_720x.webp 720w, https://liudon.com/posts/responsive-and-optimized-images-with-hugo/cover.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/responsive-and-optimized-images-with-hugo/cover.png\" alt=\"cover\"\n         width=\"1080\" height=\"671\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e提示：\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e随着图片数量增多，可能会遇到构建超时的错误，类似下述信息：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-mysql\" data-lang=\"mysql\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eStart\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ebuilding\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003esites\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e…\u003c/span\u003e\u003cspan class=\"w\"\u003e \n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ehugo\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ev0\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"mi\"\u003e96\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"o\"\u003e+\u003c/span\u003e\u003cspan class=\"n\"\u003eextended\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003edarwin\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003earm64\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eBuildDate\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003eunknown\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eError\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eError\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ebuilding\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003esite\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/Users/dondonliu/Code/liudon.github.io/content/posts/xxxx/index.md:1:1\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003etimed\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eout\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003einitializing\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003evalue\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eYou\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003emay\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ehave\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ea\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ecircular\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eloop\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003ein\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ea\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eshortcode\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eyour\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003esite\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003emay\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ehave\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eresources\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ethat\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003etake\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003elonger\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eto\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ebuild\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ethan\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ethe\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e`\u003c/span\u003e\u003cspan class=\"n\"\u003etimeout\u003c/span\u003e\u003cspan class=\"o\"\u003e`\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003elimit\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003ein\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eyour\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eHugo\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003econfig\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003efile\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eBuilt\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003ein\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e22356\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ems\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e可以通过修改配置文件\u003ccode\u003econfig.yml\u003c/code\u003e，新增\u003ccode\u003etimeout\u003c/code\u003e配置，调大超时时间解决。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebuildDrafts: false\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebuildFuture: false\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebuildExpired: false\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etimeout: 60s // 调大此处的时间即可\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e终于知道为啥\u003ccode\u003ePagerMod\u003c/code\u003e主题默认只有封面下才有生成不同规格的逻辑了。\u003c/p\u003e\n","date_published":"2023-12-10T08:29:05+08:00","tags":["hugo","博客优化"]},{"title":"加速Google Analytics","id":"https://liudon.com/posts/optimize-google-analytics/","url":"https://liudon.com/posts/optimize-google-analytics/","summary":"\u003ch3 id=\"起因\"\u003e起因\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eGoogle Analytics\u003c/code\u003e是一款优秀的流量分析服务，集成方便，使用简单。\u003c/p\u003e\n\u003cp\u003e最近在优化页面访问速度，发现\u003ccode\u003eGoogle Analytics\u003c/code\u003e是一个优化点。\u003c/p\u003e\n\u003ch3 id=\"优化\"\u003e优化\u003c/h3\u003e\n\u003ch4 id=\"1-访问加速\"\u003e1. 访问加速\u003c/h4\u003e\n\u003cp\u003e国内访问\u003ccode\u003eGoogle Analytics\u003c/code\u003e很慢，同时还面临着各种广告屏蔽插件拦截。\u003c/p\u003e","content_html":"\u003ch3 id=\"起因\"\u003e起因\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eGoogle Analytics\u003c/code\u003e是一款优秀的流量分析服务，集成方便，使用简单。\u003c/p\u003e\n\u003cp\u003e最近在优化页面访问速度，发现\u003ccode\u003eGoogle Analytics\u003c/code\u003e是一个优化点。\u003c/p\u003e\n\u003ch3 id=\"优化\"\u003e优化\u003c/h3\u003e\n\u003ch4 id=\"1-访问加速\"\u003e1. 访问加速\u003c/h4\u003e\n\u003cp\u003e国内访问\u003ccode\u003eGoogle Analytics\u003c/code\u003e很慢，同时还面临着各种广告屏蔽插件拦截。\u003c/p\u003e\n\u003cp\u003e这里借助\u003ccode\u003eCloudflare Worker\u003c/code\u003e实现\u003ccode\u003eGoogle Analytics\u003c/code\u003e反代，同时更换采集路由规避广告屏蔽插件的拦截。\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eCloudflare\u003c/code\u003e新建Worker，代码如下，保存后部署。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eaddEventListener\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;fetch\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eevent\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"err\"\u003e这里可以加\u003c/span\u003e \u003cspan class=\"n\"\u003efilter\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003eevent\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003erespondWith\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ehandleRequest\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eevent\u003c/span\u003e\u003cspan class=\"p\"\u003e));\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eworker\u003c/span\u003e \u003cspan class=\"err\"\u003e应用的路由地址，末尾不加\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;/\u0026#39;\u003c/span\u003e\u003cspan class=\"err\"\u003e，改为你的博客地址\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003eDOMAIN\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;xxx.com\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"err\"\u003e博客插入的\u003c/span\u003e\u003cspan class=\"n\"\u003ejs地址文件名\u003c/span\u003e\u003cspan class=\"err\"\u003e，可自定义\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003eJS_FILE\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;ga.js\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"err\"\u003e响应上报的接口路径，可自定义，规避广告屏蔽插件拦截\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003eCOLLECT_PATH\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;collect_path\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"err\"\u003e原\u003c/span\u003e \u003cspan class=\"n\"\u003egtag\u003c/span\u003e \u003cspan class=\"err\"\u003e地址，将\u003c/span\u003e\u003cspan class=\"n\"\u003eG\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eXXX改为你的id\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003eJS_URL\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;https://www.googletagmanager.com/gtag/js?id=G-XXX\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"err\"\u003e下面不需要改\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003eG_DOMAIN\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;google-analytics.com\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003eG_COLLECT_PATH\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;g\\/collect\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"n\"\u003easync\u003c/span\u003e \u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003ehandleRequest\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eevent\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003eurl\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eevent\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003erequest\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eurl\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eurl\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ematch\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"err\"\u003e`\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003eDOMAIN\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"o\"\u003e/$\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003eJS_FILE\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"err\"\u003e`\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003erequestJs\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eawait\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eawait\u003c/span\u003e \u003cspan class=\"n\"\u003efetch\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eJS_URL\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003etext\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003ejsText\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003erequestJs\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ereplaceAll\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;\u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s1\"\u003ewww\u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;\u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ereplaceAll\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;.\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e \u003cspan class=\"n\"\u003eG_DOMAIN\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eDOMAIN\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ereplaceAll\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eG_COLLECT_PATH\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eCOLLECT_PATH\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eResponse\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ejsText\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003estatus\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e200\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003estatusText\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;OK\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eheaders\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"s1\"\u003e\u0026#39;Content-Type\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;application/javascript\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eurl\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ematch\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"err\"\u003e`\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003eDOMAIN\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"o\"\u003e/$\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003eCOLLECT_PATH\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"err\"\u003e`\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003enewReq\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eawait\u003c/span\u003e \u003cspan class=\"n\"\u003ereadRequest\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eevent\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003erequest\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eevent\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ewaitUntil\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003efetch\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003enewReq\u003c/span\u003e\u003cspan class=\"p\"\u003e));\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eResponse\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003enull\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"n\"\u003estatus\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e204\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"n\"\u003estatusText\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;No Content\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"n\"\u003easync\u003c/span\u003e \u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003ereadRequest\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003erequest\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"n\"\u003eurl\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eheaders\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003erequest\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003ebody\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eawait\u003c/span\u003e \u003cspan class=\"n\"\u003erequest\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003etext\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003ega_url\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eurl\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ereplace\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"err\"\u003e`\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003eDOMAIN\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"o\"\u003e/$\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003eCOLLECT_PATH\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"err\"\u003e`\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"err\"\u003e`\u003c/span\u003e\u003cspan class=\"n\"\u003ewww\u003c/span\u003e\u003cspan class=\"o\"\u003e.$\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003eG_DOMAIN\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"o\"\u003e/$\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003eG_COLLECT_PATH\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"err\"\u003e`\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003enq\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"n\"\u003emethod\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;POST\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"n\"\u003eheaders\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eHost\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;www.google-analytics.com\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eOrigin\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eheaders\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;origin\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"s1\"\u003e\u0026#39;Cache-Control\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;max-age=0\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"s1\"\u003e\u0026#39;User-Agent\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eheaders\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;user-agent\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eAccept\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eheaders\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;accept\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"s1\"\u003e\u0026#39;Accept-Language\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eheaders\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;accept-language\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"s1\"\u003e\u0026#39;Content-Type\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eheaders\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;content-type\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;text/plain\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eReferer\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eheaders\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;referer\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"n\"\u003ebody\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003ebody\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eRequest\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ega_url\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003enq\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e页面插入对应js\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;!-- Google tag (gtag.js) --\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;script async src=\u0026#34;https://xxx.com/ga.js\u0026#34;\u0026gt;\u0026lt;/script\u0026gt; // 对应worker里的DOMAIN 和 JS_FILE，需要保持一致\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;script\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  window.dataLayer = window.dataLayer || [];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  function gtag(){dataLayer.push(arguments);}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  gtag(\u0026#39;js\u0026#39;, new Date());\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  gtag(\u0026#39;config\u0026#39;, \u0026#39;G-XXX\u0026#39;); // 将G-XXX改为你的id\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;/script\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"2-文件瘦身\"\u003e2. 文件瘦身\u003c/h4\u003e\n\u003cp\u003e通过\u003ca href=\"https://gtmetrix.com/\"\u003e性能分析\u003c/a\u003e，发现js文件过大，影响页面加载速度。\u003c/p\u003e\n\u003cp\u003e虽然使用了\u003ccode\u003eCloudfare\u003c/code\u003e代理，但是\u003ccode\u003eGoogle Analytics\u003c/code\u003e原始的js文件为80KB左右。\u003c/p\u003e\n\u003cp\u003e搜索一番，找到一个\u003ca href=\"https://minimalanalytics.com/\"\u003e瘦身版Google Analytics\u003c/a\u003e。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eMinimal Google Analytics Snippet\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eA simple snippet for tracking page views on your website without having to add external libraries. Also works for single page applications made with the likes of react and vue.js.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eBefore\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eGoogle Tag Manager + Analytics = 73kB\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAfter\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSnippet = 1.5kB\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e插入的js片断，只有1.5kb大小。\u003c/p\u003e\n\u003cp\u003e唯一的缺点就是只有基本功能，这对于我们来说足够了。\u003c/p\u003e\n\u003cp\u003e将第一步插入的js代码，更换为下述代码，需要将其中的xxx.com/collect_path改为第一步定义的DOMAIN和COLLECT_PATH变量值。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003escript\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eenScroll\u003c/span\u003e\u003cspan class=\"o\"\u003e=!\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"n\"\u003eenFdl\u003c/span\u003e\u003cspan class=\"o\"\u003e=!\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"n\"\u003eextCurrent\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003evoid\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"n\"\u003efilename\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003evoid\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"n\"\u003etargetText\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003evoid\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"n\"\u003esplitOrigin\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003evoid\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003elStor\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003elocalStorage\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"n\"\u003esStor\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003esessionStorage\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"n\"\u003edoc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003edocument\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"n\"\u003edocEl\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003edocument\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003edocumentElement\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"n\"\u003edocBody\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003edocument\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ebody\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"n\"\u003edocLoc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003edocument\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003elocation\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"n\"\u003ew\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003ewindow\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003escreen\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"n\"\u003enav\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003enavigator\u003c/span\u003e\u003cspan class=\"o\"\u003e||\u003c/span\u003e\u003cspan class=\"p\"\u003e{},\u003c/span\u003e\u003cspan class=\"n\"\u003eextensions\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;pdf\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;xls\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;xlsx\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;doc\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;docx\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;txt\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;rtf\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;csv\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;exe\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;key\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;pps\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;ppt\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;pptx\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;7z\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;pkg\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;rar\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;gz\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;zip\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;avi\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;mov\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;mp4\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;mpe\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;mpeg\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;wmv\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;mid\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;midi\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;mp3\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;wav\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;wma\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"n\"\u003et\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"n\"\u003en\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"n\"\u003eo\u003c/span\u003e\u003cspan class=\"p\"\u003e){\u003c/span\u003e\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003ej\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;G-G9ZDJQN9E2\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"n\"\u003er\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eMath\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003efloor\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eMath\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003erandom\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"mf\"\u003e1e9\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e+\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"n\"\u003ec\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eMath\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003efloor\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eDate\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003enow\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"mf\"\u003e1e3\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\u003cspan class=\"n\"\u003eF\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esStor\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003e_p\u003c/span\u003e\u003cspan class=\"o\"\u003e||\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esStor\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003e_p\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003er\u003c/span\u003e\u003cspan class=\"p\"\u003e()),\u003c/span\u003e\u003cspan class=\"n\"\u003esStor\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003e_p\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\u003cspan class=\"n\"\u003eE\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003er\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"o\"\u003e+\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;.\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e+\u003c/span\u003e\u003cspan class=\"n\"\u003ec\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"n\"\u003e_\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003elStor\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecid_v4\u003c/span\u003e\u003cspan class=\"o\"\u003e||\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003elStor\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecid_v4\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003eE\u003c/span\u003e\u003cspan class=\"p\"\u003e()),\u003c/span\u003e\u003cspan class=\"n\"\u003elStor\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecid_v4\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\u003cspan class=\"n\"\u003em\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003elStor\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003egetItem\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;cid_v4\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\u003cspan class=\"n\"\u003ev\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003em\u003c/span\u003e\u003cspan class=\"err\"\u003e?\u003c/span\u003e\u003cspan class=\"n\"\u003evoid\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"n\"\u003eenScroll\u003c/span\u003e\u003cspan class=\"o\"\u003e==!\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"err\"\u003e?\u003c/span\u003e\u003cspan class=\"n\"\u003evoid\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;1\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"n\"\u003ep\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esStor\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esid\u003c/span\u003e\u003cspan class=\"o\"\u003e||\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esStor\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esid\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003ec\u003c/span\u003e\u003cspan class=\"p\"\u003e()),\u003c/span\u003e\u003cspan class=\"n\"\u003esStor\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esid\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\u003cspan class=\"n\"\u003eO\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"n\"\u003esStor\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003e_ss\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003esStor\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003e_ss\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;1\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"n\"\u003esStor\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003e_ss\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esStor\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003egetItem\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;_ss\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;1\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003evoid\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e},\u003c/span\u003e\u003cspan class=\"n\"\u003ea\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;1\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"n\"\u003eg\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esStor\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esct\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eenScroll\u003c/span\u003e\u003cspan class=\"o\"\u003e==!\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003esStor\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esct\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"n\"\u003ex\u003c/span\u003e\u003cspan class=\"o\"\u003e=+\u003c/span\u003e\u003cspan class=\"n\"\u003esStor\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003egetItem\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;sct\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e+\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e\u003cspan class=\"n\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"n\"\u003esStor\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esct\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003ex\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"n\"\u003esStor\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esct\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003esStor\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esct\u003c/span\u003e\u003cspan class=\"p\"\u003e},\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003edocLoc\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esearch\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"n\"\u003eb\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eURLSearchParams\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\u003cspan class=\"n\"\u003eh\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;q\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;s\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;search\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;query\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;keyword\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e\u003cspan class=\"n\"\u003ey\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003eh\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esome\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eincludes\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u0026amp;\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e+\u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"o\"\u003e+\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;=\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e||\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eincludes\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;?\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e+\u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"o\"\u003e+\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;=\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)),\u003c/span\u003e\u003cspan class=\"n\"\u003eu\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ey\u003c/span\u003e\u003cspan class=\"o\"\u003e==!\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"err\"\u003e?\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;view_search_results\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"n\"\u003eenScroll\u003c/span\u003e\u003cspan class=\"o\"\u003e==!\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"err\"\u003e?\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;scroll\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"n\"\u003eenFdl\u003c/span\u003e\u003cspan class=\"o\"\u003e==!\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"err\"\u003e?\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;file_download\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;page_view\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"n\"\u003ef\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eenScroll\u003c/span\u003e\u003cspan class=\"o\"\u003e==!\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"err\"\u003e?\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;90\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"n\"\u003evoid\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"n\"\u003eC\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eu\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;view_search_results\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e){\u003c/span\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003elet\u003c/span\u003e \u003cspan class=\"n\"\u003ee\u003c/span\u003e \u003cspan class=\"n\"\u003eof\u003c/span\u003e \u003cspan class=\"n\"\u003eb\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eh\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eincludes\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e]))\u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e]}\u003c/span\u003e\u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003evoid\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e},\u003c/span\u003e\u003cspan class=\"n\"\u003ed\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003eencodeURIComponent\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"n\"\u003ek\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003elet\u003c/span\u003e \u003cspan class=\"n\"\u003et\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"p\"\u003e[];\u003c/span\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003elet\u003c/span\u003e \u003cspan class=\"n\"\u003en\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ehasOwnProperty\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003en\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003en\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"o\"\u003e!==\u003c/span\u003e\u003cspan class=\"n\"\u003evoid\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003et\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epush\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ed\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003en\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e+\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;=\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e+\u003c/span\u003e\u003cspan class=\"n\"\u003ed\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003en\u003c/span\u003e\u003cspan class=\"p\"\u003e]));\u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003et\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ejoin\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u0026amp;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)},\u003c/span\u003e\u003cspan class=\"n\"\u003eA\u003c/span\u003e\u003cspan class=\"o\"\u003e=!\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"n\"\u003eS\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;https://xxx.com/collect_path\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"n\"\u003eM\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003ek\u003c/span\u003e\u003cspan class=\"p\"\u003e({\u003c/span\u003e\u003cspan class=\"n\"\u003ev\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;2\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"n\"\u003etid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"n\"\u003ej\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"n\"\u003e_p\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"n\"\u003eF\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"n\"\u003esr\u003c/span\u003e\u003cspan class=\"p\"\u003e:(\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ewidth\u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003ew\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003edevicePixelRatio\u003c/span\u003e\u003cspan class=\"o\"\u003e+\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;x\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e+\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eheight\u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003ew\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003edevicePixelRatio\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003etoString\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"n\"\u003eul\u003c/span\u003e\u003cspan class=\"p\"\u003e:(\u003c/span\u003e\u003cspan class=\"n\"\u003enav\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003elanguage\u003c/span\u003e\u003cspan class=\"o\"\u003e||\u003c/span\u003e\u003cspan class=\"n\"\u003evoid\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003etoLowerCase\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"n\"\u003ecid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"n\"\u003e_\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"n\"\u003e_fv\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"n\"\u003ev\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"n\"\u003e_s\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;1\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"n\"\u003edl\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"n\"\u003edocLoc\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eorigin\u003c/span\u003e\u003cspan class=\"o\"\u003e+\u003c/span\u003e\u003cspan class=\"n\"\u003edocLoc\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epathname\u003c/span\u003e\u003cspan class=\"o\"\u003e+\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"n\"\u003edt\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"n\"\u003edoc\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003etitle\u003c/span\u003e\u003cspan class=\"o\"\u003e||\u003c/span\u003e\u003cspan class=\"n\"\u003evoid\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"n\"\u003edr\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"n\"\u003edoc\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ereferrer\u003c/span\u003e\u003cspan class=\"o\"\u003e||\u003c/span\u003e\u003cspan class=\"n\"\u003evoid\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"n\"\u003esid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"n\"\u003ep\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"n\"\u003esct\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"n\"\u003eg\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"n\"\u003eseg\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;1\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"n\"\u003een\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"n\"\u003eu\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;epn.percent_scrolled\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"n\"\u003ef\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;ep.search_term\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"n\"\u003eC\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;ep.file_extension\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"o\"\u003e||\u003c/span\u003e\u003cspan class=\"n\"\u003evoid\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;ep.file_name\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"n\"\u003et\u003c/span\u003e\u003cspan class=\"o\"\u003e||\u003c/span\u003e\u003cspan class=\"n\"\u003evoid\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;ep.link_text\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"n\"\u003en\u003c/span\u003e\u003cspan class=\"o\"\u003e||\u003c/span\u003e\u003cspan class=\"n\"\u003evoid\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;ep.link_url\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"n\"\u003eo\u003c/span\u003e\u003cspan class=\"o\"\u003e||\u003c/span\u003e\u003cspan class=\"n\"\u003evoid\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"n\"\u003e_ss\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"n\"\u003eO\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"n\"\u003e_dbg\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"n\"\u003eA\u003c/span\u003e\u003cspan class=\"err\"\u003e?\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"n\"\u003evoid\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e}),\u003c/span\u003e\u003cspan class=\"n\"\u003el\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003eS\u003c/span\u003e\u003cspan class=\"o\"\u003e+\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;?\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e+\u003c/span\u003e\u003cspan class=\"n\"\u003eM\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003enav\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esendBeacon\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"n\"\u003enav\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esendBeacon\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003el\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"k\"\u003eelse\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003elet\u003c/span\u003e \u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eXMLHttpRequest\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eopen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;POST\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"n\"\u003el\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e)}}\u003c/span\u003e\u003cspan class=\"n\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003esPr\u003c/span\u003e\u003cspan class=\"p\"\u003e(){\u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edocEl\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003escrollTop\u003c/span\u003e\u003cspan class=\"o\"\u003e||\u003c/span\u003e\u003cspan class=\"n\"\u003edocBody\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003escrollTop\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"p\"\u003e((\u003c/span\u003e\u003cspan class=\"n\"\u003edocEl\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003escrollHeight\u003c/span\u003e\u003cspan class=\"o\"\u003e||\u003c/span\u003e\u003cspan class=\"n\"\u003edocBody\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003escrollHeight\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003edocEl\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eclientHeight\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"mi\"\u003e100\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"n\"\u003edoc\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eaddEventListener\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;scroll\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"n\"\u003esEv\u003c/span\u003e\u003cspan class=\"p\"\u003e,{\u003c/span\u003e\u003cspan class=\"n\"\u003epassive\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e});\u003c/span\u003e\u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003esEv\u003c/span\u003e\u003cspan class=\"p\"\u003e(){\u003c/span\u003e\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003esPr\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"mi\"\u003e90\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"n\"\u003eenScroll\u003c/span\u003e\u003cspan class=\"o\"\u003e=!\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"n\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"n\"\u003edoc\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eremoveEventListener\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;scroll\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"n\"\u003esEv\u003c/span\u003e\u003cspan class=\"p\"\u003e,{\u003c/span\u003e\u003cspan class=\"n\"\u003epassive\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e}),\u003c/span\u003e\u003cspan class=\"n\"\u003eenScroll\u003c/span\u003e\u003cspan class=\"o\"\u003e=!\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"n\"\u003edocument\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eaddEventListener\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;DOMContentLoaded\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"n\"\u003efunction\u003c/span\u003e\u003cspan class=\"p\"\u003e(){\u003c/span\u003e\u003cspan class=\"n\"\u003elet\u003c/span\u003e \u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003edocument\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003egetElementsByTagName\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;a\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003elet\u003c/span\u003e \u003cspan class=\"n\"\u003et\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"n\"\u003et\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003elength\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"n\"\u003et\u003c/span\u003e\u003cspan class=\"o\"\u003e++\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003et\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003egetAttribute\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;href\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e!=\u003c/span\u003e\u003cspan class=\"n\"\u003enull\u003c/span\u003e\u003cspan class=\"p\"\u003e){\u003c/span\u003e\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003en\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003et\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003egetAttribute\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;href\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003en\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esubstring\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003en\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003elastIndexOf\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e+\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\u003cspan class=\"n\"\u003eo\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esplit\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;.\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epop\u003c/span\u003e\u003cspan class=\"p\"\u003e();(\u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003et\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ehasAttribute\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;download\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e||\u003c/span\u003e\u003cspan class=\"n\"\u003eextensions\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eincludes\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eo\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003et\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eaddEventListener\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;click\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"n\"\u003efDl\u003c/span\u003e\u003cspan class=\"p\"\u003e,{\u003c/span\u003e\u003cspan class=\"n\"\u003epassive\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e})}});\u003c/span\u003e\u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003efDl\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e){\u003c/span\u003e\u003cspan class=\"n\"\u003eenFdl\u003c/span\u003e\u003cspan class=\"o\"\u003e=!\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"k\"\u003econst\u003c/span\u003e \u003cspan class=\"n\"\u003et\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecurrentTarget\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003egetAttribute\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;href\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\u003cspan class=\"n\"\u003en\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003et\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esubstring\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003et\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003elastIndexOf\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e+\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003en\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esplit\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;.\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003epop\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\u003cspan class=\"n\"\u003eo\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003en\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ereplace\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;.\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e+\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecurrentTarget\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003etext\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"n\"\u003er\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003et\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ereplace\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edocLoc\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eorigin\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"n\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"n\"\u003eo\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"n\"\u003er\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\u003cspan class=\"n\"\u003eenFdl\u003c/span\u003e\u003cspan class=\"o\"\u003e=!\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"n\"\u003escript\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"效果\"\u003e效果\u003c/h4\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/optimize-google-analytics/gtmetrix-report.png_320x.avif 320w, https://liudon.com/posts/optimize-google-analytics/gtmetrix-report.png_480x.avif 480w, https://liudon.com/posts/optimize-google-analytics/gtmetrix-report.png_720x.avif 720w, https://liudon.com/posts/optimize-google-analytics/gtmetrix-report.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/optimize-google-analytics/gtmetrix-report.png_320x.webp 320w, https://liudon.com/posts/optimize-google-analytics/gtmetrix-report.png_480x.webp 480w, https://liudon.com/posts/optimize-google-analytics/gtmetrix-report.png_720x.webp 720w, https://liudon.com/posts/optimize-google-analytics/gtmetrix-report.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/optimize-google-analytics/gtmetrix-report.png\" alt=\"\"\n         width=\"1080\" height=\"383\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n","date_published":"2023-12-02T09:25:49+08:00","tags":["google analytics","cloudflare","博客优化"]},{"title":"使用Google Indexing API加速博客收录","id":"https://liudon.com/posts/how-to-use-google-indexing-api-to-speed-up-blog-indexing/","url":"https://liudon.com/posts/how-to-use-google-indexing-api-to-speed-up-blog-indexing/","summary":"\u003cp\u003e对于一个新站点来说，总是想着能让搜索引擎快点收录网站内容。\u003c/p\u003e\n\u003cp\u003e今天，我们就来介绍一种利用\u003ccode\u003eGoogle Indexing API\u003c/code\u003e接口，通过\u003ccode\u003eGithub Actions\u003c/code\u003e实现部署时通知\u003ccode\u003eGoogle\u003c/code\u003e抓取页面内容。\u003c/p\u003e","content_html":"\u003cp\u003e对于一个新站点来说，总是想着能让搜索引擎快点收录网站内容。\u003c/p\u003e\n\u003cp\u003e今天，我们就来介绍一种利用\u003ccode\u003eGoogle Indexing API\u003c/code\u003e接口，通过\u003ccode\u003eGithub Actions\u003c/code\u003e实现部署时通知\u003ccode\u003eGoogle\u003c/code\u003e抓取页面内容。\u003c/p\u003e\n\u003cp\u003e操作步骤：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e申请\u003ccode\u003eGoogle API\u003c/code\u003e凭证\u003c/p\u003e\n\u003cp\u003e访问\u003ca href=\"https://console.cloud.google.com/\"\u003eGoogle Cloud控制台\u003c/a\u003e，如果没有项目，点击选择项目，然后新建项目。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/how-to-use-google-indexing-api-to-speed-up-blog-indexing/20231027193906.png_320x.avif 320w, https://liudon.com/posts/how-to-use-google-indexing-api-to-speed-up-blog-indexing/20231027193906.png_480x.avif 480w, https://liudon.com/posts/how-to-use-google-indexing-api-to-speed-up-blog-indexing/20231027193906.png_720x.avif 720w, https://liudon.com/posts/how-to-use-google-indexing-api-to-speed-up-blog-indexing/20231027193906.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/how-to-use-google-indexing-api-to-speed-up-blog-indexing/20231027193906.png_320x.webp 320w, https://liudon.com/posts/how-to-use-google-indexing-api-to-speed-up-blog-indexing/20231027193906.png_480x.webp 480w, https://liudon.com/posts/how-to-use-google-indexing-api-to-speed-up-blog-indexing/20231027193906.png_720x.webp 720w, https://liudon.com/posts/how-to-use-google-indexing-api-to-speed-up-blog-indexing/20231027193906.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/how-to-use-google-indexing-api-to-speed-up-blog-indexing/20231027193906.png\" alt=\"\"\n         width=\"1080\" height=\"468\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e选择对应项目，点击\u003ccode\u003eIAM和管理\u003c/code\u003e标签，点击\u003ccode\u003e服务帐号\u003c/code\u003e，选择新建服务帐号。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/how-to-use-google-indexing-api-to-speed-up-blog-indexing/20231027194257.png_320x.avif 320w, https://liudon.com/posts/how-to-use-google-indexing-api-to-speed-up-blog-indexing/20231027194257.png_480x.avif 480w, https://liudon.com/posts/how-to-use-google-indexing-api-to-speed-up-blog-indexing/20231027194257.png_670x.avif 670w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/how-to-use-google-indexing-api-to-speed-up-blog-indexing/20231027194257.png_320x.webp 320w, https://liudon.com/posts/how-to-use-google-indexing-api-to-speed-up-blog-indexing/20231027194257.png_480x.webp 480w, https://liudon.com/posts/how-to-use-google-indexing-api-to-speed-up-blog-indexing/20231027194257.png_670x.webp 670w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/how-to-use-google-indexing-api-to-speed-up-blog-indexing/20231027194257.png\" alt=\"\"\n         width=\"670\" height=\"581\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e服务帐号名称：自己起个名字即可\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e服务帐号id：不需要修改，自动生成\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e服务角色：Owner\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e填写相关信息后，点击完成创建好服务帐号。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/how-to-use-google-indexing-api-to-speed-up-blog-indexing/20231027194753.png_320x.avif 320w, https://liudon.com/posts/how-to-use-google-indexing-api-to-speed-up-blog-indexing/20231027194753.png_480x.avif 480w, https://liudon.com/posts/how-to-use-google-indexing-api-to-speed-up-blog-indexing/20231027194753.png_720x.avif 720w, https://liudon.com/posts/how-to-use-google-indexing-api-to-speed-up-blog-indexing/20231027194753.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/how-to-use-google-indexing-api-to-speed-up-blog-indexing/20231027194753.png_320x.webp 320w, https://liudon.com/posts/how-to-use-google-indexing-api-to-speed-up-blog-indexing/20231027194753.png_480x.webp 480w, https://liudon.com/posts/how-to-use-google-indexing-api-to-speed-up-blog-indexing/20231027194753.png_720x.webp 720w, https://liudon.com/posts/how-to-use-google-indexing-api-to-speed-up-blog-indexing/20231027194753.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/how-to-use-google-indexing-api-to-speed-up-blog-indexing/20231027194753.png\" alt=\"\"\n         width=\"1080\" height=\"276\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e创建完，默认是没有密钥的，记住账号的邮箱地址，后面要用到。\u003c/p\u003e\n\u003cp\u003e点击后面的三个点按钮，选择管理密钥。\u003c/p\u003e\n\u003cp\u003e点击添加密钥-\u0026gt;新建密钥，选择\u003ccode\u003eJSON\u003c/code\u003e格式，点击创建会下载一个文件，这里后面会用到。\u003c/p\u003e\n\u003cp\u003e回到首页，点击\u003ccode\u003eAPI和服务\u003c/code\u003e，点击\u003ccode\u003e启用API和服务\u003c/code\u003e，搜索框输入\u003ccode\u003eIndexing\u003c/code\u003e，选择\u003ccode\u003eWeb Search Indexing API\u003c/code\u003e，点击启用即可。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e将服务账号关联到\u003ccode\u003eGoogle Search Console\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e进入\u003ca href=\"https://search.google.com/\"\u003eGoogle Search Console控制台\u003c/a\u003e，选择你的网站。\u003c/p\u003e\n\u003cp\u003e找到设置里的用户和权限，点击添加用户。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/how-to-use-google-indexing-api-to-speed-up-blog-indexing/202310280923031.png_320x.avif 320w, https://liudon.com/posts/how-to-use-google-indexing-api-to-speed-up-blog-indexing/202310280923031.png_480x.avif 480w, https://liudon.com/posts/how-to-use-google-indexing-api-to-speed-up-blog-indexing/202310280923031.png_720x.avif 720w, https://liudon.com/posts/how-to-use-google-indexing-api-to-speed-up-blog-indexing/202310280923031.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/how-to-use-google-indexing-api-to-speed-up-blog-indexing/202310280923031.png_320x.webp 320w, https://liudon.com/posts/how-to-use-google-indexing-api-to-speed-up-blog-indexing/202310280923031.png_480x.webp 480w, https://liudon.com/posts/how-to-use-google-indexing-api-to-speed-up-blog-indexing/202310280923031.png_720x.webp 720w, https://liudon.com/posts/how-to-use-google-indexing-api-to-speed-up-blog-indexing/202310280923031.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/how-to-use-google-indexing-api-to-speed-up-blog-indexing/202310280923031.png\" alt=\"\"\n         width=\"1080\" height=\"492\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e邮箱地址：填写第一步分配的邮箱地址\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e权限：选择拥有者\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e配置\u003ccode\u003eGithub Action\u003c/code\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e添加\u003ccode\u003eSecret\u003c/code\u003e变量，变量key为\u003ccode\u003eGOOGLE_INDEXING_API_TOKEN\u003c/code\u003e，值为前面下载文件的内容。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e编辑\u003ccode\u003eworkflow\u003c/code\u003e编排任务，新增步骤\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eeasyindex\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"n\"\u003eecho\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;${{ secrets.GOOGLE_INDEXING_API_TOKEN }}\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e./\u003c/span\u003e\u003cspan class=\"n\"\u003ecredentials\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ejson\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"n\"\u003etouch\u003c/span\u003e \u003cspan class=\"o\"\u003e./\u003c/span\u003e\u003cspan class=\"n\"\u003eurl\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecsv\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"n\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s2\"\u003enotification_type\u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s2\"\u003e,\u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s2\"\u003eurl\u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e./\u003c/span\u003e\u003cspan class=\"n\"\u003eurl\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecsv\u003c/span\u003e \u003cspan class=\"c1\"\u003e# Headers line\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"n\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s2\"\u003eURL_UPDATED\u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s2\"\u003e,\u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s2\"\u003ehttps://liudon.com/\u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e./\u003c/span\u003e\u003cspan class=\"n\"\u003eurl\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecsv\u003c/span\u003e \u003cspan class=\"c1\"\u003e# ADD URL 这里改为你的博客首页\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"n\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s2\"\u003eURL_UPDATED\u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s2\"\u003e,\u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s2\"\u003ehttps://liudon.com/sitemap.xml\u003c/span\u003e\u003cspan class=\"se\"\u003e\\\u0026#34;\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e./\u003c/span\u003e\u003cspan class=\"n\"\u003eurl\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecsv\u003c/span\u003e \u003cspan class=\"c1\"\u003e# ADD URL 这里改为你的sitemap地址\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"n\"\u003ecurl\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eL\u003c/span\u003e \u003cspan class=\"n\"\u003ehttps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e//\u003c/span\u003e\u003cspan class=\"n\"\u003egithub\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecom\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eusk81\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eeasyindex\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ecli\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003ereleases\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003edownload\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003ev1\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mf\"\u003e0.6\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eeasyindex\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ecli_1\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"mf\"\u003e0.6\u003c/span\u003e\u003cspan class=\"n\"\u003e_linux_amd64\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003etar\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003egz\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003etar\u003c/span\u003e \u003cspan class=\"n\"\u003exz\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"n\"\u003echmod\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e\u003cspan class=\"n\"\u003ex\u003c/span\u003e \u003cspan class=\"o\"\u003e./\u003c/span\u003e\u003cspan class=\"n\"\u003eeasyindex\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ecli\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"o\"\u003e./\u003c/span\u003e\u003cspan class=\"n\"\u003eeasyindex\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ecli\u003c/span\u003e \u003cspan class=\"n\"\u003egoogle\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ed\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ec\u003c/span\u003e \u003cspan class=\"o\"\u003e./\u003c/span\u003e\u003cspan class=\"n\"\u003eurl\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecsv\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/how-to-use-google-indexing-api-to-speed-up-blog-indexing/20231027200238.png_320x.avif 320w, https://liudon.com/posts/how-to-use-google-indexing-api-to-speed-up-blog-indexing/20231027200238.png_444x.avif 444w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/how-to-use-google-indexing-api-to-speed-up-blog-indexing/20231027200238.png_320x.webp 320w, https://liudon.com/posts/how-to-use-google-indexing-api-to-speed-up-blog-indexing/20231027200238.png_444x.webp 444w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/how-to-use-google-indexing-api-to-speed-up-blog-indexing/20231027200238.png\" alt=\"\"\n         width=\"444\" height=\"212\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n","date_published":"2023-10-27T19:32:24+08:00","tags":["google","github","hugo"]},{"title":"在Netlify上部署Twikoo评论系统","id":"https://liudon.com/posts/deploy-twikoo-on-netlify/","url":"https://liudon.com/posts/deploy-twikoo-on-netlify/","summary":"记录在 Netlify 部署 Twikoo 评论系统、配置 MongoDB、自定义域名，以及排查 CORS、404 和云函数路径问题的过程。","content_html":"\u003cblockquote\u003e\n\u003cp\u003e在本篇文章里，我会介绍如何在Netlify上部署Twikoo评论系统，如何接入到静态博客Hugo，以及如何实现Twikoo系统版本自动更新。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003e2026 年更新说明\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eTwikoo 官方目前仍提供 \u003ca href=\"https://twikoo.js.org/backend.html#netlify-%E9%83%A8%E7%BD%B2\"\u003eNetlify 部署方式\u003c/a\u003e：Fork \u003ccode\u003etwikoojs/twikoo-netlify\u003c/code\u003e、配置 \u003ccode\u003eMONGODB_URI\u003c/code\u003e，并将前端 \u003ccode\u003eenvId\u003c/code\u003e 设置为以 \u003ccode\u003e/.netlify/functions/twikoo\u003c/code\u003e 结尾的地址。本文的 CORS、根路径 Rewrite 和自动更新属于我在此基础上的实际部署记录。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\u003cem\u003e2024年7月30日更新：因为 \u003ca href=\"https://docs.github.com/rest/using-the-rest-api/rate-limits-for-the-rest-api\"\u003eGitHub REST API 有请求频率限制\u003c/a\u003e，原有的匿名请求版本号方式失效，已改为携带 Token 请求，详见工作流里的 \u003ccode\u003eGet twikoo version\u003c/code\u003e 步骤。\u003c/em\u003e\u003c/p\u003e\n\u003ch2 id=\"背景\"\u003e背景\u003c/h2\u003e\n\u003cp\u003e博客之前通过\u003ccode\u003eVercel\u003c/code\u003e部署了\u003ccode\u003eTwikoo\u003c/code\u003e评论系统，但是最近发现加载很慢。\u003c/p\u003e\n\u003cp\u003e看\u003ca href=\"https://twikoo.js.org/backend.html\"\u003eTwikoo官网文档\u003c/a\u003e，\u003ccode\u003eNetlify\u003c/code\u003e比\u003ccode\u003eVercel\u003c/code\u003e国内访问会更优一些，于是搞了一把迁移。\u003c/p\u003e\n\u003cp\u003e迁移过程中遇到了一些问题，网上搜了一番，发现\u003ccode\u003eNetlify\u003c/code\u003e下部署\u003ccode\u003eTwikoo\u003c/code\u003e的信息很少，这篇文章我会介绍整个操作过程。\u003c/p\u003e\n\u003ch2 id=\"部署-twikoo\"\u003e部署 Twikoo\u003c/h2\u003e\n\u003cp\u003e参考\u003ca href=\"https://twikoo.js.org/backend.html#netlify-%E9%83%A8%E7%BD%B2\"\u003e官网文档\u003c/a\u003e，部署即可。\u003c/p\u003e\n\u003cp\u003e这里一开始Fork成了\u003ccode\u003ehttps://github.com/twikoojs/twikoo\u003c/code\u003e，导致部署后访问404。\u003c/p\u003e\n\u003cp\u003e注意，正确的仓库是\u003ccode\u003ehttps://github.com/twikoojs/twikoo-netlify\u003c/code\u003e。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/deploy-twikoo-on-netlify/netlify-3.4f565e5d.png_320x.avif 320w, https://liudon.com/posts/deploy-twikoo-on-netlify/netlify-3.4f565e5d.png_480x.avif 480w, https://liudon.com/posts/deploy-twikoo-on-netlify/netlify-3.4f565e5d.png_720x.avif 720w, https://liudon.com/posts/deploy-twikoo-on-netlify/netlify-3.4f565e5d.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/deploy-twikoo-on-netlify/netlify-3.4f565e5d.png_320x.webp 320w, https://liudon.com/posts/deploy-twikoo-on-netlify/netlify-3.4f565e5d.png_480x.webp 480w, https://liudon.com/posts/deploy-twikoo-on-netlify/netlify-3.4f565e5d.png_720x.webp 720w, https://liudon.com/posts/deploy-twikoo-on-netlify/netlify-3.4f565e5d.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/deploy-twikoo-on-netlify/netlify-3.4f565e5d.png\" alt=\"Netlify部署Twikoo\"\n         width=\"1080\" height=\"520\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e使用同一个\u003ccode\u003eMongoDB\u003c/code\u003e，配置原来的地址，这样已有的评论也不会丢。\u003c/p\u003e\n\u003cp\u003e部署后，通过\u003ccode\u003ehttps://comment.liudon.com\u003c/code\u003e访问，返回200。\u003c/p\u003e\n\u003cp\u003e但是访问\u003ccode\u003ehttps://liudon.com\u003c/code\u003e，提示\u003ccode\u003eCORS跨域错误\u003c/code\u003e，搜索一番网上资料也没找到相关信息。\u003c/p\u003e\n\u003ch2 id=\"排查-cors-与-404\"\u003e排查 CORS 与 404\u003c/h2\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/deploy-twikoo-on-netlify/20231019190935.png_320x.avif 320w, https://liudon.com/posts/deploy-twikoo-on-netlify/20231019190935.png_480x.avif 480w, https://liudon.com/posts/deploy-twikoo-on-netlify/20231019190935.png_720x.avif 720w, https://liudon.com/posts/deploy-twikoo-on-netlify/20231019190935.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/deploy-twikoo-on-netlify/20231019190935.png_320x.webp 320w, https://liudon.com/posts/deploy-twikoo-on-netlify/20231019190935.png_480x.webp 480w, https://liudon.com/posts/deploy-twikoo-on-netlify/20231019190935.png_720x.webp 720w, https://liudon.com/posts/deploy-twikoo-on-netlify/20231019190935.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/deploy-twikoo-on-netlify/20231019190935.png\" alt=\"CORS报错\"\n         width=\"1080\" height=\"309\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e一般跨域错误都是返回头里缺少跨域相关的字段导致，因此决定使用\u003ccode\u003eNetlify\u003c/code\u003e来新增返回头规避。\u003c/p\u003e\n\u003cp\u003e仓库下新增\u003ccode\u003enetlify.toml\u003c/code\u003e文件，针对根目录返回跨域头，内容如下。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[[headers]]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  # Define which paths this specific [[headers]] block will cover.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  for = \u0026#34;/\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    [headers.values]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Access-Control-Allow-Origin = \u0026#34;*\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Access-Control-Allow-Headers = \u0026#34;Content-Type\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Access-Control-Allow-Methods = \u0026#34;*\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e再次刷新页面，报错又变成了404，但是直接访问\u003ccode\u003ehttps://comment.liudon.com\u003c/code\u003e地址是返回的200。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/deploy-twikoo-on-netlify/20231019191326.png_320x.avif 320w, https://liudon.com/posts/deploy-twikoo-on-netlify/20231019191326.png_480x.avif 480w, https://liudon.com/posts/deploy-twikoo-on-netlify/20231019191326.png_720x.avif 720w, https://liudon.com/posts/deploy-twikoo-on-netlify/20231019191326.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/deploy-twikoo-on-netlify/20231019191326.png_320x.webp 320w, https://liudon.com/posts/deploy-twikoo-on-netlify/20231019191326.png_480x.webp 480w, https://liudon.com/posts/deploy-twikoo-on-netlify/20231019191326.png_720x.webp 720w, https://liudon.com/posts/deploy-twikoo-on-netlify/20231019191326.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/deploy-twikoo-on-netlify/20231019191326.png\" alt=\"404报错\"\n         width=\"1080\" height=\"263\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e经过一番定位，发现了问题所在：\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003etwikoo-netlify\u003c/code\u003e库根目录地址是通过\u003ccode\u003eLocation\u003c/code\u003e跳转到的\u003ccode\u003e/.netlify/functions/twikoo\u003c/code\u003e接口，\u003ccode\u003e/.netlify/functions/twikoo\u003c/code\u003e才是真正处理的接口。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/deploy-twikoo-on-netlify/20231019191522.png_320x.avif 320w, https://liudon.com/posts/deploy-twikoo-on-netlify/20231019191522.png_480x.avif 480w, https://liudon.com/posts/deploy-twikoo-on-netlify/20231019191522.png_720x.avif 720w, https://liudon.com/posts/deploy-twikoo-on-netlify/20231019191522.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/deploy-twikoo-on-netlify/20231019191522.png_320x.webp 320w, https://liudon.com/posts/deploy-twikoo-on-netlify/20231019191522.png_480x.webp 480w, https://liudon.com/posts/deploy-twikoo-on-netlify/20231019191522.png_720x.webp 720w, https://liudon.com/posts/deploy-twikoo-on-netlify/20231019191522.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/deploy-twikoo-on-netlify/20231019191522.png\" alt=\"twikoo-netlify根目录返回\"\n         width=\"1080\" height=\"284\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e而\u003ccode\u003evercel-netlify\u003c/code\u003e库是通过rewrite将所有请求转发到了\u003ccode\u003e/api/index\u003c/code\u003e接口。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/deploy-twikoo-on-netlify/20231019191833.png_320x.avif 320w, https://liudon.com/posts/deploy-twikoo-on-netlify/20231019191833.png_480x.avif 480w, https://liudon.com/posts/deploy-twikoo-on-netlify/20231019191833.png_720x.avif 720w, https://liudon.com/posts/deploy-twikoo-on-netlify/20231019191833.png_1012x.avif 1012w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/deploy-twikoo-on-netlify/20231019191833.png_320x.webp 320w, https://liudon.com/posts/deploy-twikoo-on-netlify/20231019191833.png_480x.webp 480w, https://liudon.com/posts/deploy-twikoo-on-netlify/20231019191833.png_720x.webp 720w, https://liudon.com/posts/deploy-twikoo-on-netlify/20231019191833.png_1012x.webp 1012w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/deploy-twikoo-on-netlify/20231019191833.png\" alt=\"twikoo-vercel转发\"\n         width=\"1012\" height=\"442\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e博客里写的\u003ccode\u003eTwikoo\u003c/code\u003e环境id填的是\u003ccode\u003ehttps://comment.liudon.com\u003c/code\u003e，更换为\u003ccode\u003eNetlify\u003c/code\u003e后，需要更换环境id，补齐后面的\u003ccode\u003e/.netlify/functions/twikoo\u003c/code\u003e。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/deploy-twikoo-on-netlify/20231019192158.png_320x.avif 320w, https://liudon.com/posts/deploy-twikoo-on-netlify/20231019192158.png_480x.avif 480w, https://liudon.com/posts/deploy-twikoo-on-netlify/20231019192158.png_663x.avif 663w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/deploy-twikoo-on-netlify/20231019192158.png_320x.webp 320w, https://liudon.com/posts/deploy-twikoo-on-netlify/20231019192158.png_480x.webp 480w, https://liudon.com/posts/deploy-twikoo-on-netlify/20231019192158.png_663x.webp 663w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/deploy-twikoo-on-netlify/20231019192158.png\" alt=\"twikoo环境id\"\n         width=\"663\" height=\"137\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e因为\u003ccode\u003eNetlify\u003c/code\u003e也支持\u003ccode\u003eRewrite\u003c/code\u003e转发，所以决定还是通过\u003ccode\u003enetlify.toml\u003c/code\u003e文件增加转发配置解决，内容如下：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[[redirects]]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  from = \u0026#34;/\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  to = \u0026#34;/.netlify/functions/twikoo\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  status = 200\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  force = true\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e注意一定不要漏了\u003ccode\u003eforce\u003c/code\u003e参数，因为根目录文件是存在的，不带这个参数的话\u003ccode\u003eRewrite\u003c/code\u003e是不生效的，必须指定这个。\u003c/p\u003e\n\u003cp\u003e这下访问彻底正常了。\u003c/p\u003e\n\u003cp\u003e不过很快又发现另外一个问题，看到别人博客上\u003ccode\u003eTwikoo\u003c/code\u003e版本已经是\u003ccode\u003e1.6.22\u003c/code\u003e，自己的还是\u003ccode\u003e1.5.11\u003c/code\u003e。\u003c/p\u003e\n\u003cp\u003e搜索一番后，\u003ccode\u003eTwikoo\u003c/code\u003e已经给出了更新操作:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e针对 Netlify 部署的更新方式\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e1. 登录 Github，找到部署时 fork 到自己账号下的名为 twikoo-netlify 的仓库\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2. 打开 package.json，点击编辑\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e3. 将 \u0026#34;twikoo-vercel\u0026#34;: \u0026#34;latest\u0026#34; 其中的 latest 修改为最新版本号。点击 Commit changes\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e4. 部署会自动触发\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e不过这样操作，每次版本更新，都需要手动去改一下\u003ccode\u003epackage.json\u003c/code\u003e文件的版本，重新构建。\u003c/p\u003e\n\u003cp\u003e对于一个程序员，我们的追求就是自动化。\u003c/p\u003e\n\u003ch2 id=\"自动更新-twikoo-版本\"\u003e自动更新 Twikoo 版本\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e服务端版本自动更新\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e这里利用\u003ccode\u003eGitHub Actions\u003c/code\u003e定时任务，通过接口拉取\u003ca href=\"https://github.com/twikoojs/twikoo/releases\"\u003eTwikoo\u003c/a\u003e最新的版本，然后更新到\u003ccode\u003epackage.json\u003c/code\u003e文件，从而实现版本自动更新。\u003c/p\u003e\n\u003cp\u003e自动跟随最新版可能遇到不兼容更新，生产环境建议先在测试环境验证，再决定是否更新版本。\u003c/p\u003e\n\u003cp\u003e在自己\u003ccode\u003etwikoo-netlify\u003c/code\u003e仓库下，新增\u003ccode\u003eActions\u003c/code\u003e，代码如下：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# This is a basic workflow to help you get started with Actions\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ename: CI\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# Controls when the workflow will run\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eon:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  # Triggers the workflow on push or pull request events but only for the \u0026#34;main\u0026#34; branch\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  push:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    branches: [ \u0026#34;main\u0026#34; ]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  pull_request:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    branches: [ \u0026#34;main\u0026#34; ]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  # Allows you to run this workflow manually from the Actions tab\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  workflow_dispatch:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  schedule:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    - cron: \u0026#39;0 2 * * *\u0026#39; # 每天定时2点执行一次\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# A workflow run is made up of one or more jobs that can run sequentially or in parallel\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ejobs:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  # This workflow contains a single job called \u0026#34;build\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  build:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    # The type of runner that the job will run on\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    runs-on: ubuntu-latest\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    permissions:      \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      contents: write\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    # Steps represent a sequence of tasks that will be executed as part of the job\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    steps:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      - uses: actions/checkout@v3\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      # Runs a single command using the runners shell\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      - name: update version\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        env:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          github_token: ${{ secrets.TOKEN }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        run: |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          response=$(curl -sf -H \u0026#34;Authorization: token $github_token\u0026#34; -H \u0026#34;Accept: application/vnd.github+json\u0026#34; https://api.github.com/repos/twikoojs/twikoo/releases/latest)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          version=$(echo $response | jq -r \u0026#39;.tag_name\u0026#39;)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          if [ -n \u0026#34;$version\u0026#34; ]; then\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            sed -i \u0026#34;s/\\\u0026#34;twikoo-netlify\\\u0026#34;: \\\u0026#34;.*\\\u0026#34;/\\\u0026#34;twikoo-netlify\\\u0026#34;: \\\u0026#34;$version\\\u0026#34;/\u0026#34; package.json\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          fi\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        shell: bash\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      # Runs a set of commands using the runners shell\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      - name: Commit changes\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        uses: EndBug/add-and-commit@v9\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        env:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          github_token: ${{ secrets.TOKEN }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          add: .\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e这里会把修改后的\u003ccode\u003epackage.json\u003c/code\u003e文件提交到仓库，所以需要申请一个\u003ccode\u003eToken\u003c/code\u003e，可以参考我上一篇\u003ca href=\"https://liudon.com/posts/using-github-actions-to-schedule-weibo-scraping/\"\u003e文章\u003c/a\u003e申请，然后添加到仓库变量里。\u003c/p\u003e\n\u003col start=\"2\"\u003e\n\u003cli\u003e博客引用版本自动更新\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e这里一开始想到在前端去查服务端最新版本号，然后引用对应版本的js文件来实现。\u003c/p\u003e\n\u003cp\u003e但是这样就会导致每次页面加载都要去查一次版本，会导致加载时间变长。\u003c/p\u003e\n\u003cp\u003e因此还是决定在服务端部署时，获取最新版本号更新服务。\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e引用版本配置化\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003ccode\u003ecomments.html\u003c/code\u003e文件修改：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;script src=\u0026#34;https://cdn.staticfile.org/twikoo/{{ .Site.Params.twikoo.version }}/twikoo.all.min.js\u0026#34;\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003ccode\u003econfig.yml\u003c/code\u003e配置修改：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eparams:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  env: production # to enable google analytics, opengraph, twitter-cards and schema.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  ... # 其他配置\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  assets:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    disableHLJS: true # to disable highlight.js\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  twikoo:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    version: 1.5.11 # 配置twikoo版本号\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003e获取最新版本号部署\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003ccode\u003eActions\u003c/code\u003e新增步骤：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    - name: Setup Hugo\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    uses: peaceiris/actions-hugo@v2\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    with:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        hugo-version: \u0026#39;latest\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    ####\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    - name: Get twikoo version\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    id: twikoo\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    run: |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        version=$(curl -s https://raw.githubusercontent.com/Liudon/twikoo-netlify/main/package.json | jq -r \u0026#39;.dependencies.\u0026#34;twikoo-netlify\u0026#34;\u0026#39;)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        echo \u0026#34;Twikoo version: $version\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        echo \u0026#34;twikoo_version=$version\u0026#34; \u0026gt;\u0026gt; $GITHUB_OUTPUT\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    - name: Update config.yml version\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    uses: fjogeleit/yaml-update-action@main\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    with:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        valueFile: \u0026#39;config.yml\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        propertyPath: \u0026#39;params.twikoo.version\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        value: ${{ steps.twikoo.outputs.twikoo_version }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        commitChange: true\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    ####\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    - name: Build\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    run: hugo --gc --minify --cleanDestinationDir \n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003ccode\u003e####\u003c/code\u003e内代码即为获取版本号、更新\u003ccode\u003econfig.yml\u003c/code\u003e版本号的逻辑，然后再进行 Hugo 部署。\u003c/p\u003e\n\u003cp\u003e需要将\u003ccode\u003ehttps://raw.githubusercontent.com/Liudon/twikoo-netlify/main/package.json\u003c/code\u003e这个url里的\u003ccode\u003eLiudon/twikoo-netlify\u003c/code\u003e改为你的仓库名。\u003c/p\u003e\n\u003cp\u003e这下后面\u003ccode\u003eTwikoo\u003c/code\u003e官方更新版本，博客的\u003ccode\u003eTwikoo\u003c/code\u003e也会跟着自动更新。\u003c/p\u003e\n","date_published":"2023-10-19T19:46:32+08:00","tags":["netlify","twikoo","github","vercel","hugo"]},{"title":"利用Github Actions定时抓取微博","id":"https://liudon.com/posts/using-github-actions-to-schedule-weibo-scraping/","url":"https://liudon.com/posts/using-github-actions-to-schedule-weibo-scraping/","summary":"\u003ch4 id=\"背景\"\u003e背景\u003c/h4\u003e\n\u003cp\u003e在微博上关注了一些用户，比如\u003ca href=\"https://weibo.com/u/1401527553\"\u003etk教主\u003c/a\u003e，\u003ca href=\"https://weibo.com/u/1670659923\"\u003e月风\u003c/a\u003e。\u003c/p\u003e\n\u003cp\u003e但是有些内容过段时间不可见了，所以希望可以定时抓取微博归档备份下来。\u003c/p\u003e\n\u003ch4 id=\"实现方案\"\u003e实现方案\u003c/h4\u003e\n\u003cp\u003e\u003cstrong\u003e整体思路：利用\u003ccode\u003eGithub Actions\u003c/code\u003e的\u003ccode\u003eScheduled\u003c/code\u003e任务，定时执行抓取shell脚本，将内容保存到文件，提交到Github仓库。\u003c/strong\u003e\u003c/p\u003e","content_html":"\u003ch4 id=\"背景\"\u003e背景\u003c/h4\u003e\n\u003cp\u003e在微博上关注了一些用户，比如\u003ca href=\"https://weibo.com/u/1401527553\"\u003etk教主\u003c/a\u003e，\u003ca href=\"https://weibo.com/u/1670659923\"\u003e月风\u003c/a\u003e。\u003c/p\u003e\n\u003cp\u003e但是有些内容过段时间不可见了，所以希望可以定时抓取微博归档备份下来。\u003c/p\u003e\n\u003ch4 id=\"实现方案\"\u003e实现方案\u003c/h4\u003e\n\u003cp\u003e\u003cstrong\u003e整体思路：利用\u003ccode\u003eGithub Actions\u003c/code\u003e的\u003ccode\u003eScheduled\u003c/code\u003e任务，定时执行抓取shell脚本，将内容保存到文件，提交到Github仓库。\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e新建仓库，比如\u003ccode\u003eweibo_archive\u003c/code\u003e。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e添加抓取脚本，\u003ca href=\"https://github.com/Liudon/weibo_archive/blob/main/weibo_archive.sh\"\u003e完整代码\u003c/a\u003e。\u003c/p\u003e\n\u003cp\u003e这里用到微博两个接口：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e// 抓取某个用户最新的10条微博数据，返回里有每条微博的id，这里如果内容过长的话会被截断\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ehttps://m.weibo.cn/api/container/getIndex?jumpfrom=weibocom\u0026amp;type=uid\u0026amp;value=$uid\u0026amp;containerid=107603$uid\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e// 根据微博id，抓取微博完整的内容\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ehttps://m.weibo.cn/statuses/extend?id=$id\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e添加环境变量。\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e进入\u003ccode\u003e个人设置\u003c/code\u003e-\u0026gt;\u003ccode\u003eDeveloper Settings\u003c/code\u003e-\u0026gt;\u003ccode\u003ePersonal access tokens\u003c/code\u003e-\u0026gt;\u003ccode\u003eTokens (classic)\u003c/code\u003e，创建新的Token，记下对应的值。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e进入第一步创建仓库的配置页，点击\u003ccode\u003eSecrets and variables\u003c/code\u003e下的\u003ccode\u003eActions\u003c/code\u003e：\u003c/p\u003e\n\u003cp\u003e切到\u003ccode\u003eSecret\u003c/code\u003e目录，创建新的\u003ccode\u003eSecret\u003c/code\u003e变量，名称为\u003ccode\u003eTOKEN\u003c/code\u003e，值为前一步记录的值；切到\u003ccode\u003eVariables\u003c/code\u003e目录，创建新的\u003ccode\u003eVariables\u003c/code\u003e变量，名称为\u003ccode\u003eWEIBO_UIDS\u003c/code\u003e，值为你需要抓取的微博用户id，多个用户的话以\u003ccode\u003e|\u003c/code\u003e分割。\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e添加定时任务，完整yaml文件如下。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# This is a basic workflow to help you get started with Actions\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eCI\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Controls when the workflow will run\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eon\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Triggers the workflow on push or pull request events but only for the \u0026#34;main\u0026#34; branch\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003epush\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003ebranches\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;main\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003epull_request\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003ebranches\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;main\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# Allows you to run this workflow manually from the Actions tab\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eworkflow_dispatch\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eschedule\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003ecron\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;*/5 * * * *\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# A workflow run is made up of one or more jobs that can run sequentially or in parallel\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ejobs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e# This workflow contains a single job called \u0026#34;build\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ebuild\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# The type of runner that the job will run on\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eruns\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eon\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eubuntu\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003elatest\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003epermissions\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e      \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003econtents\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003ewrite\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# Steps represent a sequence of tasks that will be executed as part of the job\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003esteps\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eactions\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003echeckout\u003c/span\u003e\u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003ev3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# Runs a single command using the runners shell\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003earchive\u003c/span\u003e \u003cspan class=\"n\"\u003eweibo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003echmod\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e\u003cspan class=\"n\"\u003ex\u003c/span\u003e \u003cspan class=\"o\"\u003e./\u003c/span\u003e\u003cspan class=\"n\"\u003eweibo_archive\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esh\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e./\u003c/span\u003e\u003cspan class=\"n\"\u003eweibo_archive\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003esh\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eshell\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003ebash\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eenv\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eweibo_uids\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"n\"\u003evars\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eweibo_uids\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e# Runs a set of commands using the runners shell\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eCommit\u003c/span\u003e \u003cspan class=\"n\"\u003echanges\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eEndBug\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eadd\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"ow\"\u003eand\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ecommit\u003c/span\u003e\u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003ev9\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eenv\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003egithub_token\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"n\"\u003esecrets\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eTOKEN\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eadd\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch4 id=\"效果\"\u003e效果\u003c/h4\u003e\n\u003cp\u003e抓取后的内容，会按用户id分别保存到不同文件。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/using-github-actions-to-schedule-weibo-scraping/20231007132025.png_320x.avif 320w, https://liudon.com/posts/using-github-actions-to-schedule-weibo-scraping/20231007132025.png_480x.avif 480w, https://liudon.com/posts/using-github-actions-to-schedule-weibo-scraping/20231007132025.png_720x.avif 720w, https://liudon.com/posts/using-github-actions-to-schedule-weibo-scraping/20231007132025.png_824x.avif 824w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/using-github-actions-to-schedule-weibo-scraping/20231007132025.png_320x.webp 320w, https://liudon.com/posts/using-github-actions-to-schedule-weibo-scraping/20231007132025.png_480x.webp 480w, https://liudon.com/posts/using-github-actions-to-schedule-weibo-scraping/20231007132025.png_720x.webp 720w, https://liudon.com/posts/using-github-actions-to-schedule-weibo-scraping/20231007132025.png_824x.webp 824w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/using-github-actions-to-schedule-weibo-scraping/20231007132025.png\" alt=\"效果\"\n         width=\"824\" height=\"207\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e不过这个方案有一个唯一的缺点，\u003ccode\u003eGithub Actions\u003c/code\u003e定时任务时间粒度最小是5分钟，而且不能保证执行时间完全符合这个粒度，所以可能还是会有漏掉的内容。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eNote: The schedule event can be delayed during periods of high loads of GitHub Actions workflow runs. High load times include the start of every hour. If the load is sufficiently high enough, some queued jobs may be dropped. To decrease the chance of delay, schedule your workflow to run at a different time of the hour.\u003c/p\u003e\n\u003c/blockquote\u003e\n","date_published":"2023-10-07T13:17:57+08:00","tags":["github","weibo"]},{"title":"北大口腔牙周刮治记录","id":"https://liudon.com/posts/%E5%8C%97%E5%A4%A7%E5%8F%A3%E8%85%94%E7%89%99%E5%91%A8%E5%88%AE%E6%B2%BB%E8%AE%B0%E5%BD%95/","url":"https://liudon.com/posts/%E5%8C%97%E5%A4%A7%E5%8F%A3%E8%85%94%E7%89%99%E5%91%A8%E5%88%AE%E6%B2%BB%E8%AE%B0%E5%BD%95/","summary":"\u003ch4 id=\"病情\"\u003e病情\u003c/h4\u003e\n\u003cp\u003e上次洗完牙后，还是不时有出血的情况。\u003c/p\u003e\n\u003cp\u003e前段时间更是出现牙龈劈开一块肉，特别容易塞东西的情况。\u003c/p\u003e\n\u003cp\u003e于是，又跑到医院来看牙了。\u003c/p\u003e\n\u003cp\u003e医生检查后，说是牙周病，需要牙周刮治，要约到8月份了。\u003c/p\u003e","content_html":"\u003ch4 id=\"病情\"\u003e病情\u003c/h4\u003e\n\u003cp\u003e上次洗完牙后，还是不时有出血的情况。\u003c/p\u003e\n\u003cp\u003e前段时间更是出现牙龈劈开一块肉，特别容易塞东西的情况。\u003c/p\u003e\n\u003cp\u003e于是，又跑到医院来看牙了。\u003c/p\u003e\n\u003cp\u003e医生检查后，说是牙周病，需要牙周刮治，要约到8月份了。\u003c/p\u003e\n\u003cp\u003e回来查了下，牙周刮治还是挺痛苦的，想着找个专业医院看看再。\u003c/p\u003e\n\u003ch4 id=\"挂号\"\u003e挂号\u003c/h4\u003e\n\u003cp\u003e于是开始北大口腔挂号，中间挂了一次总院的普通号，但是网上好多说是规培生操作，又取消了。\u003c/p\u003e\n\u003cp\u003e找了农行的代挂号服务，北大口腔只能微信预约，他们也没渠道，只能自己挂了。\u003c/p\u003e\n\u003cp\u003e总院实在是挂不到，于是转战第一门诊部的号。\u003c/p\u003e\n\u003cp\u003e功夫不负有心人，7月5日总算挂上了牙周科李菲医生的号。\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"https://static.liudon.com/img/202309171559362.jpg\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/p\u003e\n\u003ch4 id=\"治疗\"\u003e治疗\u003c/h4\u003e\n\u003cp\u003e7月7日，第一次看医生，刮治是没的跑了。\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"https://static.liudon.com/img/202309171603897.jpg\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/p\u003e\n\u003cp\u003e做了牙齿探针，每个牙都要测一下，略疼。\u003c/p\u003e\n\u003cp\u003e开了治疗计划，刮治分两次，每次半口牙，总费用3000元左右。\u003c/p\u003e\n\u003cp\u003e第一次只洗牙，确实是专业，洗牙不到半个小时搞定。\u003c/p\u003e\n\u003cp\u003e最关键的，洗完后我刷牙确实很少再出血了。\u003c/p\u003e\n\u003cp\u003e8月3日，第一次刮治，只做了右半边。\u003c/p\u003e\n\u003cp\u003e医生说我这算是轻的，刮治比洗牙会疼一些，可以打麻药也可以不打。\u003c/p\u003e\n\u003cp\u003e行吧，那咱就不打麻药，来吧。\u003c/p\u003e\n\u003cp\u003e医生开始操作，感觉和洗牙是一样的，也是拿喷水的机器在牙上弄来弄去。\u003c/p\u003e\n\u003cp\u003e但是比洗牙更深一些，感觉是直接到牙龈下面了，确实要更疼一些。\u003c/p\u003e\n\u003cp\u003e洗完后，再拿一个铁丝一样的东西在牙上使劲刮来刮去。\u003c/p\u003e\n\u003cp\u003e自我感觉，还是前面洗牙更痛苦一些，后面刮来刮去没什么感觉。\u003c/p\u003e\n\u003cfigure class=\"align-center \"\u003e\u003cimg src=\"https://static.liudon.com/img/202309171612269.jpg\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003cfigcaption\u003e\n            铁丝一样的工具，第二次刮治拍的\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003cp\u003e半个小时搞定，本来我以为我这得一俩小时，医生说那得是非常严重的，你这属于轻的。\u003c/p\u003e\n\u003cp\u003e9月2日，第二次刮治，做了左半边。\u003c/p\u003e\n\u003cp\u003e左边牙龈问题更压重些，这次痛感更强烈一些。\u003c/p\u003e\n\u003cp\u003e同样也是半个小时搞定，1个月后再来复诊。\u003c/p\u003e\n\u003ch4 id=\"费用\"\u003e费用\u003c/h4\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e洗牙：480元，单子找不到了，我记得是这个数。\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e第一次刮治：1286元\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e第二次刮治：1176元\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e总费用2942元，基本都走了医保。\u003c/p\u003e\n","date_published":"2023-09-17T15:46:32+08:00","tags":[]},{"title":"故乡回忆之旅","id":"https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/","url":"https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/","summary":"\u003cp\u003e赶在8月底，趁着娃暑假的尾声，回了趟老家。\u003c/p\u003e\n\u003cp\u003e老家有条俗语，“永福庄的街，三里长”。\u003c/p\u003e\n\u003cp\u003e这天吃完午饭，临时起意，带媳妇溜溜大街，见识下我们的大街。\u003c/p\u003e\n\u003cp\u003e小时候，整天在这条街上跑来跑去。\u003c/p\u003e","content_html":"\u003cp\u003e赶在8月底，趁着娃暑假的尾声，回了趟老家。\u003c/p\u003e\n\u003cp\u003e老家有条俗语，“永福庄的街，三里长”。\u003c/p\u003e\n\u003cp\u003e这天吃完午饭，临时起意，带媳妇溜溜大街，见识下我们的大街。\u003c/p\u003e\n\u003cp\u003e小时候，整天在这条街上跑来跑去。\u003c/p\u003e\n\u003cp\u003e我们那巷子基本很少是堵头的，你可以穿到任意一个巷子，最后还能回到大街。\u003c/p\u003e\n\u003cp\u003e小时候的大街，感觉很宽很长。\u003c/p\u003e\n\u003cp\u003e现在大街都垫高了，大街也变的窄了许多。\u003c/p\u003e\n\u003cp\u003e大街上的人很少，好多店铺都关门了。\u003c/p\u003e\n\u003cp\u003e走在大街上，小时候的一幕幕映在眼前。\u003c/p\u003e\n\u003cp\u003e有的地方，已经拆了重盖；\u003c/p\u003e\n\u003cp\u003e有的地方，已经人去楼空。\u003c/p\u003e\n\u003cp\u003e\u003cfigure class=\"align-center \"\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092348210.jpg_320x.avif 320w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092348210.jpg_480x.avif 480w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092348210.jpg_720x.avif 720w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092348210.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092348210.jpg_320x.webp 320w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092348210.jpg_480x.webp 480w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092348210.jpg_720x.webp 720w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092348210.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092348210.jpg#center\" alt=\"\"\n         width=\"1080\" height=\"607\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003cfigcaption\u003e\n            爷爷待过的大队部\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003cfigure class=\"align-center \"\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092348324.jpg_320x.avif 320w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092348324.jpg_480x.avif 480w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092348324.jpg_720x.avif 720w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092348324.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092348324.jpg_320x.webp 320w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092348324.jpg_480x.webp 480w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092348324.jpg_720x.webp 720w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092348324.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092348324.jpg#center\" alt=\"\"\n         width=\"1080\" height=\"607\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003cfigcaption\u003e\n            以前的供销社\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\u003c/p\u003e\n\u003cp\u003e\u003cfigure class=\"align-center \"\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092350308.jpg_320x.avif 320w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092350308.jpg_480x.avif 480w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092350308.jpg_720x.avif 720w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092350308.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092350308.jpg_320x.webp 320w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092350308.jpg_480x.webp 480w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092350308.jpg_720x.webp 720w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092350308.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092350308.jpg#center\" alt=\"\"\n         width=\"1080\" height=\"607\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003cfigcaption\u003e\n            老爷爷家\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003cfigure class=\"align-center \"\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092350619.jpg_320x.avif 320w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092350619.jpg_480x.avif 480w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092350619.jpg_720x.avif 720w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092350619.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092350619.jpg_320x.webp 320w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092350619.jpg_480x.webp 480w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092350619.jpg_720x.webp 720w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092350619.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092350619.jpg#center\" alt=\"\"\n         width=\"1080\" height=\"607\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003cfigcaption\u003e\n            姥爷以前的药铺\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003cfigure class=\"align-center \"\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309101306461.jpg_320x.avif 320w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309101306461.jpg_480x.avif 480w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309101306461.jpg_720x.avif 720w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309101306461.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309101306461.jpg_320x.webp 320w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309101306461.jpg_480x.webp 480w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309101306461.jpg_720x.webp 720w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309101306461.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309101306461.jpg#center\" alt=\"\"\n         width=\"1080\" height=\"607\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003cfigcaption\u003e\n            姥姥家\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\u003c/p\u003e\n\u003cp\u003e\u003cfigure class=\"align-center \"\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309101307174.jpg_320x.avif 320w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309101307174.jpg_480x.avif 480w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309101307174.jpg_720x.avif 720w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309101307174.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309101307174.jpg_320x.webp 320w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309101307174.jpg_480x.webp 480w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309101307174.jpg_720x.webp 720w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309101307174.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309101307174.jpg#center\" alt=\"\"\n         width=\"1080\" height=\"607\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003cfigcaption\u003e\n            最早是肉食店，后来开过药铺\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003cfigure class=\"align-center \"\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309101308503.jpg_320x.avif 320w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309101308503.jpg_480x.avif 480w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309101308503.jpg_720x.avif 720w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309101308503.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309101308503.jpg_320x.webp 320w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309101308503.jpg_480x.webp 480w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309101308503.jpg_720x.webp 720w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309101308503.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309101308503.jpg#center\" alt=\"\"\n         width=\"1080\" height=\"607\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003cfigcaption\u003e\n            里面以前是个学校\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\u003c/p\u003e\n\u003cp\u003e\u003cfigure class=\"align-center \"\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092349674.jpg_320x.avif 320w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092349674.jpg_480x.avif 480w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092349674.jpg_720x.avif 720w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092349674.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092349674.jpg_320x.webp 320w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092349674.jpg_480x.webp 480w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092349674.jpg_720x.webp 720w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092349674.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092349674.jpg#center\" alt=\"\"\n         width=\"1080\" height=\"1920\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003cfigcaption\u003e\n            巷口的大饭店\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003cfigure class=\"align-center \"\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092349469.jpg_320x.avif 320w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092349469.jpg_480x.avif 480w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092349469.jpg_720x.avif 720w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092349469.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092349469.jpg_320x.webp 320w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092349469.jpg_480x.webp 480w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092349469.jpg_720x.webp 720w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092349469.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092349469.jpg#center\" alt=\"\"\n         width=\"1080\" height=\"1920\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003cfigcaption\u003e\n            一栋风格怪异的楼\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003cfigure class=\"align-center \"\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092351506.jpg_320x.avif 320w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092351506.jpg_480x.avif 480w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092351506.jpg_720x.avif 720w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092351506.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092351506.jpg_320x.webp 320w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092351506.jpg_480x.webp 480w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092351506.jpg_720x.webp 720w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092351506.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092351506.jpg#center\" alt=\"\"\n         width=\"1080\" height=\"1920\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003cfigcaption\u003e\n            巷子\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\u003c/p\u003e\n\u003cp\u003e\u003cfigure class=\"align-center \"\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092352743.jpg_320x.avif 320w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092352743.jpg_480x.avif 480w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092352743.jpg_720x.avif 720w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092352743.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092352743.jpg_320x.webp 320w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092352743.jpg_480x.webp 480w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092352743.jpg_720x.webp 720w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092352743.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092352743.jpg#center\" alt=\"\"\n         width=\"1080\" height=\"1920\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003cfigcaption\u003e\n            刘家祖庙\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003cfigure class=\"align-center \"\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092353811.jpg_320x.avif 320w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092353811.jpg_480x.avif 480w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092353811.jpg_720x.avif 720w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092353811.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092353811.jpg_320x.webp 320w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092353811.jpg_480x.webp 480w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092353811.jpg_720x.webp 720w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092353811.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092353811.jpg#center\" alt=\"\"\n         width=\"1080\" height=\"1920\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003cfigcaption\u003e\n            赵家祖庙\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\u003c/p\u003e\n\u003cp\u003e\u003cfigure class=\"align-center \"\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092352581.jpg_320x.avif 320w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092352581.jpg_480x.avif 480w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092352581.jpg_720x.avif 720w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092352581.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092352581.jpg_320x.webp 320w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092352581.jpg_480x.webp 480w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092352581.jpg_720x.webp 720w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092352581.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309092352581.jpg#center\" alt=\"\"\n         width=\"1080\" height=\"607\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003cfigcaption\u003e\n            赵家祖庙\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003cfigure class=\"align-center \"\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309101309020.jpg_320x.avif 320w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309101309020.jpg_480x.avif 480w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309101309020.jpg_720x.avif 720w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309101309020.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309101309020.jpg_320x.webp 320w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309101309020.jpg_480x.webp 480w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309101309020.jpg_720x.webp 720w, https://liudon.com/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309101309020.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/%E6%95%85%E4%B9%A1%E5%9B%9E%E5%BF%86%E4%B9%8B%E6%97%85/202309101309020.jpg#center\" alt=\"\"\n         width=\"1080\" height=\"607\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003cfigcaption\u003e\n            关帝庙\n        \u003c/figcaption\u003e\n\u003c/figure\u003e\u003c/p\u003e\n","date_published":"2023-09-09T23:19:03+08:00","tags":[]},{"title":"解决Golang使用go get安装包后找不到可执行文件的问题","id":"https://liudon.com/posts/golang-go-get-binary-not-found-solution/","url":"https://liudon.com/posts/golang-go-get-binary-not-found-solution/","summary":"解决升级 Go 后使用 go get 安装 protoc-gen-go，却提示 program not found or is not executable 的问题。","content_html":"\u003ch2 id=\"问题现象\"\u003e问题现象\u003c/h2\u003e\n\u003cp\u003e编译流水线代码\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ego get google.golang.org/protobuf/cmd/protoc-gen-go@latest\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eprotoc -I=./zzz --proto_path=./xx --go_out=./abc --go_opt=paths=xx.proto\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ego build -o xxx\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e在 Go 升级到 1.20.1 后，执行时报错：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eprotoc-gen-go: program not found or is not executable\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"原因\"\u003e原因\u003c/h2\u003e\n\u003cblockquote\u003e\n\u003cp\u003eStarting in Go 1.17, installing executables with go get is deprecated. go install may be used instead.\u003c/p\u003e\n\u003cp\u003eIn a future Go release, go get will no longer build packages; it will only be used to add, update, or remove dependencies in go.mod. Specifically, go get will act as if the -d flag were enabled.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://go.dev/doc/go-get-install-deprecation\"\u003eDeprecation of \u0026lsquo;go get\u0026rsquo; for installing executables\u003c/a\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e从 Go 1.17 开始，官方弃用使用 \u003ccode\u003ego get\u003c/code\u003e 安装可执行文件；从 Go 1.18 开始，\u003ccode\u003ego get\u003c/code\u003e 只用于调整当前模块的依赖，不再构建和安装命令。\u003c/p\u003e\n\u003cp\u003e因此，原来的命令虽然处理了模块依赖，却没有把 \u003ccode\u003eprotoc-gen-go\u003c/code\u003e 可执行文件安装到命令搜索路径。\u003c/p\u003e\n\u003ch2 id=\"解决方法\"\u003e解决方法\u003c/h2\u003e\n\u003cp\u003e将安装命令替换为：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ego install google.golang.org/protobuf/cmd/protoc-gen-go@latest\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e安装后可以检查可执行文件目录：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ego env GOBIN\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ego env GOPATH\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e如果 \u003ccode\u003eGOBIN\u003c/code\u003e 为空，可执行文件默认安装在 \u003ccode\u003e$(go env GOPATH)/bin\u003c/code\u003e。流水线需要把这个目录加入 \u003ccode\u003ePATH\u003c/code\u003e：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nb\"\u003eexport\u003c/span\u003e \u003cspan class=\"nv\"\u003ePATH\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"k\"\u003e$(\u003c/span\u003ego env GOPATH\u003cspan class=\"k\"\u003e)\u003c/span\u003e\u003cspan class=\"s2\"\u003e/bin:\u003c/span\u003e\u003cspan class=\"nv\"\u003e$PATH\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eprotoc-gen-go --version\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e之后再执行 \u003ccode\u003eprotoc --go_out=...\u003c/code\u003e 即可。\u003c/p\u003e\n","date_published":"2023-08-17T09:20:50+08:00","tags":["golang"]},{"title":"修正Hugo的JSON Feed格式","id":"https://liudon.com/posts/fix-hugo-json-feed/","url":"https://liudon.com/posts/fix-hugo-json-feed/","summary":"\u003ch4 id=\"问题背景\"\u003e问题背景\u003c/h4\u003e\n\u003cp\u003e前几天在\u003ca href=\"https://planetics.xyz/\"\u003ePlanet\u003c/a\u003e里follow自己的\u003ca href=\"https://liudon.eth\"\u003eweb3博客\u003c/a\u003e，遇到下面的错误。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/fix-hugo-json-feed/202303251415675.png_320x.avif 320w, https://liudon.com/posts/fix-hugo-json-feed/202303251415675.png_480x.avif 480w, https://liudon.com/posts/fix-hugo-json-feed/202303251415675.png_716x.avif 716w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/fix-hugo-json-feed/202303251415675.png_320x.webp 320w, https://liudon.com/posts/fix-hugo-json-feed/202303251415675.png_480x.webp 480w, https://liudon.com/posts/fix-hugo-json-feed/202303251415675.png_716x.webp 716w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/fix-hugo-json-feed/202303251415675.png\" alt=\"PlanetFeedError\"\n         width=\"716\" height=\"544\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e经过Livid大佬提醒，说是网站的JSON Feed不是标准格式导致的。\u003c/p\u003e\n\u003cp\u003e因为我的已经修正没法截图，这里以\u003ca href=\"https://dvel.me/index.json\"\u003edvel的博客\u003c/a\u003e举例，格式类似如下。\u003c/p\u003e","content_html":"\u003ch4 id=\"问题背景\"\u003e问题背景\u003c/h4\u003e\n\u003cp\u003e前几天在\u003ca href=\"https://planetics.xyz/\"\u003ePlanet\u003c/a\u003e里follow自己的\u003ca href=\"https://liudon.eth\"\u003eweb3博客\u003c/a\u003e，遇到下面的错误。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/fix-hugo-json-feed/202303251415675.png_320x.avif 320w, https://liudon.com/posts/fix-hugo-json-feed/202303251415675.png_480x.avif 480w, https://liudon.com/posts/fix-hugo-json-feed/202303251415675.png_716x.avif 716w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/fix-hugo-json-feed/202303251415675.png_320x.webp 320w, https://liudon.com/posts/fix-hugo-json-feed/202303251415675.png_480x.webp 480w, https://liudon.com/posts/fix-hugo-json-feed/202303251415675.png_716x.webp 716w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/fix-hugo-json-feed/202303251415675.png\" alt=\"PlanetFeedError\"\n         width=\"716\" height=\"544\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e经过Livid大佬提醒，说是网站的JSON Feed不是标准格式导致的。\u003c/p\u003e\n\u003cp\u003e因为我的已经修正没法截图，这里以\u003ca href=\"https://dvel.me/index.json\"\u003edvel的博客\u003c/a\u003e举例，格式类似如下。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u0026#34;content\u0026#34;: \u0026#34;用 ChatGPT 写一些小脚本真是太方便了。\\nGPT-4 发布后试了试，还是蛮不错的，代码是 ChatGPT 生成的。\\n几个来回就可以编写一个能正常使用的油猴脚本：\\n（略，HTML 代码） 在 https://chdbits.co/bakatest.php 有如上内容。 我要为这个网页编写一个油猴脚本。 通过自动获取 ChatGPT 的 API 来解析此问题的答案，供用户参考。 将内容输出到 `#outer \u0026amp;gt; h1` 的下面，同时输出你提取到的问题内容和答案，以便我看看你是否提取正确。 获取错啦。 问题的获取路径是 `#outer \u0026amp;gt; form \u0026amp;gt; table \u0026amp;gt; tbody \u0026amp;gt; tr:nth-child(1) \u0026amp;gt; td` 选项的获取路径是 `#outer \u0026amp;gt; form \u0026amp;gt; table \u0026amp;gt; tbody \u0026amp;gt; tr:nth-child(2) \u0026amp;gt; td` 使用这个 API： ``` curl https://api.openai.com/v1/chat/completions \\\\ -H \u0026amp;#39;Content-Type: application/json\u0026amp;#39; \\\\ -H \u0026amp;#39;Authorization: Bearer YOUR_API_KEY\u0026amp;#39; \\\\ -d \u0026amp;#39;{ \u0026amp;#34;model\u0026amp;#34;: \u0026amp;#34;gpt-3.5-turbo\u0026amp;#34;, \u0026amp;#34;messages\u0026amp;#34;: [{\u0026amp;#34;role\u0026amp;#34;: \u0026amp;#34;user\u0026amp;#34;, \u0026amp;#34;content\u0026amp;#34;: \u0026amp;#34;Say this is a test!\u0026amp;#34;}], \u0026amp;#34;temperature\u0026amp;#34;: 0.7 }\u0026amp;#39; ``` 响应格式为： ``` { \u0026amp;#34;id\u0026amp;#34;:\u0026amp;#34;chatcmpl-abc123\u0026amp;#34;, \u0026amp;#34;object\u0026amp;#34;:\u0026amp;#34;chat.completion\u0026amp;#34;, \u0026amp;#34;created\u0026amp;#34;:1677858242, \u0026amp;#34;model\u0026amp;#34;:\u0026amp;#34;gpt-3.5-turbo-0301\u0026amp;#34;, \u0026amp;#34;usage\u0026amp;#34;:{ \u0026amp;#34;prompt_tokens\u0026amp;#34;:13, \u0026amp;#34;completion_tokens\u0026amp;#34;:7, \u0026amp;#34;total_tokens\u0026amp;#34;:20 }, \u0026amp;#34;choices\u0026amp;#34;:[ { \u0026amp;#34;message\u0026amp;#34;:{ \u0026amp;#34;role\u0026amp;#34;:\u0026amp;#34;assistant\u0026amp;#34;, \u0026amp;#34;content\u0026amp;#34;:\u0026amp;#34;\\\\n\\\\nThis is a test!\u0026amp;#34; }, \u0026amp;#34;finish_reason\u0026amp;#34;:\u0026amp;#34;stop\u0026amp;#34;, \u0026amp;#34;index\u0026amp;#34;:0 } ] } ``` 它没有最近的互联网数据，所以还是需要把 API 的使用方式发给它。\\n然后它就帮我写好了，我不用复习 JavaScript，不用看油猴脚本的教程和文档，也不用查 @grant 等等标记是干嘛的。\\n可以再继续要求它改进一些，比如换个输出位置，优化 prompt，自动选中正确回答，支持单选题和多选题等等。\\n效果展示：\\n安装： https://greasyfork.org/zh-CN/scripts/461944-chd-quiz-answer\\n\u0026#34;,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u0026#34;permalink\u0026#34;: \u0026#34;https://dvel.me/posts/chd-quiz-answer/\u0026#34;,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u0026#34;summary\u0026#34;: \u0026#34;用 ChatGPT 写一些小脚本真是太方便了。\\nGPT-4 发布后试了试，还是蛮不错的，代码是 ChatGPT 生成的。\\n几个来回就可以编写一个能正常使用的油猴脚本：\\n（略，HTML 代码） 在 https://chdbits.co/bakatest.php 有如上内容。 我要为这个网页编写一个油猴脚本。 通过自动获取 ChatGPT 的 API 来解析此问题的答案，供用户参考。 将内容输出到 `#outer \u0026amp;gt; h1` 的下面，同时输出你提取到的问题内容和答案，以便我看看你是否提取正确。 获取错啦。 问题的获取路径是 `#outer \u0026amp;gt; form \u0026amp;gt; table \u0026amp;gt; tbody \u0026amp;gt; tr:nth-child(1) \u0026amp;gt; td` 选项的获取路径是 `#outer \u0026amp;gt; form \u0026amp;gt; table \u0026amp;gt; tbody \u0026amp;gt; tr:nth-child(2) \u0026amp;gt; td` 使用这个 API： ``` curl https://api.openai.com/v1/chat/completions \\\\ -H \u0026amp;#39;Content-Type: application/json\u0026amp;#39; \\\\ -H \u0026amp;#39;Authorization: Bearer YOUR_API_KEY\u0026amp;#39; \\\\ -d \u0026amp;#39;{ \u0026amp;#34;model\u0026amp;#34;: \u0026amp;#34;gpt-3.5-turbo\u0026amp;#34;, \u0026amp;#34;messages\u0026amp;#34;: [{\u0026amp;#34;role\u0026amp;#34;: \u0026amp;#34;user\u0026amp;#34;, \u0026amp;#34;content\u0026amp;#34;: \u0026amp;#34;Say this is a test!\u0026#34;,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u0026#34;title\u0026#34;: \u0026#34;CHD 油猴脚本：每日签到自动答题\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  },\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e下面是一个\u003ccode\u003eJSON Feed\u003c/code\u003e的示例，详细规范见\u003ca href=\"https://www.jsonfeed.org/\"\u003ejsonfeed.org\u003c/a\u003e。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u0026#34;version\u0026#34;: \u0026#34;https://jsonfeed.org/version/1.1\u0026#34;,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u0026#34;title\u0026#34;: \u0026#34;My Example Feed\u0026#34;,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u0026#34;home_page_url\u0026#34;: \u0026#34;https://example.org/\u0026#34;,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u0026#34;feed_url\u0026#34;: \u0026#34;https://example.org/feed.json\u0026#34;,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u0026#34;items\u0026#34;: [\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u0026#34;id\u0026#34;: \u0026#34;2\u0026#34;,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u0026#34;content_text\u0026#34;: \u0026#34;This is a second item.\u0026#34;,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u0026#34;url\u0026#34;: \u0026#34;https://example.org/second-item\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        },\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u0026#34;id\u0026#34;: \u0026#34;1\u0026#34;,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u0026#34;content_html\u0026#34;: \u0026#34;\u0026lt;p\u0026gt;Hello, world!\u0026lt;/p\u0026gt;\u0026#34;,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u0026#34;url\u0026#34;: \u0026#34;https://example.org/initial-post\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    ]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"修复方案\"\u003e修复方案\u003c/h4\u003e\n\u003col\u003e\n\u003cli\u003e添加自定义\u003ccode\u003ejsonfeed\u003c/code\u003e模版文件，路径为\u003ccode\u003elayouts/_default/index.jsonfeed.json\u003c/code\u003e。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e文件内容如下：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{{- $pctx := . -}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{{- if .IsHome -}}{{ $pctx = site }}{{- end -}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{{- $pages := slice -}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{{- if or $.IsHome $.IsSection -}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{{- $pages = $pctx.RegularPages -}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{{- else -}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{{- $pages = $pctx.Pages -}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{{- end -}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{{- $limit := site.Config.Services.RSS.Limit -}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{{- if ge $limit 1 -}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{{- $pages = $pages | first $limit -}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{{- end -}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{{- $title := \u0026#34;\u0026#34; }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{{- if eq .Title .Site.Title }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{{- $title = .Site.Title }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{{- else }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{{- with .Title }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{{- $title = print . \u0026#34; on \u0026#34;}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{{- end }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{{- $title = print $title .Site.Title }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{{- end }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u0026#34;version\u0026#34;: \u0026#34;https://jsonfeed.org/version/1.1\u0026#34;,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u0026#34;title\u0026#34;: {{ $title | jsonify }},\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u0026#34;home_page_url\u0026#34;: {{ .Permalink | jsonify }},\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {{- with  .OutputFormats.Get \u0026#34;jsonfeed\u0026#34; }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u0026#34;feed_url\u0026#34;: {{ .Permalink | jsonify  }},\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {{- end }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {{- if (or .Site.Params.author .Site.Params.author_url) }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u0026#34;authors\u0026#34;: [{\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      {{- if .Site.Params.author }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u0026#34;name\u0026#34;: {{ .Site.Params.author | jsonify }},\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      {{- end }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      {{- if .Site.Params.author_url }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u0026#34;url\u0026#34;: {{ .Site.Params.author_url | jsonify }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      {{- end }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    }],\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {{- end }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {{- if $pages }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u0026#34;items\u0026#34;: [\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        {{- range $index, $element := $pages }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        {{- with $element }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        {{- if $index }},{{end}} {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u0026#34;title\u0026#34;: {{ .Title | jsonify }},\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u0026#34;id\u0026#34;: {{ .Permalink | jsonify }},\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u0026#34;url\u0026#34;: {{ .Permalink | jsonify }},\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            {{- if .Site.Params.showFullTextinJSONFeed }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u0026#34;summary\u0026#34;: {{ with .Description }}{{ . | jsonify }}{{ else }}{{ .Summary | jsonify }}{{ end -}},\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u0026#34;content_html\u0026#34;: {{ .Content | jsonify }},\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            {{- else }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u0026#34;content_text\u0026#34;: {{ with .Description }}{{ . | jsonify }}{{ else }}{{ .Summary | jsonify }}{{ end -}},\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            {{- end }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            {{- if .Params.cover.image }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            {{- $cover := (.Resources.ByType \u0026#34;image\u0026#34;).GetMatch (printf \u0026#34;*%s*\u0026#34; (.Params.cover.image)) }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            {{- if $cover }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u0026#34;image\u0026#34;: {{ (path.Join .RelPermalink $cover) | absURL | jsonify }},\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            {{- end }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            {{- end }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u0026#34;date_published\u0026#34;: {{ .Date.Format \u0026#34;2006-01-02T15:04:05Z07:00\u0026#34; | jsonify }},\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            {{- $tags := slice -}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            {{ with .Params.tags }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            {{ range . }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            {{ $tags = $tags | append (. | jsonify) }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            {{end}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            {{end}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u0026#34;tags\u0026#34;: [{{ delimit $tags \u0026#34;, \u0026#34; }}]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        {{- end }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        {{- end }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    ]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {{ end }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"2\"\u003e\n\u003cli\u003e开启\u003ccode\u003eJSON Feed\u003c/code\u003e。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e配置文件调整如下：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eoutputFormats:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  jsonfeed: # 添加jsonfeed输出格式\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    mediaType: application/feed+json\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    baseName: feed\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    rel: alternate\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    isPlainText: true\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eoutputs:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    home:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        - HTML\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        - RSS\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        - json # fusejs搜索依赖index.json，不要漏掉这个配置\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        - jsonfeed # 开启jsonfeed\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eparams:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    ...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    showFullTextinJSONFeed: true # jsonfeed开启全文输出\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e参考资料：\u003ca href=\"https://foosel.net/til/how-to-add-json-feed-support-to-hugo/\"\u003eHow to add JSON Feed support to Hugo\u003c/a\u003e\u003c/p\u003e\n","date_published":"2023-03-25T14:11:18+08:00","tags":["hugo"]},{"title":"我的学车之路","id":"https://liudon.com/posts/my-journey-of-learning-to-drive/","url":"https://liudon.com/posts/my-journey-of-learning-to-drive/","summary":"\u003cp\u003e之前在\u003ca href=\"https://liudon.com/posts/review-2022/\"\u003e2022年终总结\u003c/a\u003e提到过，我在练车考驾照。\u003c/p\u003e\n\u003cp\u003e就在昨天，终于拿证了。👏👏👏\u003c/p\u003e\n\u003cp\u003e咱也是可以上路开车的人了，虽然比别人晚了快10年才拿证。🐶\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2022年6月11日，在海淀驾校报名，周末连续班，报名费5380元。\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2022年10月12日，科目一考试通过。\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2022年10月22日，科目二模拟驾驶。\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2022年11月13日，科目二第一次上车练习。\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2022年11月24日，疫情严重，驾校发通知，自11月25日暂停培训。\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2023年2月4日，年后驾校恢复培训，继续科目二练车。\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2023年2月13日，科目二考试通过。\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2023年3月11日，科目三上路练习。\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2023年3月23日，上午科目三考试通过，下午科目四考试通过。\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e考试的时候，早上遇到临时交通管制，一直到9点40才开考。\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e考完回来，班车上的人说又管制不能考了。\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e班车拉回驾校，剩下的人中午加班考试。\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e终于不用再5点半起床赶班车了。🥱\u003c/p\u003e","content_html":"\u003cp\u003e之前在\u003ca href=\"https://liudon.com/posts/review-2022/\"\u003e2022年终总结\u003c/a\u003e提到过，我在练车考驾照。\u003c/p\u003e\n\u003cp\u003e就在昨天，终于拿证了。👏👏👏\u003c/p\u003e\n\u003cp\u003e咱也是可以上路开车的人了，虽然比别人晚了快10年才拿证。🐶\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2022年6月11日，在海淀驾校报名，周末连续班，报名费5380元。\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2022年10月12日，科目一考试通过。\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2022年10月22日，科目二模拟驾驶。\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2022年11月13日，科目二第一次上车练习。\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2022年11月24日，疫情严重，驾校发通知，自11月25日暂停培训。\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2023年2月4日，年后驾校恢复培训，继续科目二练车。\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2023年2月13日，科目二考试通过。\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2023年3月11日，科目三上路练习。\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2023年3月23日，上午科目三考试通过，下午科目四考试通过。\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e考试的时候，早上遇到临时交通管制，一直到9点40才开考。\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e考完回来，班车上的人说又管制不能考了。\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e班车拉回驾校，剩下的人中午加班考试。\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e终于不用再5点半起床赶班车了。🥱\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/my-journey-of-learning-to-drive/202303242116962.jpeg_320x.avif 320w, https://liudon.com/posts/my-journey-of-learning-to-drive/202303242116962.jpeg_480x.avif 480w, https://liudon.com/posts/my-journey-of-learning-to-drive/202303242116962.jpeg_720x.avif 720w, https://liudon.com/posts/my-journey-of-learning-to-drive/202303242116962.jpeg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/my-journey-of-learning-to-drive/202303242116962.jpeg_320x.webp 320w, https://liudon.com/posts/my-journey-of-learning-to-drive/202303242116962.jpeg_480x.webp 480w, https://liudon.com/posts/my-journey-of-learning-to-drive/202303242116962.jpeg_720x.webp 720w, https://liudon.com/posts/my-journey-of-learning-to-drive/202303242116962.jpeg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/my-journey-of-learning-to-drive/202303242116962.jpeg\" alt=\"本本到手啦\"\n         width=\"1080\" height=\"1441\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n","date_published":"2023-03-24T20:48:24+08:00","tags":["个人技能"]},{"title":"将博客部署到星际文件系统(IPFS)","id":"https://liudon.com/posts/deploy-blog-to-ipfs/","url":"https://liudon.com/posts/deploy-blog-to-ipfs/","summary":"\u003cp\u003e在这篇文章，我将会介绍如何利用\u003ccode\u003eGithub Actions\u003c/code\u003e将\u003ccode\u003ehugo\u003c/code\u003e博客自动部署到\u003ccode\u003eIPFS\u003c/code\u003e上，并通过自定义域名访问\u003ccode\u003eIPFS\u003c/code\u003e上的文件。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIPFS（InterPlanetary File System）中文称为星际文件系统，是一个旨在实现文件的分布式存储、共享和持久化的网络传输协议。\u003c/p\u003e","content_html":"\u003cp\u003e在这篇文章，我将会介绍如何利用\u003ccode\u003eGithub Actions\u003c/code\u003e将\u003ccode\u003ehugo\u003c/code\u003e博客自动部署到\u003ccode\u003eIPFS\u003c/code\u003e上，并通过自定义域名访问\u003ccode\u003eIPFS\u003c/code\u003e上的文件。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIPFS（InterPlanetary File System）中文称为星际文件系统，是一个旨在实现文件的分布式存储、共享和持久化的网络传输协议。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e照惯例,先上演示.\u003ca href=\"https://liudon.xyz\"\u003e访问我的IPFS博客\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e欢迎各位pin我的博客， \u003ccode\u003eipfs pin add /ipns/liudon.xyz\u003c/code\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ecurl\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;https://liudon.xyz\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eI\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eHTTP\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"mi\"\u003e2\u003c/span\u003e \u003cspan class=\"mi\"\u003e200\u003c/span\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eTue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e21\u003c/span\u003e \u003cspan class=\"n\"\u003eFeb\u003c/span\u003e \u003cspan class=\"mi\"\u003e2023\u003c/span\u003e \u003cspan class=\"mi\"\u003e23\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"mi\"\u003e59\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"mi\"\u003e18\u003c/span\u003e \u003cspan class=\"n\"\u003eGMT\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003econtent\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003etype\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003etext\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003ehtml\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003evary\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eAccept\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eEncoding\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eaccess\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003econtrol\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eallow\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003emethods\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eGET\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eaccess\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003econtrol\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eallow\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003emethods\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eGET\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ePOST\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eOPTIONS\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003elast\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003emodified\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eTue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e21\u003c/span\u003e \u003cspan class=\"n\"\u003eFeb\u003c/span\u003e \u003cspan class=\"mi\"\u003e2023\u003c/span\u003e \u003cspan class=\"mi\"\u003e23\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"mi\"\u003e59\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"mi\"\u003e18\u003c/span\u003e \u003cspan class=\"n\"\u003eGMT\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ex\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eipfs\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003egateway\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ehost\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eipfs\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ebank1\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003esv15\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ex\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eipfs\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003epath\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eipns\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eliudon\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003exyz\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ex\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eipfs\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eroots\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eQmd4pnpUj8CaLKoVMJNHJyrqwWVa4wvz1qKxZsU9vKgErL\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ex\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eipfs\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003epop\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eipfs\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ebank1\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003esv15\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003etiming\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eallow\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eorigin\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eaccess\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003econtrol\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eallow\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eorigin\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eaccess\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003econtrol\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eallow\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eheaders\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eX\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eRequested\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eWith\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"ne\"\u003eRange\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eContent\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"ne\"\u003eRange\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eX\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eChunked\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eOutput\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eX\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eStream\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eOutput\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eaccess\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003econtrol\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eexpose\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eheaders\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eContent\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"ne\"\u003eRange\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eX\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eChunked\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eOutput\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eX\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eStream\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eOutput\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ex\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eipfs\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003elb\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003epop\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003egateway\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ebank1\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003esv15\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ex\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eproxy\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ecache\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eMISS\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ecf\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ecache\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003estatus\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eDYNAMIC\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ereport\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eto\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;endpoints\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:[{\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;url\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;https:\\/\\/a.nel.cloudflare.com\\/report\\/v3?s=FLcvWgtngoLuGZkl9jYsviSoOlSoE2Y0rKxI3bgNaKRxhNOrIm6nozqVzndav3%2B9QrvvcJ5GNmC11JBlN8tiigbF9CWPW33TbnLKyfdeblOcEhmZINTcC%2BJ6xhKs\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e}],\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;group\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;cf-nel\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;max_age\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"mi\"\u003e604800\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003enel\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;success_fraction\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;report_to\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;cf-nel\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;max_age\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"mi\"\u003e604800\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eserver\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003ecloudflare\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ecf\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eray\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e79\u003c/span\u003e\u003cspan class=\"n\"\u003ed36f598970531f\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eLAX\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ealt\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003esvc\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eh3\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;:443\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"n\"\u003ema\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"mi\"\u003e86400\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eh3\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e29\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;:443\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"n\"\u003ema\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"mi\"\u003e86400\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"准备工作\"\u003e准备工作:\u003c/h4\u003e\n\u003col\u003e\n\u003cli\u003eCloudflare帐号\u003c/li\u003e\n\u003cli\u003e一台VPS主机,我用到腾讯云lighthouse主机2核2G\u003c/li\u003e\n\u003cli\u003e一个域名\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch4 id=\"方案介绍\"\u003e方案介绍:\u003c/h4\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/deploy-blog-to-ipfs/deploy-blog-to-ipfs.png_320x.avif 320w, https://liudon.com/posts/deploy-blog-to-ipfs/deploy-blog-to-ipfs.png_480x.avif 480w, https://liudon.com/posts/deploy-blog-to-ipfs/deploy-blog-to-ipfs.png_720x.avif 720w, https://liudon.com/posts/deploy-blog-to-ipfs/deploy-blog-to-ipfs.png_800x.avif 800w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/deploy-blog-to-ipfs/deploy-blog-to-ipfs.png_320x.webp 320w, https://liudon.com/posts/deploy-blog-to-ipfs/deploy-blog-to-ipfs.png_480x.webp 480w, https://liudon.com/posts/deploy-blog-to-ipfs/deploy-blog-to-ipfs.png_720x.webp 720w, https://liudon.com/posts/deploy-blog-to-ipfs/deploy-blog-to-ipfs.png_800x.webp 800w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/deploy-blog-to-ipfs/deploy-blog-to-ipfs.png\" alt=\"实现方案\"\n         width=\"800\" height=\"390\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e在VPS主机上安装启动IPFS服务,通过端口5001在内网提供API服务.\u003c/li\u003e\n\u003cli\u003e在GitHub上通过ssh建立端口转发,本地端口5001转发到VPS主机5001.\u003c/li\u003e\n\u003cli\u003e在GitHub上利用ipfs-http-client上传文进到5001端口.\u003c/li\u003e\n\u003cli\u003e绑定域名到IPNS地址,通过域名访问IPFS文件.\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch4 id=\"1-部署ipfs服务\"\u003e1. 部署IPFS服务\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e安装kubo,详见\u003ca href=\"https://docs.ipfs.tech/install/command-line/#install-official-binary-distributions\"\u003e官方文档\u003c/a\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ewget https://dist.ipfs.tech/kubo/v0.18.1/kubo_v0.18.1_linux-amd64.tar.gz\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etar -xvzf kubo_v0.18.1_linux-amd64.tar.gz\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026gt; x kubo/install.sh\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026gt; x kubo/ipfs\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026gt; x kubo/LICENSE\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026gt; x kubo/LICENSE-APACHE\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026gt; x kubo/LICENSE-MIT\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026gt; x kubo/README.md\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecd kubo\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esudo bash install.sh\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026gt; Moved ./ipfs to /usr/local/bin\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eipfs --version\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026gt; ipfs version 0.18.1\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e初始化IPFS\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eipfs init --profile=server\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e添加到开机启动\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[Unit]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eDescription=IPFS Daemon\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAfter=syslog.target network.target remote-fs.target nss-lookup.target\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[Service]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eType=simple\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eExecStart=/usr/local/bin/ipfs daemon --enable-namesys-pubsub\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUser=root\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[Install]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eWantedBy=multi-user.target\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e注意打开\u003ccode\u003e--enable-namesys-pubsub\u003c/code\u003e参数，不然IPNS更新生效很慢。\u003c/p\u003e\n\u003cp\u003e将上述代码保存到\u003ccode\u003e/usr/lib/systemd/system/ipfs.service\u003c/code\u003e文件.\u003c/p\u003e\n\u003cp\u003e启动进程.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003esystemctl start ipfs.service\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e开放端口\u003c/p\u003e\n\u003cp\u003eIPFS默认通过4001端口跟DHT网络通信,需要放开4001端口访问.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"2-github-actions配置\"\u003e2. GitHub Actions配置\u003c/h4\u003e\n\u003cp\u003e博客我使用的\u003ccode\u003eHugo\u003c/code\u003e，原有的工作流方案见\u003ca href=\"https://liudon.com/posts/deploy-blog-to-cloudflare-pages/\"\u003e将博客部署到Cloudflare Pages\u003c/a\u003e。\u003c/p\u003e\n\u003cp\u003e完整的工作流配置见\u003ca href=\"%E5%AE%8C%E6%95%B4%E9%85%8D%E7%BD%AE%E5%8F%AF%E5%8F%82%E8%80%83%5Bmain.yml%5D(https://github.com/Liudon/liudon.github.io/blob/code/.github/workflows/main.yml)\"\u003emain.yml\u003c/a\u003e。\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e添加如下变量到Actions secrets\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSSHKEY VPS主机ssh登陆私钥\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSSHHOST ssh用户@VPS机器IP,类似root@127.0.0.1\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e更新yaml配置文件,添加如下任务.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e   \u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eConnect\u003c/span\u003e \u003cspan class=\"n\"\u003eto\u003c/span\u003e \u003cspan class=\"n\"\u003essh\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003eBG\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003etimeout\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eminutes\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"n\"\u003eecho\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;${{ secrets.SSHKEY }}\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e../\u003c/span\u003e\u003cspan class=\"n\"\u003eprivkey\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"n\"\u003echmod\u003c/span\u003e \u003cspan class=\"mi\"\u003e600\u003c/span\u003e \u003cspan class=\"o\"\u003e../\u003c/span\u003e\u003cspan class=\"n\"\u003eprivkey\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"n\"\u003essh\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eo\u003c/span\u003e \u003cspan class=\"n\"\u003eStrictHostKeyChecking\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"n\"\u003eno\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"n\"\u003esecrets\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eSSHHOST\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e../\u003c/span\u003e\u003cspan class=\"n\"\u003eprivkey\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eL\u003c/span\u003e \u003cspan class=\"mi\"\u003e5001\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"n\"\u003elocalhost\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"mi\"\u003e5001\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003efTN\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eipfs\u003c/span\u003e \u003cspan class=\"n\"\u003eupload\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003euses\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eaquiladev\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003eipfs\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eaction\u003c/span\u003e\u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003emaster\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003edeploy\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003etimeout\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eminutes\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003ewith\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"n\"\u003epath\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"o\"\u003e./\u003c/span\u003e\u003cspan class=\"n\"\u003epublic\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"n\"\u003eservice\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eipfs\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"n\"\u003everbose\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"bp\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"n\"\u003ehost\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003elocalhost\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"n\"\u003eport\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"mi\"\u003e5001\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"n\"\u003eprotocol\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003ehttp\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"n\"\u003ekey\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"bp\"\u003eself\u003c/span\u003e \u003cspan class=\"c1\"\u003e# 要配置key,这样才会生成IPNS地址\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e测试执行action,\u003ca href=\"https://github.com/Liudon/liudon.github.io/actions/runs/4230563492/jobs/7348031553\"\u003e日志\u003c/a\u003e里会有类似如下输出.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eUpload\u003c/span\u003e \u003cspan class=\"n\"\u003eto\u003c/span\u003e \u003cspan class=\"n\"\u003eIPFS\u003c/span\u003e \u003cspan class=\"n\"\u003efinished\u003c/span\u003e \u003cspan class=\"n\"\u003esuccessfully\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003ecid\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;QmST2Zqv8qffFTVuqfRX57uzqxsoQtTYinmHpyLh7padAD\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eipfs\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;QmST2Zqv8qffFTVuqfRX57uzqxsoQtTYinmHpyLh7padAD\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eipns\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;12D3KooWKvJ9Y4D5X4R3ajuc7tVtQWXZMG4iiMCFtay8frM66o4c\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e每次执行,ipfs地址不同,ipns地址不变.\n记住这里到ipns地址,下面会用到.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"3-域名配置\"\u003e3. 域名配置\u003c/h4\u003e\n\u003cp\u003e在\u003ccode\u003eCloudflare\u003c/code\u003e上添加解析:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e添加DNS TXT记录,名称为\u003ccode\u003e_dnslink\u003c/code\u003e，值为\u003ccode\u003ednslink=/ipns/12D3KooWKvJ9Y4D5X4R3ajuc7tVtQWXZMG4iiMCFtay8frM66o4c\u003c/code\u003e，将这里的\u003ccode\u003e12D3KooWKvJ9Y4D5X4R3ajuc7tVtQWXZMG4iiMCFtay8frM66o4c\u003c/code\u003e改为上一步日志里到ipns值。\u003c/li\u003e\n\u003cli\u003e添加DNS CNNANE记录,名称为\u003ccode\u003e你的域名\u003c/code\u003e，值为\u003ccode\u003egateway.ipfs.io\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/deploy-blog-to-ipfs/dns-record.png_320x.avif 320w, https://liudon.com/posts/deploy-blog-to-ipfs/dns-record.png_480x.avif 480w, https://liudon.com/posts/deploy-blog-to-ipfs/dns-record.png_720x.avif 720w, https://liudon.com/posts/deploy-blog-to-ipfs/dns-record.png_800x.avif 800w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/deploy-blog-to-ipfs/dns-record.png_320x.webp 320w, https://liudon.com/posts/deploy-blog-to-ipfs/dns-record.png_480x.webp 480w, https://liudon.com/posts/deploy-blog-to-ipfs/dns-record.png_720x.webp 720w, https://liudon.com/posts/deploy-blog-to-ipfs/dns-record.png_800x.webp 800w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/deploy-blog-to-ipfs/dns-record.png\" alt=\"DNS解析\"\n         width=\"800\" height=\"76\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003ch4 id=\"4-开启相对路径\"\u003e4. 开启相对路径\u003c/h4\u003e\n\u003cp\u003e经\u003ca href=\"https://github.com/livid\"\u003eLivid大佬\u003c/a\u003e提醒，\u003ca href=\"https://zu1k.com/posts/tutorials/p2p/ipfs-easy-use/\"\u003e公共网关访问时存在相对路径问题\u003c/a\u003e。\u003c/p\u003e\n\u003cp\u003e我用的\u003ccode\u003eHugo\u003c/code\u003e，配置文件里打开\u003ccode\u003erelativeURLs\u003c/code\u003e配置。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003erelativeURLs: true\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e从年前开始想怎么做成自动化,到今天终于跑通搞定了.😁😁😁\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/deploy-blog-to-ipfs/20230222080123.png_320x.avif 320w, https://liudon.com/posts/deploy-blog-to-ipfs/20230222080123.png_480x.avif 480w, https://liudon.com/posts/deploy-blog-to-ipfs/20230222080123.png_720x.avif 720w, https://liudon.com/posts/deploy-blog-to-ipfs/20230222080123.png_800x.avif 800w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/deploy-blog-to-ipfs/20230222080123.png_320x.webp 320w, https://liudon.com/posts/deploy-blog-to-ipfs/20230222080123.png_480x.webp 480w, https://liudon.com/posts/deploy-blog-to-ipfs/20230222080123.png_720x.webp 720w, https://liudon.com/posts/deploy-blog-to-ipfs/20230222080123.png_800x.webp 800w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/deploy-blog-to-ipfs/20230222080123.png\" alt=\"VPS主机运行情况\"\n         width=\"800\" height=\"994\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e两天跑了14G流量,每月的流量资源包基本够用了.\u003c/p\u003e\n\u003cp\u003e参考资料：\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://zu1k.com/posts/tutorials/p2p/ipfs-easy-use/\"\u003eIPFS 日用优化指南\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/UnifiedPush/documentation/blob/karmanyaahm-patch-3/config.toml\"\u003e参考配置\u003c/a\u003e\u003c/p\u003e\n","image":"https://liudon.com/posts/deploy-blog-to-ipfs/20230222122431.png","date_published":"2023-02-21T19:46:58+08:00","tags":["hugo","ipfs","github","cloudflare"]},{"title":"新冠疫情后的第一个春节","id":"https://liudon.com/posts/the-first-chinese-new-year-after-the-covid-19/","url":"https://liudon.com/posts/the-first-chinese-new-year-after-the-covid-19/","summary":"\u003cblockquote\u003e\n\u003cp\u003e下面的内容是由chatGPT润色生成的。\u003c/p\u003e\n\u003cp\u003eAI太强大了 😂\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e当我还是个孩子的时候，在看春节晚会时，总会有节目介绍那些不能回家过年的人。\u003c/p\u003e\n\u003cp\u003e但我从未想过，等我长大后，我也会成为其中的一员。\u003c/p\u003e","content_html":"\u003cblockquote\u003e\n\u003cp\u003e下面的内容是由chatGPT润色生成的。\u003c/p\u003e\n\u003cp\u003eAI太强大了 😂\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e当我还是个孩子的时候，在看春节晚会时，总会有节目介绍那些不能回家过年的人。\u003c/p\u003e\n\u003cp\u003e但我从未想过，等我长大后，我也会成为其中的一员。\u003c/p\u003e\n\u003cp\u003e由于疫情的影响，我已经连续三年不能回家过年了。\u003c/p\u003e\n\u003cp\u003e每次我告诉父母我无法回家，他们总是表现得非常平静，但我不知道他们挂了电话后的心情会如何。\u003c/p\u003e\n\u003cp\u003e直到今年，我们全家都经历了一次感染，但这也使我们有了机会在这个特殊的春节回家过年。\u003c/p\u003e\n\u003cp\u003e提前请了假，带娃体验下老家的生活。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-first-chinese-new-year-after-the-covid-19/20230216210359.jpg_320x.avif 320w, https://liudon.com/posts/the-first-chinese-new-year-after-the-covid-19/20230216210359.jpg_480x.avif 480w, https://liudon.com/posts/the-first-chinese-new-year-after-the-covid-19/20230216210359.jpg_720x.avif 720w, https://liudon.com/posts/the-first-chinese-new-year-after-the-covid-19/20230216210359.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-first-chinese-new-year-after-the-covid-19/20230216210359.jpg_320x.webp 320w, https://liudon.com/posts/the-first-chinese-new-year-after-the-covid-19/20230216210359.jpg_480x.webp 480w, https://liudon.com/posts/the-first-chinese-new-year-after-the-covid-19/20230216210359.jpg_720x.webp 720w, https://liudon.com/posts/the-first-chinese-new-year-after-the-covid-19/20230216210359.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-first-chinese-new-year-after-the-covid-19/20230216210359.jpg\" alt=\"回家\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e回家啦。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-first-chinese-new-year-after-the-covid-19/20230216210413.jpg_320x.avif 320w, https://liudon.com/posts/the-first-chinese-new-year-after-the-covid-19/20230216210413.jpg_480x.avif 480w, https://liudon.com/posts/the-first-chinese-new-year-after-the-covid-19/20230216210413.jpg_720x.avif 720w, https://liudon.com/posts/the-first-chinese-new-year-after-the-covid-19/20230216210413.jpg_800x.avif 800w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-first-chinese-new-year-after-the-covid-19/20230216210413.jpg_320x.webp 320w, https://liudon.com/posts/the-first-chinese-new-year-after-the-covid-19/20230216210413.jpg_480x.webp 480w, https://liudon.com/posts/the-first-chinese-new-year-after-the-covid-19/20230216210413.jpg_720x.webp 720w, https://liudon.com/posts/the-first-chinese-new-year-after-the-covid-19/20230216210413.jpg_800x.webp 800w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-first-chinese-new-year-after-the-covid-19/20230216210413.jpg\" alt=\"赶集\"\n         width=\"800\" height=\"800\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e赶大集。\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"20230216210442.jpg\" alt=\"烧火\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/p\u003e\n\u003cp\u003e烧火。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-first-chinese-new-year-after-the-covid-19/20230216210418.jpg_320x.avif 320w, https://liudon.com/posts/the-first-chinese-new-year-after-the-covid-19/20230216210418.jpg_480x.avif 480w, https://liudon.com/posts/the-first-chinese-new-year-after-the-covid-19/20230216210418.jpg_720x.avif 720w, https://liudon.com/posts/the-first-chinese-new-year-after-the-covid-19/20230216210418.jpg_800x.avif 800w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-first-chinese-new-year-after-the-covid-19/20230216210418.jpg_320x.webp 320w, https://liudon.com/posts/the-first-chinese-new-year-after-the-covid-19/20230216210418.jpg_480x.webp 480w, https://liudon.com/posts/the-first-chinese-new-year-after-the-covid-19/20230216210418.jpg_720x.webp 720w, https://liudon.com/posts/the-first-chinese-new-year-after-the-covid-19/20230216210418.jpg_800x.webp 800w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-first-chinese-new-year-after-the-covid-19/20230216210418.jpg\" alt=\"放烟花\"\n         width=\"800\" height=\"1200\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e放烟花。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-first-chinese-new-year-after-the-covid-19/20230216210424.jpg_320x.avif 320w, https://liudon.com/posts/the-first-chinese-new-year-after-the-covid-19/20230216210424.jpg_480x.avif 480w, https://liudon.com/posts/the-first-chinese-new-year-after-the-covid-19/20230216210424.jpg_720x.avif 720w, https://liudon.com/posts/the-first-chinese-new-year-after-the-covid-19/20230216210424.jpg_800x.avif 800w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-first-chinese-new-year-after-the-covid-19/20230216210424.jpg_320x.webp 320w, https://liudon.com/posts/the-first-chinese-new-year-after-the-covid-19/20230216210424.jpg_480x.webp 480w, https://liudon.com/posts/the-first-chinese-new-year-after-the-covid-19/20230216210424.jpg_720x.webp 720w, https://liudon.com/posts/the-first-chinese-new-year-after-the-covid-19/20230216210424.jpg_800x.webp 800w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-first-chinese-new-year-after-the-covid-19/20230216210424.jpg\" alt=\"抓鸟\"\n         width=\"800\" height=\"1067\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e抓鸟。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-first-chinese-new-year-after-the-covid-19/20230216210436.jpg_320x.avif 320w, https://liudon.com/posts/the-first-chinese-new-year-after-the-covid-19/20230216210436.jpg_480x.avif 480w, https://liudon.com/posts/the-first-chinese-new-year-after-the-covid-19/20230216210436.jpg_720x.avif 720w, https://liudon.com/posts/the-first-chinese-new-year-after-the-covid-19/20230216210436.jpg_800x.avif 800w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-first-chinese-new-year-after-the-covid-19/20230216210436.jpg_320x.webp 320w, https://liudon.com/posts/the-first-chinese-new-year-after-the-covid-19/20230216210436.jpg_480x.webp 480w, https://liudon.com/posts/the-first-chinese-new-year-after-the-covid-19/20230216210436.jpg_720x.webp 720w, https://liudon.com/posts/the-first-chinese-new-year-after-the-covid-19/20230216210436.jpg_800x.webp 800w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-first-chinese-new-year-after-the-covid-19/20230216210436.jpg\" alt=\"放孔明灯\"\n         width=\"800\" height=\"600\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e放孔明灯。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/the-first-chinese-new-year-after-the-covid-19/20230216210431.jpg_320x.avif 320w, https://liudon.com/posts/the-first-chinese-new-year-after-the-covid-19/20230216210431.jpg_480x.avif 480w, https://liudon.com/posts/the-first-chinese-new-year-after-the-covid-19/20230216210431.jpg_720x.avif 720w, https://liudon.com/posts/the-first-chinese-new-year-after-the-covid-19/20230216210431.jpg_800x.avif 800w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/the-first-chinese-new-year-after-the-covid-19/20230216210431.jpg_320x.webp 320w, https://liudon.com/posts/the-first-chinese-new-year-after-the-covid-19/20230216210431.jpg_480x.webp 480w, https://liudon.com/posts/the-first-chinese-new-year-after-the-covid-19/20230216210431.jpg_720x.webp 720w, https://liudon.com/posts/the-first-chinese-new-year-after-the-covid-19/20230216210431.jpg_800x.webp 800w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/the-first-chinese-new-year-after-the-covid-19/20230216210431.jpg\" alt=\"蹭饭\"\n         width=\"800\" height=\"1067\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e邻居家蹭饭。\u003c/p\u003e\n","date_published":"2023-02-16T20:56:38+08:00","tags":[]},{"title":"第一次清理键盘","id":"https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/","url":"https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/","summary":"\u003cp\u003e19年生日的时候，媳妇送了一款flico的机械键盘。\u003c/p\u003e\n\u003cp\u003e这次搬家后，想着年前清理下键盘，实在是太脏了。\u003c/p\u003e\n\u003cp\u003e周五下班，带上键盘回家。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450523.jpeg_320x.avif 320w, https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450523.jpeg_480x.avif 480w, https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450523.jpeg_720x.avif 720w, https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450523.jpeg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450523.jpeg_320x.webp 320w, https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450523.jpeg_480x.webp 480w, https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450523.jpeg_720x.webp 720w, https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450523.jpeg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/cleaning-the-keyboard-for-the-first-time/202301161450523.jpeg\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e","content_html":"\u003cp\u003e19年生日的时候，媳妇送了一款flico的机械键盘。\u003c/p\u003e\n\u003cp\u003e这次搬家后，想着年前清理下键盘，实在是太脏了。\u003c/p\u003e\n\u003cp\u003e周五下班，带上键盘回家。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450523.jpeg_320x.avif 320w, https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450523.jpeg_480x.avif 480w, https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450523.jpeg_720x.avif 720w, https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450523.jpeg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450523.jpeg_320x.webp 320w, https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450523.jpeg_480x.webp 480w, https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450523.jpeg_720x.webp 720w, https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450523.jpeg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/cleaning-the-keyboard-for-the-first-time/202301161450523.jpeg\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e键盘全貌，上面好多油。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450514.jpeg_320x.avif 320w, https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450514.jpeg_480x.avif 480w, https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450514.jpeg_720x.avif 720w, https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450514.jpeg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450514.jpeg_320x.webp 320w, https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450514.jpeg_480x.webp 480w, https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450514.jpeg_720x.webp 720w, https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450514.jpeg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/cleaning-the-keyboard-for-the-first-time/202301161450514.jpeg\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e开拆。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450505.jpeg_320x.avif 320w, https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450505.jpeg_480x.avif 480w, https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450505.jpeg_720x.avif 720w, https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450505.jpeg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450505.jpeg_320x.webp 320w, https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450505.jpeg_480x.webp 480w, https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450505.jpeg_720x.webp 720w, https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450505.jpeg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/cleaning-the-keyboard-for-the-first-time/202301161450505.jpeg\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e手还是太慢，上工具吧。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450497.jpeg_320x.avif 320w, https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450497.jpeg_480x.avif 480w, https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450497.jpeg_720x.avif 720w, https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450497.jpeg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450497.jpeg_320x.webp 320w, https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450497.jpeg_480x.webp 480w, https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450497.jpeg_720x.webp 720w, https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450497.jpeg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/cleaning-the-keyboard-for-the-first-time/202301161450497.jpeg\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e全部拆完。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450488.jpeg_320x.avif 320w, https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450488.jpeg_480x.avif 480w, https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450488.jpeg_720x.avif 720w, https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450488.jpeg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450488.jpeg_320x.webp 320w, https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450488.jpeg_480x.webp 480w, https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450488.jpeg_720x.webp 720w, https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450488.jpeg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/cleaning-the-keyboard-for-the-first-time/202301161450488.jpeg\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e内部特写。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450480.jpeg_320x.avif 320w, https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450480.jpeg_480x.avif 480w, https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450480.jpeg_720x.avif 720w, https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450480.jpeg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450480.jpeg_320x.webp 320w, https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450480.jpeg_480x.webp 480w, https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450480.jpeg_720x.webp 720w, https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450480.jpeg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/cleaning-the-keyboard-for-the-first-time/202301161450480.jpeg\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e清理出来的灰屑、头发，这键盘见证了我的发迹线变化\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450468.jpeg_320x.avif 320w, https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450468.jpeg_480x.avif 480w, https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450468.jpeg_720x.avif 720w, https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450468.jpeg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450468.jpeg_320x.webp 320w, https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450468.jpeg_480x.webp 480w, https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450468.jpeg_720x.webp 720w, https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450468.jpeg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/cleaning-the-keyboard-for-the-first-time/202301161450468.jpeg\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e终于清理干净了。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450456.jpeg_320x.avif 320w, https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450456.jpeg_480x.avif 480w, https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450456.jpeg_720x.avif 720w, https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450456.jpeg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450456.jpeg_320x.webp 320w, https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450456.jpeg_480x.webp 480w, https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450456.jpeg_720x.webp 720w, https://liudon.com/posts/cleaning-the-keyboard-for-the-first-time/202301161450456.jpeg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/cleaning-the-keyboard-for-the-first-time/202301161450456.jpeg\" alt=\"\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e复原，又可以咔咔写代码了。\u003c/p\u003e\n","date_published":"2023-01-16T14:43:38+08:00","tags":["自己动手"]},{"title":"2022年终总结","id":"https://liudon.com/posts/review-2022/","url":"https://liudon.com/posts/review-2022/","summary":"\u003cp\u003e2022年已经过去1周多了，记录一下我的2022年。\u003c/p\u003e\n\u003ch4 id=\"疫情\"\u003e疫情\u003c/h4\u003e\n\u003cp\u003e2022年，是新冠疫情的第三年，也是切身感受到的一年。\u003c/p\u003e\n\u003cp\u003e3月22日晚，8点半和同事刚上13号线地铁。\u003c/p\u003e","content_html":"\u003cp\u003e2022年已经过去1周多了，记录一下我的2022年。\u003c/p\u003e\n\u003ch4 id=\"疫情\"\u003e疫情\u003c/h4\u003e\n\u003cp\u003e2022年，是新冠疫情的第三年，也是切身感受到的一年。\u003c/p\u003e\n\u003cp\u003e3月22日晚，8点半和同事刚上13号线地铁。\u003c/p\u003e\n\u003cp\u003e紧接着看到群里有人说，公司大厦因为疫情封控了，只进不出。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/review-2022/%E5%A4%A7%E5%8E%A6%E5%B0%81%E6%8E%A7.jpg_320x.avif 320w, https://liudon.com/posts/review-2022/%E5%A4%A7%E5%8E%A6%E5%B0%81%E6%8E%A7.jpg_480x.avif 480w, https://liudon.com/posts/review-2022/%E5%A4%A7%E5%8E%A6%E5%B0%81%E6%8E%A7.jpg_720x.avif 720w, https://liudon.com/posts/review-2022/%E5%A4%A7%E5%8E%A6%E5%B0%81%E6%8E%A7.jpg_800x.avif 800w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/review-2022/%E5%A4%A7%E5%8E%A6%E5%B0%81%E6%8E%A7.jpg_320x.webp 320w, https://liudon.com/posts/review-2022/%E5%A4%A7%E5%8E%A6%E5%B0%81%E6%8E%A7.jpg_480x.webp 480w, https://liudon.com/posts/review-2022/%E5%A4%A7%E5%8E%A6%E5%B0%81%E6%8E%A7.jpg_720x.webp 720w, https://liudon.com/posts/review-2022/%E5%A4%A7%E5%8E%A6%E5%B0%81%E6%8E%A7.jpg_800x.webp 800w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/review-2022/%E5%A4%A7%E5%8E%A6%E5%B0%81%E6%8E%A7.jpg\" alt=\"大厦封控\"\n         width=\"800\" height=\"1223\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e第一次感受弹窗3，居家隔离。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/review-2022/%E5%BC%B9%E7%AA%973.jpg_320x.avif 320w, https://liudon.com/posts/review-2022/%E5%BC%B9%E7%AA%973.jpg_480x.avif 480w, https://liudon.com/posts/review-2022/%E5%BC%B9%E7%AA%973.jpg_720x.avif 720w, https://liudon.com/posts/review-2022/%E5%BC%B9%E7%AA%973.jpg_800x.avif 800w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/review-2022/%E5%BC%B9%E7%AA%973.jpg_320x.webp 320w, https://liudon.com/posts/review-2022/%E5%BC%B9%E7%AA%973.jpg_480x.webp 480w, https://liudon.com/posts/review-2022/%E5%BC%B9%E7%AA%973.jpg_720x.webp 720w, https://liudon.com/posts/review-2022/%E5%BC%B9%E7%AA%973.jpg_800x.webp 800w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/review-2022/%E5%BC%B9%E7%AA%973.jpg\" alt=\"弹窗3\"\n         width=\"800\" height=\"1422\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/review-2022/%E5%B1%85%E5%AE%B6%E9%9A%94%E7%A6%BB.jpg_320x.avif 320w, https://liudon.com/posts/review-2022/%E5%B1%85%E5%AE%B6%E9%9A%94%E7%A6%BB.jpg_480x.avif 480w, https://liudon.com/posts/review-2022/%E5%B1%85%E5%AE%B6%E9%9A%94%E7%A6%BB.jpg_720x.avif 720w, https://liudon.com/posts/review-2022/%E5%B1%85%E5%AE%B6%E9%9A%94%E7%A6%BB.jpg_800x.avif 800w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/review-2022/%E5%B1%85%E5%AE%B6%E9%9A%94%E7%A6%BB.jpg_320x.webp 320w, https://liudon.com/posts/review-2022/%E5%B1%85%E5%AE%B6%E9%9A%94%E7%A6%BB.jpg_480x.webp 480w, https://liudon.com/posts/review-2022/%E5%B1%85%E5%AE%B6%E9%9A%94%E7%A6%BB.jpg_720x.webp 720w, https://liudon.com/posts/review-2022/%E5%B1%85%E5%AE%B6%E9%9A%94%E7%A6%BB.jpg_800x.webp 800w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/review-2022/%E5%B1%85%E5%AE%B6%E9%9A%94%E7%A6%BB.jpg\" alt=\"居家隔离\"\n         width=\"800\" height=\"1066\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/review-2022/%E5%B1%85%E5%AE%B6%E8%A7%82%E5%AF%9F.jpg_320x.avif 320w, https://liudon.com/posts/review-2022/%E5%B1%85%E5%AE%B6%E8%A7%82%E5%AF%9F.jpg_480x.avif 480w, https://liudon.com/posts/review-2022/%E5%B1%85%E5%AE%B6%E8%A7%82%E5%AF%9F.jpg_720x.avif 720w, https://liudon.com/posts/review-2022/%E5%B1%85%E5%AE%B6%E8%A7%82%E5%AF%9F.jpg_800x.avif 800w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/review-2022/%E5%B1%85%E5%AE%B6%E8%A7%82%E5%AF%9F.jpg_320x.webp 320w, https://liudon.com/posts/review-2022/%E5%B1%85%E5%AE%B6%E8%A7%82%E5%AF%9F.jpg_480x.webp 480w, https://liudon.com/posts/review-2022/%E5%B1%85%E5%AE%B6%E8%A7%82%E5%AF%9F.jpg_720x.webp 720w, https://liudon.com/posts/review-2022/%E5%B1%85%E5%AE%B6%E8%A7%82%E5%AF%9F.jpg_800x.webp 800w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/review-2022/%E5%B1%85%E5%AE%B6%E8%A7%82%E5%AF%9F.jpg\" alt=\"居家观察\"\n         width=\"800\" height=\"1422\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e5月21日，开启居家办公。\u003c/p\u003e\n\u003cp\u003e6月5日，开始到岗工作。\u003c/p\u003e\n\u003cp\u003e11月17日，公司通知第二天居家办公。\u003c/p\u003e\n\u003cp\u003e11月21日，小区通知临时管控。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/review-2022/%E5%B0%8F%E5%8C%BA%E5%B0%81%E6%8E%A7.jpg_320x.avif 320w, https://liudon.com/posts/review-2022/%E5%B0%8F%E5%8C%BA%E5%B0%81%E6%8E%A7.jpg_480x.avif 480w, https://liudon.com/posts/review-2022/%E5%B0%8F%E5%8C%BA%E5%B0%81%E6%8E%A7.jpg_720x.avif 720w, https://liudon.com/posts/review-2022/%E5%B0%8F%E5%8C%BA%E5%B0%81%E6%8E%A7.jpg_800x.avif 800w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/review-2022/%E5%B0%8F%E5%8C%BA%E5%B0%81%E6%8E%A7.jpg_320x.webp 320w, https://liudon.com/posts/review-2022/%E5%B0%8F%E5%8C%BA%E5%B0%81%E6%8E%A7.jpg_480x.webp 480w, https://liudon.com/posts/review-2022/%E5%B0%8F%E5%8C%BA%E5%B0%81%E6%8E%A7.jpg_720x.webp 720w, https://liudon.com/posts/review-2022/%E5%B0%8F%E5%8C%BA%E5%B0%81%E6%8E%A7.jpg_800x.webp 800w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/review-2022/%E5%B0%8F%E5%8C%BA%E5%B0%81%E6%8E%A7.jpg\" alt=\"小区封控\"\n         width=\"800\" height=\"1158\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e12月10日，媳妇中招。\u003c/p\u003e\n\u003cp\u003e12月12日，自己中招。\u003c/p\u003e\n\u003cp\u003e12月18日，娃中招。\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"%e6%8a%97%e5%8e%9f%e5%8f%98%e5%8c%96.jpg\" alt=\"抗原变化\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/p\u003e\n\u003cp\u003e12月20日，开始到岗工作，持续了近一个月的居家隔离生活终于结束。\u003c/p\u003e\n\u003cp\u003e老妈冒着北京疫情高峰感染的风险，过来帮我们带娃。\u003c/p\u003e\n\u003cp\u003e从1周一检，到3天一检，不知道健康宝有没有年终报告，告诉你今年做了多少次核酸，相信会是很棒的一个数字。\u003c/p\u003e\n\u003ch4 id=\"入学\"\u003e入学\u003c/h4\u003e\n\u003cp\u003e上半年赶着疫情的间隙，整理好了娃的入学资料。\u003c/p\u003e\n\u003cp\u003e经过一个月的焦虑等待后，最终被附近的学校录取，也确实感受到了离家近的好处。\u003c/p\u003e\n\u003cp\u003e详细经过见\u003ca href=\"https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/\"\u003e记录2022年海淀幼升小\u003c/a\u003e\u003c/p\u003e\n\u003ch4 id=\"休假\"\u003e休假\u003c/h4\u003e\n\u003cp\u003e春节没有回家过年，上半年北京和老家交替出现疫情，最终在8月份休假回了趟家。\u003c/p\u003e\n\u003ch4 id=\"驾照\"\u003e驾照\u003c/h4\u003e\n\u003cp\u003e因为疫情，感觉还是得考个驾照，拖延了N年的事项提上了日程。\u003c/p\u003e\n\u003cp\u003e6月份报名，一直拖到10月份才过的科目一。\u003c/p\u003e\n\u003cp\u003e11月底开始摸车了，刚上2节课因为疫情封校了，现在学的都快忘光了。\u003c/p\u003e\n\u003ch4 id=\"搬家\"\u003e搬家\u003c/h4\u003e\n\u003cp\u003e年底公司通知搬家，又搬回了银科，兜兜转转，又回到了起点。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/review-2022/20230221153216.jpg_320x.avif 320w, https://liudon.com/posts/review-2022/20230221153216.jpg_480x.avif 480w, https://liudon.com/posts/review-2022/20230221153216.jpg_720x.avif 720w, https://liudon.com/posts/review-2022/20230221153216.jpg_800x.avif 800w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/review-2022/20230221153216.jpg_320x.webp 320w, https://liudon.com/posts/review-2022/20230221153216.jpg_480x.webp 480w, https://liudon.com/posts/review-2022/20230221153216.jpg_720x.webp 720w, https://liudon.com/posts/review-2022/20230221153216.jpg_800x.webp 800w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/review-2022/20230221153216.jpg\" alt=\"又回银科\"\n         width=\"800\" height=\"1067\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003ch4 id=\"博客\"\u003e博客\u003c/h4\u003e\n\u003cp\u003e2022年，把博客又捡了回来，今年多更新吧。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/review-2022/202301161440442.png_320x.avif 320w, https://liudon.com/posts/review-2022/202301161440442.png_480x.avif 480w, https://liudon.com/posts/review-2022/202301161440442.png_720x.avif 720w, https://liudon.com/posts/review-2022/202301161440442.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/review-2022/202301161440442.png_320x.webp 320w, https://liudon.com/posts/review-2022/202301161440442.png_480x.webp 480w, https://liudon.com/posts/review-2022/202301161440442.png_720x.webp 720w, https://liudon.com/posts/review-2022/202301161440442.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/review-2022/202301161440442.png\" alt=\"\"\n         width=\"1080\" height=\"636\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e或许是上了年纪，2022年发现泪点变得很低，健康、家人才是最重要的。\u003c/p\u003e\n\u003cp\u003e新的一年，继续开源节流，做好防护，保护好家人。\u003c/p\u003e\n\u003cp\u003e最后，祝大家新年快乐！\u003c/p\u003e\n","date_published":"2023-01-12T07:21:20+08:00","tags":["年终总结"]},{"title":"去掉Cloudflare烦人的email-decode.min.js请求","id":"https://liudon.com/posts/remove-cloudflares-email-decode.min.js/","url":"https://liudon.com/posts/remove-cloudflares-email-decode.min.js/","summary":"\u003cp\u003e通过WebPageTest页面测试，发现一个\u003ccode\u003e/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js\u003c/code\u003e的文件请求，影响到了页面渲染。\u003c/p\u003e","content_html":"\u003cp\u003e通过WebPageTest页面测试，发现一个\u003ccode\u003e/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js\u003c/code\u003e的文件请求，影响到了页面渲染。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/remove-cloudflares-email-decode.min.js/webpagetest.png_320x.avif 320w, https://liudon.com/posts/remove-cloudflares-email-decode.min.js/webpagetest.png_480x.avif 480w, https://liudon.com/posts/remove-cloudflares-email-decode.min.js/webpagetest.png_720x.avif 720w, https://liudon.com/posts/remove-cloudflares-email-decode.min.js/webpagetest.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/remove-cloudflares-email-decode.min.js/webpagetest.png_320x.webp 320w, https://liudon.com/posts/remove-cloudflares-email-decode.min.js/webpagetest.png_480x.webp 480w, https://liudon.com/posts/remove-cloudflares-email-decode.min.js/webpagetest.png_720x.webp 720w, https://liudon.com/posts/remove-cloudflares-email-decode.min.js/webpagetest.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/remove-cloudflares-email-decode.min.js/webpagetest.png\" alt=\"webpagetest测试结果\"\n         width=\"1080\" height=\"360\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e看路径像是Cloudflare的文件，搜了下主题代码，没找到相关文件。\u003c/p\u003e\n\u003cp\u003e经过一番搜索，原来这个是Cloudflare的\u003ccode\u003e电子邮件地址混淆技术\u003c/code\u003e功能。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/remove-cloudflares-email-decode.min.js/ScrapeShield.png_320x.avif 320w, https://liudon.com/posts/remove-cloudflares-email-decode.min.js/ScrapeShield.png_480x.avif 480w, https://liudon.com/posts/remove-cloudflares-email-decode.min.js/ScrapeShield.png_720x.avif 720w, https://liudon.com/posts/remove-cloudflares-email-decode.min.js/ScrapeShield.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/remove-cloudflares-email-decode.min.js/ScrapeShield.png_320x.webp 320w, https://liudon.com/posts/remove-cloudflares-email-decode.min.js/ScrapeShield.png_480x.webp 480w, https://liudon.com/posts/remove-cloudflares-email-decode.min.js/ScrapeShield.png_720x.webp 720w, https://liudon.com/posts/remove-cloudflares-email-decode.min.js/ScrapeShield.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/remove-cloudflares-email-decode.min.js/ScrapeShield.png\" alt=\"Scrape Shield\"\n         width=\"1080\" height=\"456\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e关闭这个功能即可。\u003c/p\u003e\n","date_published":"2022-08-26T23:25:57+08:00","tags":["Cloudflare"]},{"title":"累计布局偏移修复方案改进 —— 自动生成图片宽高","id":"https://liudon.com/posts/hugo-auto-generate-image-width-and-height/","url":"https://liudon.com/posts/hugo-auto-generate-image-width-and-height/","summary":"记录通过远程图片信息自动补充宽高、降低 Hugo 页面 CLS 的历史方案，以及本站当前响应式图片实现入口。","content_html":"\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003e更新说明（2026-09）\u003c/strong\u003e：本站已不再采用通过远程接口读取图片宽高的方案。当前图片处理已升级为本地 Page Bundle、Sharp 多尺寸 AVIF/WebP 预生成和构建缓存，详见\u003ca href=\"https://liudon.com/posts/blog-performance-optimization/\"\u003e博客加速实践\u003c/a\u003e。2023 年的中间演进方案可参考\u003ca href=\"/posts/responsive-and-optimized-images-with-hugo/\"\u003e使用 Hugo 实现响应式和优化的图片\u003c/a\u003e。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch4 id=\"遗留的问题\"\u003e遗留的问题\u003c/h4\u003e\n\u003cp\u003e上一篇文章讲了我是如何解决博客累计布局偏移的问题，但是这个方案存在一个很大的问题。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e手动输入每张图片的宽高\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e这就要求每次插入图片后，需要手动查看图片宽高，修改插入代码，导致整个流程变得繁琐，无法自动化。\u003c/p\u003e\n\u003cp\u003e身为一名工程师，对于这样一个痛点，势必要优化掉。\u003c/p\u003e\n\u003ch4 id=\"思路\"\u003e思路\u003c/h4\u003e\n\u003cp\u003e发完上一篇文章后，我一直在想怎么能实现自动化插入图片宽高。\u003c/p\u003e\n\u003cp\u003e要插入的图片代码是类似这样的：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{{\u0026lt; figure src=\u0026#34;https://static.liudon.com/img/cover-code.png\u0026#34; alt=\u0026#34;cover.html code\u0026#34; width=\u0026#34;2020\u0026#34; height=\u0026#34;1468\u0026#34; \u0026gt;}}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e我使用了\u003ccode\u003epicgo\u003c/code\u003e插件，上传图片到腾讯云对象存储，然后复制\u003ccode\u003emarkdown\u003c/code\u003e图片代码插入文章。\u003c/p\u003e\n\u003cp\u003e能不能通过改造\u003ccode\u003epicgo\u003c/code\u003e插件，将上传后复制的代码，加上图片的宽高参数？\u003c/p\u003e\n\u003cp\u003e通过一番搜索，发现此方案不通，\u003ccode\u003epicgo\u003c/code\u003e确实支持自定义代码，但是变量仅支持\u003ccode\u003e文件名\u003c/code\u003e和\u003ccode\u003eurl\u003c/code\u003e。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/hugo-auto-generate-image-width-and-height/picgo-config.png_320x.avif 320w, https://liudon.com/posts/hugo-auto-generate-image-width-and-height/picgo-config.png_480x.avif 480w, https://liudon.com/posts/hugo-auto-generate-image-width-and-height/picgo-config.png_720x.avif 720w, https://liudon.com/posts/hugo-auto-generate-image-width-and-height/picgo-config.png_981x.avif 981w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/hugo-auto-generate-image-width-and-height/picgo-config.png_320x.webp 320w, https://liudon.com/posts/hugo-auto-generate-image-width-and-height/picgo-config.png_480x.webp 480w, https://liudon.com/posts/hugo-auto-generate-image-width-and-height/picgo-config.png_720x.webp 720w, https://liudon.com/posts/hugo-auto-generate-image-width-and-height/picgo-config.png_981x.webp 981w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/hugo-auto-generate-image-width-and-height/picgo-config.png\" alt=\"picgo config\"\n         width=\"981\" height=\"501\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e此路不通，只好再想新的办法了。\u003c/p\u003e\n\u003cp\u003e对象存储的图片处理有接口，可以返回图片的宽高信息，详细说明见\u003ca href=\"https://cloud.tencent.com/document/product/460/6927\"\u003e获取图片基本信息\u003c/a\u003e。\u003c/p\u003e\n\u003cp\u003e能不能在生成文件的时候，通过发起一个请求拿到图片宽高，然后写入html代码？\u003c/p\u003e\n\u003cp\u003e经过一番搜索，发现\u003ccode\u003ehugo\u003c/code\u003e支持请求url，详细说明见\u003ca href=\"https://gohugo.io/templates/data-templates/#get-remote-data\"\u003eGet Remote Data\u003c/a\u003e。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{{ $dataJ := getJSON \u0026#34;url\u0026#34; }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{{ $dataC := getCSV \u0026#34;separator\u0026#34; \u0026#34;url\u0026#34; }}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e哈哈，柳暗花明又一村的感觉。\u003c/p\u003e\n\u003ch4 id=\"解决方案\"\u003e解决方案\u003c/h4\u003e\n\u003cp\u003e此方案基于对象存储获取图片宽高，然后写入图片解析模板。\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e新增\u003ccode\u003ecss\u003c/code\u003e配置\u003c/p\u003e\n\u003cp\u003e新增如下配置，否则会导致图片变形。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eimg\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003ewidth\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"mi\"\u003e100\u003c/span\u003e\u003cspan class=\"o\"\u003e%\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eheight\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"n\"\u003eauto\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003efigure\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003ebackground\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"k\"\u003evar\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003ecode\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ebg\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e添加\u003ccode\u003erender-image.html\u003c/code\u003e文件\u003c/p\u003e\n\u003cp\u003e代码如下：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eitem\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003egetJSON\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eDestination\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;?imageInfo\u0026amp;t=\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003enow\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eUnix\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e/*\u003c/span\u003e \u003cspan class=\"err\"\u003e通过对象存储接口获取图片宽高，因为我使用了\u003c/span\u003e\u003cspan class=\"n\"\u003ecdn\u003c/span\u003e\u003cspan class=\"err\"\u003e，所以增加随机数保证拿到最新的图片宽高参数\u003c/span\u003e \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eDestination\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eDestination\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eText\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eText\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eTitle\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eTitle\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003ewith\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eitem\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003epicture\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003esource\u003c/span\u003e \u003cspan class=\"n\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;image/webp\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003esrcset\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ $Destination | safeURL }}/webp\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003ewidth\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ .width }}\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eheight\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ .height }}\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eimg\u003c/span\u003e \u003cspan class=\"n\"\u003eloading\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;lazy\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ $Destination | safeURL }}\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003ealt\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ $Text }}\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"n\"\u003ewith\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eTitle\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e \u003cspan class=\"n\"\u003etitle\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ . }}\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e \u003cspan class=\"n\"\u003ewidth\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ .width }}\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eheight\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ .height }}\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e/\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"n\"\u003epicture\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e添加\u003ccode\u003ecover.html\u003c/code\u003e文件\u003c/p\u003e\n\u003cp\u003e代码如下：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003ewith\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecxt\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e/*\u003c/span\u003e \u003cspan class=\"n\"\u003eApply\u003c/span\u003e \u003cspan class=\"n\"\u003eproper\u003c/span\u003e \u003cspan class=\"n\"\u003econtext\u003c/span\u003e \u003cspan class=\"n\"\u003efrom\u003c/span\u003e \u003cspan class=\"n\"\u003edict\u003c/span\u003e \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"ow\"\u003eand\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eParams\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecover\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eimage\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"ow\"\u003enot\u003c/span\u003e \u003cspan class=\"o\"\u003e$.\u003c/span\u003e\u003cspan class=\"n\"\u003eisHidden\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ealt\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eParams\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecover\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ealt\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003edefault\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eParams\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecover\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecaption\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003eplainify\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003efigure\u003c/span\u003e \u003cspan class=\"k\"\u003eclass\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;entry-cover\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eresponsiveImages\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eParams\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecover\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eresponsiveImages\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003edefault\u003c/span\u003e \u003cspan class=\"n\"\u003esite\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eParams\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecover\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eresponsiveImages\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003edefault\u003c/span\u003e \u003cspan class=\"bp\"\u003etrue\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eaddLink\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"ow\"\u003eand\u003c/span\u003e \u003cspan class=\"n\"\u003esite\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eParams\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecover\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003elinkFullImages\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"ow\"\u003enot\u003c/span\u003e \u003cspan class=\"o\"\u003e$.\u003c/span\u003e\u003cspan class=\"n\"\u003eIsHome\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ecover\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eResources\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eByType\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;image\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eGetMatch\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eprintf\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;*\u003c/span\u003e\u003cspan class=\"si\"\u003e%s\u003c/span\u003e\u003cspan class=\"s2\"\u003e*\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eParams\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecover\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eimage\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ecover\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}{{\u003c/span\u003e\u003cspan class=\"o\"\u003e/*\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e \u003cspan class=\"n\"\u003eit\u003c/span\u003e \u003cspan class=\"n\"\u003eis\u003c/span\u003e \u003cspan class=\"n\"\u003epresent\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003epage\u003c/span\u003e \u003cspan class=\"n\"\u003ebundle\u003c/span\u003e \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eaddLink\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003ea\u003c/span\u003e \u003cspan class=\"n\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ (path.Join .RelPermalink .Params.cover.image) | absURL }}\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003etarget\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;_blank\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;noopener noreferrer\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003esizes\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eslice\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;360\u0026#34;\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;480\u0026#34;\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;720\u0026#34;\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;1080\u0026#34;\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;1500\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eprocessableFormats\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eslice\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;jpg\u0026#34;\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;jpeg\u0026#34;\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;png\u0026#34;\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;tif\u0026#34;\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;bmp\u0026#34;\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;gif\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003ehugo\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eIsExtended\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eprocessableFormats\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eprocessableFormats\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003eappend\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;webp\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eprod\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ehugo\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eIsProduction\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"ow\"\u003eor\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eeq\u003c/span\u003e \u003cspan class=\"n\"\u003esite\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eParams\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eenv\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;production\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"ow\"\u003eand\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eprocessableFormats\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ecover\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eMediaType\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eSubType\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eresponsiveImages\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eeq\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eprod\u003c/span\u003e \u003cspan class=\"bp\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eimg\u003c/span\u003e \u003cspan class=\"n\"\u003eloading\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;lazy\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003esrcset\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{- range $size := $sizes -}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ege\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ecover\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eWidth\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003esize\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"n\"\u003eprintf\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"si\"\u003e%s\u003c/span\u003e\u003cspan class=\"s2\"\u003e \u003c/span\u003e\u003cspan class=\"si\"\u003e%s\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e((\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ecover\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eResize\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eprintf\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"si\"\u003e%s\u003c/span\u003e\u003cspan class=\"s2\"\u003ex\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003esize\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePermalink\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eprintf\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"si\"\u003e%s\u003c/span\u003e\u003cspan class=\"s2\"\u003ew ,\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003esize\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}{{\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ecover\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePermalink\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"n\"\u003eprintf\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"si\"\u003e%d\u003c/span\u003e\u003cspan class=\"s2\"\u003ew\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ecover\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eWidth\u003c/span\u003e\u003cspan class=\"p\"\u003e)}}\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34; \u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003esizes\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;(min-width: 768px) 720px, 100vw\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ $cover.Permalink }}\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003ealt\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ $alt }}\u0026#34;\u003c/span\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003ewidth\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ $cover.Width }}\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eheight\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ $cover.Height }}\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"p\"\u003e}}{{\u003c/span\u003e\u003cspan class=\"o\"\u003e/*\u003c/span\u003e \u003cspan class=\"n\"\u003eUnprocessable\u003c/span\u003e \u003cspan class=\"n\"\u003eimage\u003c/span\u003e \u003cspan class=\"ow\"\u003eor\u003c/span\u003e \u003cspan class=\"n\"\u003eresponsive\u003c/span\u003e \u003cspan class=\"n\"\u003eimages\u003c/span\u003e \u003cspan class=\"n\"\u003edisabled\u003c/span\u003e \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eimg\u003c/span\u003e \u003cspan class=\"n\"\u003eloading\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;lazy\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ (path.Join .RelPermalink .Params.cover.image) | absURL }}\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003ealt\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ $alt }}\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"p\"\u003e}}{{\u003c/span\u003e\u003cspan class=\"o\"\u003e/*\u003c/span\u003e \u003cspan class=\"n\"\u003eFor\u003c/span\u003e \u003cspan class=\"n\"\u003eabsolute\u003c/span\u003e \u003cspan class=\"n\"\u003eurls\u003c/span\u003e \u003cspan class=\"ow\"\u003eand\u003c/span\u003e \u003cspan class=\"n\"\u003eexternal\u003c/span\u003e \u003cspan class=\"n\"\u003elinks\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eno\u003c/span\u003e \u003cspan class=\"n\"\u003eimg\u003c/span\u003e \u003cspan class=\"n\"\u003eprocessing\u003c/span\u003e \u003cspan class=\"n\"\u003ehere\u003c/span\u003e \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eitem\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003egetJSON\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eParams\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecover\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eimage\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;?imageInfo\u0026amp;t=\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003enow\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eUnix\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e/*\u003c/span\u003e \u003cspan class=\"err\"\u003e通过对象存储接口获取图片宽高，因为我使用了\u003c/span\u003e\u003cspan class=\"n\"\u003ecdn\u003c/span\u003e\u003cspan class=\"err\"\u003e，所以增加随机数保证拿到最新的图片宽高参数\u003c/span\u003e \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ecoverUrl\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eParams\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecover\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eimage\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003ewith\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eitem\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eaddLink\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003ea\u003c/span\u003e \u003cspan class=\"n\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ $coverUrl | absURL }}\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003etarget\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;_blank\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;noopener noreferrer\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003epicture\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003esource\u003c/span\u003e \u003cspan class=\"n\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;image/webp\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003esrcset\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ $coverUrl | absURL }}/webp\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003ewidth\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ .width }}\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eheight\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ .height }}\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eimg\u003c/span\u003e \u003cspan class=\"n\"\u003eloading\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;lazy\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003ealt\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ $alt }}\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ $coverUrl | absURL }}\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003ewidth\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ .width }}\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003eheight\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ .height }}\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"o\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"n\"\u003epicture\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eaddLink\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"n\"\u003ea\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e/*\u003c/span\u003e  \u003cspan class=\"n\"\u003eDisplay\u003c/span\u003e \u003cspan class=\"n\"\u003eCaption\u003c/span\u003e  \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"ow\"\u003enot\u003c/span\u003e \u003cspan class=\"o\"\u003e$.\u003c/span\u003e\u003cspan class=\"n\"\u003eIsHome\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"n\"\u003ewith\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eParams\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecover\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecaption\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003ep\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003emarkdownify\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"n\"\u003ep\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"n\"\u003efigure\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"p\"\u003e}}{{\u003c/span\u003e\u003cspan class=\"o\"\u003e/*\u003c/span\u003e \u003cspan class=\"n\"\u003eEnd\u003c/span\u003e \u003cspan class=\"n\"\u003eimage\u003c/span\u003e \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}{{\u003c/span\u003e\u003cspan class=\"o\"\u003e/*\u003c/span\u003e \u003cspan class=\"n\"\u003eEnd\u003c/span\u003e \u003cspan class=\"n\"\u003econtext\u003c/span\u003e \u003cspan class=\"o\"\u003e*/\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e使用方式和原来不变，插入\u003ccode\u003emarkdown\u003c/code\u003e语法的图片代码即可。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e![picgo config](picgo-config.png)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e这下又可以愉快地码字了。\u003c/p\u003e\n","image":"https://liudon.com/posts/hugo-auto-generate-image-width-and-height/74TRx6aETydsBGa2IZ7R.png","date_published":"2022-08-24T12:37:22+08:00","tags":["博客优化","CLS","PagerMod","hugo"]},{"title":"优化博客的累计布局偏移(CLS)问题","id":"https://liudon.com/posts/fix-blog-cls/","url":"https://liudon.com/posts/fix-blog-cls/","summary":"记录通过补充图片宽高改善 Hugo 页面累计布局偏移（CLS）的早期方案，并提供本站当前响应式图片方案入口。","content_html":"\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003e更新说明（2026-09）\u003c/strong\u003e：本文是早期 CLS 修复记录，当前站点已经改用本地 Page Bundle、响应式图片和预生成 AVIF/WebP，详见\u003ca href=\"https://liudon.com/posts/blog-performance-optimization/\"\u003e博客加速实践\u003c/a\u003e。后续演进记录可参考\u003ca href=\"https://liudon.com/posts/hugo-auto-generate-image-width-and-height/\"\u003e自动生成图片宽高\u003c/a\u003e。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch4 id=\"问题表现\"\u003e问题表现\u003c/h4\u003e\n\u003cp\u003e7月份将博客部署由\u003ccode\u003eGithub\u003c/code\u003e迁移到\u003ccode\u003eCloudflare\u003c/code\u003e后，开始关注博客的性能问题。\u003c/p\u003e\n\u003cp\u003e偶然看到苏卡卡大佬的\u003ca href=\"https://blog.skk.moe/post/fix-blog-cls/\"\u003eCLS优化文章\u003c/a\u003e，拿自己博客也测试了下，发现也存在同样的问题。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/fix-blog-cls/lighthouse_result.png_320x.avif 320w, https://liudon.com/posts/fix-blog-cls/lighthouse_result.png_480x.avif 480w, https://liudon.com/posts/fix-blog-cls/lighthouse_result.png_720x.avif 720w, https://liudon.com/posts/fix-blog-cls/lighthouse_result.png_1038x.avif 1038w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/fix-blog-cls/lighthouse_result.png_320x.webp 320w, https://liudon.com/posts/fix-blog-cls/lighthouse_result.png_480x.webp 480w, https://liudon.com/posts/fix-blog-cls/lighthouse_result.png_720x.webp 720w, https://liudon.com/posts/fix-blog-cls/lighthouse_result.png_1038x.webp 1038w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/fix-blog-cls/lighthouse_result.png\" alt=\"Lighthouse测试报告\"\n         width=\"1038\" height=\"1144\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e根据苏卡卡大佬的文章，分析页面是由于文章封面的图片缺少宽高导致出现CLS问题。\u003c/p\u003e\n\u003cp\u003e为了解决这个问题，需要指定封面的宽高参数。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/fix-blog-cls/cover-code.png_320x.avif 320w, https://liudon.com/posts/fix-blog-cls/cover-code.png_480x.avif 480w, https://liudon.com/posts/fix-blog-cls/cover-code.png_720x.avif 720w, https://liudon.com/posts/fix-blog-cls/cover-code.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/fix-blog-cls/cover-code.png_320x.webp 320w, https://liudon.com/posts/fix-blog-cls/cover-code.png_480x.webp 480w, https://liudon.com/posts/fix-blog-cls/cover-code.png_720x.webp 720w, https://liudon.com/posts/fix-blog-cls/cover-code.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/fix-blog-cls/cover-code.png\" alt=\"cover.html code\"\n         width=\"1080\" height=\"785\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e根据\u003ccode\u003ePagerMod\u003c/code\u003e主题的\u003ccode\u003ecover.html\u003c/code\u003e文件代码，使用绝对地址的情况没有配置宽高参数。\u003c/p\u003e\n\u003ch4 id=\"解决方案\"\u003e解决方案\u003c/h4\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e新增封面配置\u003c/p\u003e\n\u003cp\u003e文章封面配置新增\u003ccode\u003ewidth\u003c/code\u003e和\u003ccode\u003eheight\u003c/code\u003e属性。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecover:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    image: \u0026#34;https://static.liudon.com/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20220725183817.jpg\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    width: 1620\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    height: 1080\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e自定义封面文件\u003c/p\u003e\n\u003cp\u003e添加自己的\u003ccode\u003ecover.html\u003c/code\u003e文件，核心代码如下，完整代码参考\u003ca href=\"https://github.com/Liudon/liudon.github.io/blob/code/layouts/partials/cover.html\"\u003e我的文件\u003c/a\u003e。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"p\"\u003e}}{{\u003c/span\u003e\u003cspan class=\"o\"\u003e/*\u003c/span\u003e \u003cspan class=\"n\"\u003eFor\u003c/span\u003e \u003cspan class=\"n\"\u003eabsolute\u003c/span\u003e \u003cspan class=\"n\"\u003eurls\u003c/span\u003e \u003cspan class=\"ow\"\u003eand\u003c/span\u003e \u003cspan class=\"n\"\u003eexternal\u003c/span\u003e \u003cspan class=\"n\"\u003elinks\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eno\u003c/span\u003e \u003cspan class=\"n\"\u003eimg\u003c/span\u003e \u003cspan class=\"n\"\u003eprocessing\u003c/span\u003e \u003cspan class=\"n\"\u003ehere\u003c/span\u003e \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eaddLink\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003ea\u003c/span\u003e \u003cspan class=\"n\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ (.Params.cover.image) | absURL }}\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003etarget\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;_blank\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;noopener noreferrer\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003epicture\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003esource\u003c/span\u003e \u003cspan class=\"n\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;image/webp\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003esrcset\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ (.Params.cover.image) | absURL }}/webp\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eParams\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecover\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ewidth\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\u003cspan class=\"n\"\u003ewidth\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ (.Params.cover.width) }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eParams\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecover\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eheight\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\u003cspan class=\"n\"\u003eheight\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ (.Params.cover.height) }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eimg\u003c/span\u003e \u003cspan class=\"n\"\u003eloading\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;lazy\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003ealt\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ $alt }}\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ (.Params.cover.image) | absURL }}\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eParams\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecover\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ewidth\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\u003cspan class=\"n\"\u003ewidth\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ (.Params.cover.width) }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eParams\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ecover\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eheight\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\u003cspan class=\"n\"\u003eheight\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ (.Params.cover.height) }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"o\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"n\"\u003epicture\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003ccode\u003eimg\u003c/code\u003e标签新增\u003ccode\u003ewidth\u003c/code\u003e和\u003ccode\u003eheight\u003c/code\u003e属性，读取封面配置的\u003ccode\u003ewidth\u003c/code\u003e和\u003ccode\u003eheight\u003c/code\u003e属性值。\u003c/p\u003e\n\u003cp\u003e图片我放到了腾讯云对象存储上，通过图片处理支持了\u003ccode\u003ewebp\u003c/code\u003e格式图片。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/fix-blog-cls/cos-img-process.png_320x.avif 320w, https://liudon.com/posts/fix-blog-cls/cos-img-process.png_480x.avif 480w, https://liudon.com/posts/fix-blog-cls/cos-img-process.png_720x.avif 720w, https://liudon.com/posts/fix-blog-cls/cos-img-process.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/fix-blog-cls/cos-img-process.png_320x.webp 320w, https://liudon.com/posts/fix-blog-cls/cos-img-process.png_480x.webp 480w, https://liudon.com/posts/fix-blog-cls/cos-img-process.png_720x.webp 720w, https://liudon.com/posts/fix-blog-cls/cos-img-process.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/fix-blog-cls/cos-img-process.png\" alt=\"cos-img-process\"\n         width=\"1080\" height=\"511\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e新增\u003ccode\u003ecss\u003c/code\u003e配置\u003c/p\u003e\n\u003cp\u003e新增如下配置，否则会导致图片变形。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eimg\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003ewidth\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"mi\"\u003e100\u003c/span\u003e\u003cspan class=\"o\"\u003e%\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eheight\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"n\"\u003eauto\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003efigure\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003ebackground\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"k\"\u003evar\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e--\u003c/span\u003e\u003cspan class=\"n\"\u003ecode\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ebg\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch4 id=\"再进一步\"\u003e再进一步\u003c/h4\u003e\n\u003cp\u003e前面只解决了首页封面，文章页也会存在图片的情况，也会有类似的问题。\u003c/p\u003e\n\u003cp\u003e基于\u003ccode\u003emarkdown\u003c/code\u003e语法的图片代码，是不支持宽高参数的。\u003c/p\u003e\n\u003cp\u003e还好\u003ccode\u003ehugo\u003c/code\u003e支持shortcode，其中就有\u003ccode\u003efigure\u003c/code\u003e语法，支持配置宽高参数。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/fix-blog-cls/figure-code.png_320x.avif 320w, https://liudon.com/posts/fix-blog-cls/figure-code.png_480x.avif 480w, https://liudon.com/posts/fix-blog-cls/figure-code.png_720x.avif 720w, https://liudon.com/posts/fix-blog-cls/figure-code.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/fix-blog-cls/figure-code.png_320x.webp 320w, https://liudon.com/posts/fix-blog-cls/figure-code.png_480x.webp 480w, https://liudon.com/posts/fix-blog-cls/figure-code.png_720x.webp 720w, https://liudon.com/posts/fix-blog-cls/figure-code.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/fix-blog-cls/figure-code.png\" alt=\"figure.html code\"\n         width=\"1080\" height=\"714\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e我们使用\u003ccode\u003efigure\u003c/code\u003e语法插入图片，指定图片宽高。\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003efigure\u003c/code\u003e解析模板我也进行了改进，类似\u003ccode\u003ecover.html\u003c/code\u003e模板，也通过对象存储图片处理支持了webp响应式图片，核心代码如下，完整代码参考\u003ca href=\"https://github.com/Liudon/liudon.github.io/blob/code/layouts/shortcodes/figure.html\"\u003e我的文件\u003c/a\u003e。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eGet\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;link\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003ea\u003c/span\u003e \u003cspan class=\"n\"\u003ehref\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ .Get \u0026#34;\u003c/span\u003e\u003cspan class=\"n\"\u003elink\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34; }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"n\"\u003ewith\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eGet\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;target\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e \u003cspan class=\"n\"\u003etarget\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ . }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"p\"\u003e}}{{\u003c/span\u003e \u003cspan class=\"n\"\u003ewith\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eGet\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;rel\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e \u003cspan class=\"n\"\u003erel\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ . }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003epicture\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003esource\u003c/span\u003e \u003cspan class=\"n\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;image/webp\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003esrcset\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ .Get \u0026#34;\u003c/span\u003e\u003cspan class=\"n\"\u003esrc\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34; }}/webp\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003ewith\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eGet\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;width\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e \u003cspan class=\"n\"\u003ewidth\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ . }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003ewith\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eGet\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;height\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e \u003cspan class=\"n\"\u003eheight\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ . }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eimg\u003c/span\u003e \u003cspan class=\"n\"\u003eloading\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;lazy\u0026#34;\u003c/span\u003e \u003cspan class=\"n\"\u003esrc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ .Get \u0026#34;\u003c/span\u003e\u003cspan class=\"n\"\u003esrc\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34; }}{{- if eq (.Get \u0026#34;\u003c/span\u003e\u003cspan class=\"n\"\u003ealign\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;) \u0026#34;\u003c/span\u003e\u003cspan class=\"n\"\u003ecenter\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34; }}#center{{- end }}\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e         \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"ow\"\u003eor\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eGet\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;alt\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eGet\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;caption\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e         \u003cspan class=\"n\"\u003ealt\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ with .Get \u0026#34;\u003c/span\u003e\u003cspan class=\"n\"\u003ealt\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34; }}{{ . }}{{ else }}{{ .Get \u0026#34;\u003c/span\u003e\u003cspan class=\"n\"\u003ecaption\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34; | markdownify| plainify }}{{ end }}\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e         \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e         \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003ewith\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eGet\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;width\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e \u003cspan class=\"n\"\u003ewidth\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ . }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e         \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003ewith\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eGet\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;height\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e \u003cspan class=\"n\"\u003eheight\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{{ . }}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e/\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;!--\u003c/span\u003e \u003cspan class=\"n\"\u003eClosing\u003c/span\u003e \u003cspan class=\"n\"\u003eimg\u003c/span\u003e \u003cspan class=\"n\"\u003etag\u003c/span\u003e \u003cspan class=\"o\"\u003e--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"n\"\u003epicture\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{{\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eGet\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;link\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e}}\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;/\u003c/span\u003e\u003cspan class=\"n\"\u003ea\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"p\"\u003e{{\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"p\"\u003e}}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e使用方式：\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e{{\u0026lt; figure src=\u0026ldquo;cover-code.png\u0026rdquo; alt=\u0026ldquo;cover.html code\u0026rdquo; width=\u0026ldquo;2020\u0026rdquo; height=\u0026ldquo;1468\u0026rdquo; \u0026gt;}}\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/fix-blog-cls/gtmetrix-result.png_320x.avif 320w, https://liudon.com/posts/fix-blog-cls/gtmetrix-result.png_480x.avif 480w, https://liudon.com/posts/fix-blog-cls/gtmetrix-result.png_720x.avif 720w, https://liudon.com/posts/fix-blog-cls/gtmetrix-result.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/fix-blog-cls/gtmetrix-result.png_320x.webp 320w, https://liudon.com/posts/fix-blog-cls/gtmetrix-result.png_480x.webp 480w, https://liudon.com/posts/fix-blog-cls/gtmetrix-result.png_720x.webp 720w, https://liudon.com/posts/fix-blog-cls/gtmetrix-result.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/fix-blog-cls/gtmetrix-result.png\" alt=\"gtmetrix-result\"\n         width=\"1080\" height=\"394\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e至此累计布局偏移(CLS)问题解决了，同时也支持了响应式图片。\u003c/p\u003e\n","date_published":"2022-08-20T07:27:22+08:00","tags":["博客优化","CLS","PagerMod"]},{"title":"将博客部署到Cloudflare Pages","id":"https://liudon.com/posts/deploy-blog-to-cloudflare-pages/","url":"https://liudon.com/posts/deploy-blog-to-cloudflare-pages/","summary":"\u003cp\u003e目前博客是部署到了\u003ccode\u003eGithub Pages\u003c/code\u003e上，具体实现见\u003ca href=\"https://liudon.com/posts/%E5%8D%9A%E5%AE%A2%E6%9E%B6%E6%9E%84%E8%AF%B4%E6%98%8E/\"\u003e博客架构说明\u003c/a\u003e。\u003c/p\u003e\n\u003ch4 id=\"缘由\"\u003e缘由\u003c/h4\u003e\n\u003cp\u003e\u003ccode\u003eGithub Pages\u003c/code\u003e部署有一个问题，就是不支持\u003ccode\u003eHSTS\u003c/code\u003e。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eHTTP Strict Transport Security（通常简称为HSTS）是一个安全功能，它告诉浏览器只能通过 HTTPS 访问当前资源，而不是HTTP。\u003c/p\u003e","content_html":"\u003cp\u003e目前博客是部署到了\u003ccode\u003eGithub Pages\u003c/code\u003e上，具体实现见\u003ca href=\"https://liudon.com/posts/%E5%8D%9A%E5%AE%A2%E6%9E%B6%E6%9E%84%E8%AF%B4%E6%98%8E/\"\u003e博客架构说明\u003c/a\u003e。\u003c/p\u003e\n\u003ch4 id=\"缘由\"\u003e缘由\u003c/h4\u003e\n\u003cp\u003e\u003ccode\u003eGithub Pages\u003c/code\u003e部署有一个问题，就是不支持\u003ccode\u003eHSTS\u003c/code\u003e。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eHTTP Strict Transport Security（通常简称为HSTS）是一个安全功能，它告诉浏览器只能通过 HTTPS 访问当前资源，而不是HTTP。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/deploy-blog-to-cloudflare-pages/20220729232638.png_320x.avif 320w, https://liudon.com/posts/deploy-blog-to-cloudflare-pages/20220729232638.png_480x.avif 480w, https://liudon.com/posts/deploy-blog-to-cloudflare-pages/20220729232638.png_720x.avif 720w, https://liudon.com/posts/deploy-blog-to-cloudflare-pages/20220729232638.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/deploy-blog-to-cloudflare-pages/20220729232638.png_320x.webp 320w, https://liudon.com/posts/deploy-blog-to-cloudflare-pages/20220729232638.png_480x.webp 480w, https://liudon.com/posts/deploy-blog-to-cloudflare-pages/20220729232638.png_720x.webp 720w, https://liudon.com/posts/deploy-blog-to-cloudflare-pages/20220729232638.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/deploy-blog-to-cloudflare-pages/20220729232638.png\" alt=\"20220729232638\"\n         width=\"1080\" height=\"146\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e虽然\u003ccode\u003eGithub Pages\u003c/code\u003e提供了\u003ccode\u003eEnforce HTTPS\u003c/code\u003e的选项，开启后\u003ccode\u003ehttp\u003c/code\u003e请求会301跳转到\u003ccode\u003ehttps \u003c/code\u003e请求。\u003c/p\u003e\n\u003cp\u003e但是因为返回包缺少\u003ccode\u003eStrict-Transport-Security\u003c/code\u003e的Header头，导致HSTS校验失败。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/deploy-blog-to-cloudflare-pages/20220729234321.png_320x.avif 320w, https://liudon.com/posts/deploy-blog-to-cloudflare-pages/20220729234321.png_480x.avif 480w, https://liudon.com/posts/deploy-blog-to-cloudflare-pages/20220729234321.png_720x.avif 720w, https://liudon.com/posts/deploy-blog-to-cloudflare-pages/20220729234321.png_941x.avif 941w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/deploy-blog-to-cloudflare-pages/20220729234321.png_320x.webp 320w, https://liudon.com/posts/deploy-blog-to-cloudflare-pages/20220729234321.png_480x.webp 480w, https://liudon.com/posts/deploy-blog-to-cloudflare-pages/20220729234321.png_720x.webp 720w, https://liudon.com/posts/deploy-blog-to-cloudflare-pages/20220729234321.png_941x.webp 941w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/deploy-blog-to-cloudflare-pages/20220729234321.png\" alt=\"20220729234321\"\n         width=\"941\" height=\"389\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e为了彻底支持\u003ccode\u003eHSTS\u003c/code\u003e，决定切换到\u003ccode\u003eCloudflare Pages\u003c/code\u003e。\u003c/p\u003e\n\u003ch4 id=\"部署\"\u003e部署\u003c/h4\u003e\n\u003cp\u003e\u003ccode\u003eCloudflare Pages\u003c/code\u003e部署非常简单，授权\u003ccode\u003eGithub\u003c/code\u003e仓库权限，配置好分支即可，这里不多介绍。\u003c/p\u003e\n\u003cp\u003e在\u003ccode\u003eGithub Pages\u003c/code\u003e上，\u003ccode\u003ecode\u003c/code\u003e分支保存原始文件，\u003ccode\u003emaster\u003c/code\u003e分支保存\u003ccode\u003ehugo\u003c/code\u003e构建后的文件。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/deploy-blog-to-cloudflare-pages/20220729234310.png_320x.avif 320w, https://liudon.com/posts/deploy-blog-to-cloudflare-pages/20220729234310.png_480x.avif 480w, https://liudon.com/posts/deploy-blog-to-cloudflare-pages/20220729234310.png_720x.avif 720w, https://liudon.com/posts/deploy-blog-to-cloudflare-pages/20220729234310.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/deploy-blog-to-cloudflare-pages/20220729234310.png_320x.webp 320w, https://liudon.com/posts/deploy-blog-to-cloudflare-pages/20220729234310.png_480x.webp 480w, https://liudon.com/posts/deploy-blog-to-cloudflare-pages/20220729234310.png_720x.webp 720w, https://liudon.com/posts/deploy-blog-to-cloudflare-pages/20220729234310.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/deploy-blog-to-cloudflare-pages/20220729234310.png\" alt=\"20220729234310\"\n         width=\"1080\" height=\"648\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eCloudflare Pages\u003c/code\u003e这里生成分支选择\u003ccode\u003emaster\u003c/code\u003e，同时禁用其他分支的自动构建。\u003c/p\u003e\n\u003cp\u003e这样提交代码后，\u003ccode\u003egithub actions\u003c/code\u003e构建文件提交到\u003ccode\u003emaster\u003c/code\u003e分支，然后触发\u003ccode\u003eCloudflare Pages\u003c/code\u003e部署。\u003c/p\u003e\n\u003cp\u003e这里为什么没有采用\u003ccode\u003eCloudflare Pages\u003c/code\u003e的自动构建呢？因为很慢，构建一次要3分钟左右。\u003c/p\u003e\n\u003cp\u003e采用拉取\u003ccode\u003emaster\u003c/code\u003e构建好的文件的话，只需要7秒左右。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/deploy-blog-to-cloudflare-pages/20220729234651.png_320x.avif 320w, https://liudon.com/posts/deploy-blog-to-cloudflare-pages/20220729234651.png_480x.avif 480w, https://liudon.com/posts/deploy-blog-to-cloudflare-pages/20220729234651.png_720x.avif 720w, https://liudon.com/posts/deploy-blog-to-cloudflare-pages/20220729234651.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/deploy-blog-to-cloudflare-pages/20220729234651.png_320x.webp 320w, https://liudon.com/posts/deploy-blog-to-cloudflare-pages/20220729234651.png_480x.webp 480w, https://liudon.com/posts/deploy-blog-to-cloudflare-pages/20220729234651.png_720x.webp 720w, https://liudon.com/posts/deploy-blog-to-cloudflare-pages/20220729234651.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/deploy-blog-to-cloudflare-pages/20220729234651.png\" alt=\"20220729234651\"\n         width=\"1080\" height=\"368\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003ch4 id=\"补齐header头\"\u003e补齐Header头\u003c/h4\u003e\n\u003cp\u003e部署好后，\u003ccode\u003eCloudflare Pages\u003c/code\u003e的返回也是没有\u003ccode\u003eStrict-Transport-Security\u003c/code\u003eHeader头的。\u003c/p\u003e\n\u003cp\u003e这里需要通过自定义Header头实现，增加\u003ccode\u003e_headers\u003c/code\u003e文件，内容如下：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e/*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"n\"\u003estrict\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003etransport\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003esecurity\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"nb\"\u003emax\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003eage\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"mi\"\u003e31536000\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"n\"\u003eincludeSubDomains\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"nb\"\u003epreload\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/deploy-blog-to-cloudflare-pages/20220729234942.png_320x.avif 320w, https://liudon.com/posts/deploy-blog-to-cloudflare-pages/20220729234942.png_480x.avif 480w, https://liudon.com/posts/deploy-blog-to-cloudflare-pages/20220729234942.png_720x.avif 720w, https://liudon.com/posts/deploy-blog-to-cloudflare-pages/20220729234942.png_971x.avif 971w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/deploy-blog-to-cloudflare-pages/20220729234942.png_320x.webp 320w, https://liudon.com/posts/deploy-blog-to-cloudflare-pages/20220729234942.png_480x.webp 480w, https://liudon.com/posts/deploy-blog-to-cloudflare-pages/20220729234942.png_720x.webp 720w, https://liudon.com/posts/deploy-blog-to-cloudflare-pages/20220729234942.png_971x.webp 971w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/deploy-blog-to-cloudflare-pages/20220729234942.png\" alt=\"20220729234942\"\n         width=\"971\" height=\"282\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e至此\u003ccode\u003eHSTS\u003c/code\u003e搞定。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Strict-Transport-Security\"\u003eHSTS资料\u003c/a\u003e\u003c/p\u003e\n","date_published":"2022-07-29T23:16:01+08:00","tags":["cloudflare pages","github pages","hugo","cloudflare"]},{"title":"奥林匹克公园向日葵之旅","id":"https://liudon.com/posts/olympic-park-sunflower-tour/","url":"https://liudon.com/posts/olympic-park-sunflower-tour/","summary":"\u003cp\u003e媳妇有事回老家了，这两天自己带娃。\u003c/p\u003e\n\u003cp\u003e小区群里有人说奥林匹克公园的向日葵开了，适合拍照。\u003c/p\u003e\n\u003cp\u003e正好周六多云，没有太阳，出门遛娃。\u003c/p\u003e\n\u003cp\u003e带上我好久不用的相机，省得发霉了。\u003c/p\u003e","content_html":"\u003cp\u003e媳妇有事回老家了，这两天自己带娃。\u003c/p\u003e\n\u003cp\u003e小区群里有人说奥林匹克公园的向日葵开了，适合拍照。\u003c/p\u003e\n\u003cp\u003e正好周六多云，没有太阳，出门遛娃。\u003c/p\u003e\n\u003cp\u003e带上我好久不用的相机，省得发霉了。\u003c/p\u003e\n\u003cp\u003e以往都是去的南园，第一次来北园。\u003c/p\u003e\n\u003cp\u003e西门进入，沿着路往右走，一会就到。\u003c/p\u003e\n\u003cp\u003e人很多，估计大家都因为之前疫情在家憋疯了。\u003c/p\u003e\n\u003cp\u003e到了没多久，太阳又出来了，超级晒。\u003c/p\u003e\n\u003cp\u003e提醒一下，看见向日葵园后，继续往前走，前面有观景台，更适合拍照。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/olympic-park-sunflower-tour/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20220725183817.jpg_320x.avif 320w, https://liudon.com/posts/olympic-park-sunflower-tour/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20220725183817.jpg_480x.avif 480w, https://liudon.com/posts/olympic-park-sunflower-tour/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20220725183817.jpg_720x.avif 720w, https://liudon.com/posts/olympic-park-sunflower-tour/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20220725183817.jpg_800x.avif 800w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/olympic-park-sunflower-tour/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20220725183817.jpg_320x.webp 320w, https://liudon.com/posts/olympic-park-sunflower-tour/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20220725183817.jpg_480x.webp 480w, https://liudon.com/posts/olympic-park-sunflower-tour/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20220725183817.jpg_720x.webp 720w, https://liudon.com/posts/olympic-park-sunflower-tour/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20220725183817.jpg_800x.webp 800w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/olympic-park-sunflower-tour/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20220725183817.jpg\" alt=\"向日葵\"\n         width=\"800\" height=\"533\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/olympic-park-sunflower-tour/IMG_3492.JPG_320x.avif 320w, https://liudon.com/posts/olympic-park-sunflower-tour/IMG_3492.JPG_480x.avif 480w, https://liudon.com/posts/olympic-park-sunflower-tour/IMG_3492.JPG_720x.avif 720w, https://liudon.com/posts/olympic-park-sunflower-tour/IMG_3492.JPG_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/olympic-park-sunflower-tour/IMG_3492.JPG_320x.webp 320w, https://liudon.com/posts/olympic-park-sunflower-tour/IMG_3492.JPG_480x.webp 480w, https://liudon.com/posts/olympic-park-sunflower-tour/IMG_3492.JPG_720x.webp 720w, https://liudon.com/posts/olympic-park-sunflower-tour/IMG_3492.JPG_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/olympic-park-sunflower-tour/IMG_3492.JPG\" alt=\"向日葵\"\n         width=\"1080\" height=\"720\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/olympic-park-sunflower-tour/IMG_3556.JPG_320x.avif 320w, https://liudon.com/posts/olympic-park-sunflower-tour/IMG_3556.JPG_480x.avif 480w, https://liudon.com/posts/olympic-park-sunflower-tour/IMG_3556.JPG_720x.avif 720w, https://liudon.com/posts/olympic-park-sunflower-tour/IMG_3556.JPG_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/olympic-park-sunflower-tour/IMG_3556.JPG_320x.webp 320w, https://liudon.com/posts/olympic-park-sunflower-tour/IMG_3556.JPG_480x.webp 480w, https://liudon.com/posts/olympic-park-sunflower-tour/IMG_3556.JPG_720x.webp 720w, https://liudon.com/posts/olympic-park-sunflower-tour/IMG_3556.JPG_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/olympic-park-sunflower-tour/IMG_3556.JPG\" alt=\"荷花\"\n         width=\"1080\" height=\"720\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\n\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/olympic-park-sunflower-tour/IMG_3549.JPG_320x.avif 320w, https://liudon.com/posts/olympic-park-sunflower-tour/IMG_3549.JPG_480x.avif 480w, https://liudon.com/posts/olympic-park-sunflower-tour/IMG_3549.JPG_720x.avif 720w, https://liudon.com/posts/olympic-park-sunflower-tour/IMG_3549.JPG_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/olympic-park-sunflower-tour/IMG_3549.JPG_320x.webp 320w, https://liudon.com/posts/olympic-park-sunflower-tour/IMG_3549.JPG_480x.webp 480w, https://liudon.com/posts/olympic-park-sunflower-tour/IMG_3549.JPG_720x.webp 720w, https://liudon.com/posts/olympic-park-sunflower-tour/IMG_3549.JPG_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/olympic-park-sunflower-tour/IMG_3549.JPG\" alt=\"荷叶上的蜻蜓\"\n         width=\"1080\" height=\"720\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n","image":"https://liudon.com/posts/olympic-park-sunflower-tour/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20220725183817.jpg","date_published":"2022-07-21T20:40:20+08:00","tags":["带着相机晒太阳","遛娃"]},{"title":"记第二次洗牙","id":"https://liudon.com/posts/%E8%AE%B0%E7%AC%AC%E4%BA%8C%E6%AC%A1%E6%B4%97%E7%89%99/","url":"https://liudon.com/posts/%E8%AE%B0%E7%AC%AC%E4%BA%8C%E6%AC%A1%E6%B4%97%E7%89%99/","summary":"\u003cp\u003e最近刷牙的时候，牙龈总是出血。\u003c/p\u003e\n\u003cp\u003e距离上一次洗牙，已经有好几年了，感觉又该去洗一下牙了。\u003c/p\u003e\n\u003cp\u003e上次跟媳妇两个人，在小区外面的私人诊所洗的，俩人花了1000多块钱。\u003c/p\u003e","content_html":"\u003cp\u003e最近刷牙的时候，牙龈总是出血。\u003c/p\u003e\n\u003cp\u003e距离上一次洗牙，已经有好几年了，感觉又该去洗一下牙了。\u003c/p\u003e\n\u003cp\u003e上次跟媳妇两个人，在小区外面的私人诊所洗的，俩人花了1000多块钱。\u003c/p\u003e\n\u003cp\u003e这次决定去医院看看，提前挂了号。\u003c/p\u003e\n\u003cp\u003e医生看过后，说得洗牙，不过当天只能先做洗牙前的检查，洗牙得预约。\u003c/p\u003e\n\u003cp\u003e开单子抽血检查，完事回家。\u003c/p\u003e\n\u003cp\u003e到了预约的日子，约的是4点，3点左右就到医院了。\u003c/p\u003e\n\u003cp\u003e15:57轮到我，进去一共20分钟完事。\u003c/p\u003e\n\u003cp\u003e我以为还有别的事项，结果医生说好了。\u003c/p\u003e\n\u003cp\u003e我说我感觉牙里卡着个东西，医生又拿起装备给我洗了一遍。\u003c/p\u003e\n\u003cp\u003e上次洗牙花了快1个小时，这也太快了。\u003c/p\u003e\n\u003cp\u003e洗牙费用380元，可以走医保报销。\u003c/p\u003e\n\u003cp\u003e以往都说医院洗牙贵，没成想外面私人的要更贵。\u003c/p\u003e\n","date_published":"2022-06-21T21:58:49+08:00","tags":[]},{"title":"记录2022年海淀幼升小","id":"https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/","url":"https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/","summary":"\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220525202612.png_320x.avif 320w, https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220525202612.png_480x.avif 480w, https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220525202612.png_720x.avif 720w, https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220525202612.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220525202612.png_320x.webp 320w, https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220525202612.png_480x.webp 480w, https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220525202612.png_720x.webp 720w, https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220525202612.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220525202612.png\" alt=\"20220525202612\"\n         width=\"1080\" height=\"1262\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e18年的热点新闻，纳税千万孩子无法在北京上学。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e一直听说外地人在北京上学难，今年娃到了上小学的年纪，也算真实的体验了一把上学的难。\u003c/p\u003e","content_html":"\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220525202612.png_320x.avif 320w, https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220525202612.png_480x.avif 480w, https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220525202612.png_720x.avif 720w, https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220525202612.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220525202612.png_320x.webp 320w, https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220525202612.png_480x.webp 480w, https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220525202612.png_720x.webp 720w, https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220525202612.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220525202612.png\" alt=\"20220525202612\"\n         width=\"1080\" height=\"1262\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e18年的热点新闻，纳税千万孩子无法在北京上学。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e一直听说外地人在北京上学难，今年娃到了上小学的年纪，也算真实的体验了一把上学的难。\u003c/p\u003e\n\u003cp\u003e提前在网上搜了一番资料，都是一些机构整理的信息。\u003c/p\u003e\n\u003cp\u003e没有找到具体分享的记录，自己整理了下，希望能帮助到其他人。\u003c/p\u003e\n\u003ch3 id=\"1-信息采集\"\u003e1. 信息采集\u003c/h3\u003e\n\u003cp\u003e5月5日，采集系统开放。\u003c/p\u003e\n\u003cp\u003e当天下午录入相关信息，提交网上审核。\u003c/p\u003e\n\u003ch3 id=\"2-网上审核\"\u003e2. 网上审核\u003c/h3\u003e\n\u003cp\u003e信息提交后，就开始了漫长的审核时间。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e5月06日 户口信息审核通过\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e5月14日 居住证审核通过\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e5月16日 居住证明审核通过\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e5月19日 工作证明审核通过\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220527202411.png_320x.avif 320w, https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220527202411.png_480x.avif 480w, https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220527202411.png_720x.avif 720w, https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220527202411.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220527202411.png_320x.webp 320w, https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220527202411.png_480x.webp 480w, https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220527202411.png_720x.webp 720w, https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220527202411.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220527202411.png\" alt=\"20220527202411\"\n         width=\"1080\" height=\"683\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003ch3 id=\"3-线下审核\"\u003e3. 线下审核\u003c/h3\u003e\n\u003cp\u003e网上审核通过后，打印入学申请表，预约线下审核时间。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220527202458.png_320x.avif 320w, https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220527202458.png_480x.avif 480w, https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220527202458.png_720x.avif 720w, https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220527202458.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220527202458.png_320x.webp 320w, https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220527202458.png_480x.webp 480w, https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220527202458.png_720x.webp 720w, https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220527202458.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220527202458.png\" alt=\"20220527202458\"\n         width=\"1080\" height=\"333\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e这里还有一个插曲，本来以为线下审核是在社区居委会。\u003c/p\u003e\n\u003cp\u003e周六的时候，在小学入学群里聊天，有人说是在学区审核。\u003c/p\u003e\n\u003cp\u003e后来交流一番后，发现是自己理解错了。\u003c/p\u003e\n\u003cp\u003e这里是要先去社区审核盖章，然后再到学区交资料走线下审核。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e5月22日 社区居委会审核盖章\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e5月25日 到街道递交审核材料\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220525204053.png_320x.avif 320w, https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220525204053.png_480x.avif 480w, https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220525204053.png_720x.avif 720w, https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220525204053.png_922x.avif 922w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220525204053.png_320x.webp 320w, https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220525204053.png_480x.webp 480w, https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220525204053.png_720x.webp 720w, https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220525204053.png_922x.webp 922w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220525204053.png\" alt=\"街道审核\"\n         width=\"922\" height=\"1182\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e如果你是外地集体户口，需要准备集体户口首页（复印件需要加盖公章）。\u003c/li\u003e\n\u003cli\u003e工作证明还需要提供满足时间要求的社保缴费记录。\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"4-审核通过\"\u003e4. 审核通过\u003c/h3\u003e\n\u003cp\u003e5月27日，审核通过后，打印信息采集表。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220527202545.png_320x.avif 320w, https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220527202545.png_480x.avif 480w, https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220527202545.png_720x.avif 720w, https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220527202545.png_868x.avif 868w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220527202545.png_320x.webp 320w, https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220527202545.png_480x.webp 480w, https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220527202545.png_720x.webp 720w, https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220527202545.png_868x.webp 868w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220527202545.png\" alt=\"20220527202545\"\n         width=\"868\" height=\"488\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003ch3 id=\"5-学校登记\"\u003e5. 学校登记\u003c/h3\u003e\n\u003cp\u003e6月1日对口学校发布入学登记通知书。\u003c/p\u003e\n\u003cp\u003e按通知书准备资料，到登记时间去学校交资料。\u003c/p\u003e\n\u003cp\u003e今年遇到疫情，改为线上邮件发送资料登记了。\u003c/p\u003e\n\u003ch3 id=\"6-填报志愿\"\u003e6. 填报志愿\u003c/h3\u003e\n\u003cp\u003e6月23日，海淀教育发文\u003ca href=\"https://mp.weixin.qq.com/s/UFoFysrhG2HkzREBpDVkuQ\"\u003e1911后填报志愿通知\u003c/a\u003e。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220629215840.png_320x.avif 320w, https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220629215840.png_480x.avif 480w, https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220629215840.png_720x.avif 720w, https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220629215840.png_766x.avif 766w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220629215840.png_320x.webp 320w, https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220629215840.png_480x.webp 480w, https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220629215840.png_720x.webp 720w, https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220629215840.png_766x.webp 766w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220629215840.png\" alt=\"20220629215840\"\n         width=\"766\" height=\"1290\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e第一志愿锁定，其他志愿自己选择填报。\u003c/p\u003e\n\u003cp\u003e6月25日锁定，不允许再修改。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e网上消息，第一志愿锁定，说明有1911后名额，有机会选中。\u003c/p\u003e\n\u003cp\u003e租房的不需要填报志愿，等待派位。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch3 id=\"7-查看结果\"\u003e7. 查看结果\u003c/h3\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220629220638.png_310x.avif 310w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220629220638.png_310x.webp 310w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220629220638.png\" alt=\"20220629220638\"\n         width=\"310\" height=\"298\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e6月29日15点，系统开放结果查询。\u003c/p\u003e\n\u003cp\u003e第一志愿录取，一直担心的调剂没有发生。\u003c/p\u003e\n\u003cp\u003e7月10日，收到教委短信，系统查询录取通知书。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220710085749.png_320x.avif 320w, https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220710085749.png_480x.avif 480w, https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220710085749.png_720x.avif 720w, https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220710085749.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220710085749.png_320x.webp 320w, https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220710085749.png_480x.webp 480w, https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220710085749.png_720x.webp 720w, https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220710085749.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220710085749.png\" alt=\"20220710085749\"\n         width=\"1080\" height=\"282\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220710084342.png_320x.avif 320w, https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220710084342.png_480x.avif 480w, https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220710084342.png_720x.avif 720w, https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220710084342.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220710084342.png_320x.webp 320w, https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220710084342.png_480x.webp 480w, https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220710084342.png_720x.webp 720w, https://liudon.com/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220710084342.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/%E8%AE%B0%E5%BD%952022%E5%B9%B4%E6%B5%B7%E6%B7%80%E5%B9%BC%E5%8D%87%E5%B0%8F/20220710084342.png\" alt=\"20220710084342\"\n         width=\"1080\" height=\"449\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e历时1个多月的幼升小总算落地了。\u003c/p\u003e\n","date_published":"2022-05-25T20:10:01+08:00","tags":["幼升小","非京籍","北京幼升小"]},{"title":"Golang解析json的一个问题","id":"https://liudon.com/posts/golang%E8%A7%A3%E6%9E%90json%E7%9A%84%E4%B8%80%E4%B8%AA%E9%97%AE%E9%A2%98/","url":"https://liudon.com/posts/golang%E8%A7%A3%E6%9E%90json%E7%9A%84%E4%B8%80%E4%B8%AA%E9%97%AE%E9%A2%98/","summary":"\u003cp\u003e业务模块从\u003ccode\u003ephp\u003c/code\u003e迁移到\u003ccode\u003egolang\u003c/code\u003e下了，最近遇到一个golang下json解析的问题：\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e请求接口，按返回包字段判断请求成功与否。\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e伪代码如下：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003epackage\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003emain\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;encoding/json\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;fmt\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003etype\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eResponse\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003estruct\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eCode\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"s\"\u003e`json:\u0026#34;code\u0026#34;`\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eMsg\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e`json:\u0026#34;msg\u0026#34;`\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003emain\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"c1\"\u003e// 场景1，返回包符合接口要求\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003estr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e`{\u0026#34;code\u0026#34;:100,\u0026#34;msg\u0026#34;:\u0026#34;failed\u0026#34;}`\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"kd\"\u003evar\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eres\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eResponse\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ejson\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eUnmarshal\u003c/span\u003e\u003cspan class=\"p\"\u003e([]\u003c/span\u003e\u003cspan class=\"nb\"\u003ebyte\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003estr\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nx\"\u003eres\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003efmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003ePrintf\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;res=%+v\\n\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eres\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// 解析正确，符合预期\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"c1\"\u003e// res={Code:100 Msg:failed}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"c1\"\u003e// 场景2，返回包不符合接口要求，缺少相关字段\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003estr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e`{\u0026#34;retCode\u0026#34;:100,\u0026#34;retMsg\u0026#34;:\u0026#34;failed\u0026#34;}`\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"kd\"\u003evar\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eres1\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eResponse\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ejson\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eUnmarshal\u003c/span\u003e\u003cspan class=\"p\"\u003e([]\u003c/span\u003e\u003cspan class=\"nb\"\u003ebyte\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003estr\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nx\"\u003eres1\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003efmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003ePrintf\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;res=%+v\\n\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eres1\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// 解析错误，不符合预期\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"c1\"\u003e// res={Code:0 Msg:}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e这里由于接口地址配置错误，导致请求到其他接口，返回包不符合协议要求。\u003c/p\u003e","content_html":"\u003cp\u003e业务模块从\u003ccode\u003ephp\u003c/code\u003e迁移到\u003ccode\u003egolang\u003c/code\u003e下了，最近遇到一个golang下json解析的问题：\u003c/p\u003e\n\u003cpre\u003e\u003ccode\u003e请求接口，按返回包字段判断请求成功与否。\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003e伪代码如下：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003epackage\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003emain\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;encoding/json\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;fmt\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003etype\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eResponse\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003estruct\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eCode\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"s\"\u003e`json:\u0026#34;code\u0026#34;`\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eMsg\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e`json:\u0026#34;msg\u0026#34;`\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003emain\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"c1\"\u003e// 场景1，返回包符合接口要求\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003estr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e`{\u0026#34;code\u0026#34;:100,\u0026#34;msg\u0026#34;:\u0026#34;failed\u0026#34;}`\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"kd\"\u003evar\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eres\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eResponse\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ejson\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eUnmarshal\u003c/span\u003e\u003cspan class=\"p\"\u003e([]\u003c/span\u003e\u003cspan class=\"nb\"\u003ebyte\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003estr\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nx\"\u003eres\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003efmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003ePrintf\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;res=%+v\\n\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eres\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// 解析正确，符合预期\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"c1\"\u003e// res={Code:100 Msg:failed}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"c1\"\u003e// 场景2，返回包不符合接口要求，缺少相关字段\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003estr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e`{\u0026#34;retCode\u0026#34;:100,\u0026#34;retMsg\u0026#34;:\u0026#34;failed\u0026#34;}`\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"kd\"\u003evar\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eres1\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eResponse\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ejson\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eUnmarshal\u003c/span\u003e\u003cspan class=\"p\"\u003e([]\u003c/span\u003e\u003cspan class=\"nb\"\u003ebyte\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003estr\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nx\"\u003eres1\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003efmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003ePrintf\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;res=%+v\\n\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eres1\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// 解析错误，不符合预期\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"c1\"\u003e// res={Code:0 Msg:}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e这里由于接口地址配置错误，导致请求到其他接口，返回包不符合协议要求。\u003c/p\u003e\n\u003cp\u003e缺少\u003ccode\u003ecode\u003c/code\u003e字段，\u003ccode\u003eUnmarshal\u003c/code\u003e解析后，按默认值处理，所以\u003ccode\u003ecode\u003c/code\u003e为0，导致验证出错。\u003c/p\u003e\n\u003cp\u003e修正方案：\u003c/p\u003e\n\u003cp\u003e将\u003ccode\u003eCode\u003c/code\u003e字段定义为引用类型，通过判断地址是否为\u003ccode\u003enil\u003c/code\u003e来区分缺少字段的情况。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-go\" data-lang=\"go\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003epackage\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003emain\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kn\"\u003eimport\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;encoding/json\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;fmt\u0026#34;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003etype\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eResponse\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kd\"\u003estruct\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eCode\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"w\"\u003e   \u003c/span\u003e\u003cspan class=\"s\"\u003e`json:\u0026#34;code\u0026#34;`\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003eMsg\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e`json:\u0026#34;msg\u0026#34;`\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunc\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003emain\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"c1\"\u003e// 返回包符合接口要求\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003estr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e:=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e`{\u0026#34;code\u0026#34;:100,\u0026#34;msg\u0026#34;:\u0026#34;failed\u0026#34;}`\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"kd\"\u003evar\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eres\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eResponse\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ejson\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eUnmarshal\u003c/span\u003e\u003cspan class=\"p\"\u003e([]\u003c/span\u003e\u003cspan class=\"nb\"\u003ebyte\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003estr\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nx\"\u003eres\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003efmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003ePrintf\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;res=%+v\\n\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eres\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"c1\"\u003e// 解析正确，符合预期\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"c1\"\u003e// res={Code:100 Msg:failed}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eres\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eCode\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e||\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eres\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eCode\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003efmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003ePrintln\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;request failed\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"c1\"\u003e// 返回包不符合接口要求，缺少相关字段\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003estr\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"s\"\u003e`{\u0026#34;id\u0026#34;:1}`\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"kd\"\u003evar\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eres1\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eResponse\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003ejson\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003eUnmarshal\u003c/span\u003e\u003cspan class=\"p\"\u003e([]\u003c/span\u003e\u003cspan class=\"nb\"\u003ebyte\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003estr\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u003c/span\u003e\u003cspan class=\"nx\"\u003eres1\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"nx\"\u003efmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003ePrintf\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;res=%+v\\n\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eres1\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"c1\"\u003e// 解析错误，不符合预期\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"c1\"\u003e// res={Code:0 Msg:}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nx\"\u003eres1\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eCode\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kc\"\u003enil\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e||\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"nx\"\u003eres1\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eCode\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\t\u003c/span\u003e\u003cspan class=\"nx\"\u003efmt\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nf\"\u003ePrintln\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;request failed\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\t\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e参考资料：\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://www.calhoun.io/how-to-determine-if-a-json-key-has-been-set-to-null-or-not-provided/\"\u003ehow-to-determine-if-a-json-key-has-been-set-to-null-or-not-provided\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://apoorv.blog/json-key-not-set-null-golang/\"\u003ejson-key-not-set-null-golang\u003c/a\u003e\u003c/p\u003e\n","date_published":"2022-05-20T21:18:23+08:00","tags":["golang"]},{"title":"疫情下的生活","id":"https://liudon.com/posts/%E7%96%AB%E6%83%85%E4%B8%8B%E7%9A%84%E7%94%9F%E6%B4%BB/","url":"https://liudon.com/posts/%E7%96%AB%E6%83%85%E4%B8%8B%E7%9A%84%E7%94%9F%E6%B4%BB/","summary":"\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/%E7%96%AB%E6%83%85%E4%B8%8B%E7%9A%84%E7%94%9F%E6%B4%BB/20220520-192500@2x.png_320x.avif 320w, https://liudon.com/posts/%E7%96%AB%E6%83%85%E4%B8%8B%E7%9A%84%E7%94%9F%E6%B4%BB/20220520-192500@2x.png_480x.avif 480w, https://liudon.com/posts/%E7%96%AB%E6%83%85%E4%B8%8B%E7%9A%84%E7%94%9F%E6%B4%BB/20220520-192500@2x.png_720x.avif 720w, https://liudon.com/posts/%E7%96%AB%E6%83%85%E4%B8%8B%E7%9A%84%E7%94%9F%E6%B4%BB/20220520-192500@2x.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/%E7%96%AB%E6%83%85%E4%B8%8B%E7%9A%84%E7%94%9F%E6%B4%BB/20220520-192500@2x.png_320x.webp 320w, https://liudon.com/posts/%E7%96%AB%E6%83%85%E4%B8%8B%E7%9A%84%E7%94%9F%E6%B4%BB/20220520-192500@2x.png_480x.webp 480w, https://liudon.com/posts/%E7%96%AB%E6%83%85%E4%B8%8B%E7%9A%84%E7%94%9F%E6%B4%BB/20220520-192500@2x.png_720x.webp 720w, https://liudon.com/posts/%E7%96%AB%E6%83%85%E4%B8%8B%E7%9A%84%E7%94%9F%E6%B4%BB/20220520-192500@2x.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/%E7%96%AB%E6%83%85%E4%B8%8B%E7%9A%84%E7%94%9F%E6%B4%BB/20220520-192500@2x.png\" alt=\"20220520-192500@2x\"\n         width=\"1080\" height=\"692\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e不知不觉，北京这一波疫情已经一个月了，目前还是每天50例左右新增。\u003c/p\u003e\n\u003cp\u003e昨天看新闻，基本没有社会面新增了，感觉要解封了。\u003c/p\u003e","content_html":"\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/%E7%96%AB%E6%83%85%E4%B8%8B%E7%9A%84%E7%94%9F%E6%B4%BB/20220520-192500@2x.png_320x.avif 320w, https://liudon.com/posts/%E7%96%AB%E6%83%85%E4%B8%8B%E7%9A%84%E7%94%9F%E6%B4%BB/20220520-192500@2x.png_480x.avif 480w, https://liudon.com/posts/%E7%96%AB%E6%83%85%E4%B8%8B%E7%9A%84%E7%94%9F%E6%B4%BB/20220520-192500@2x.png_720x.avif 720w, https://liudon.com/posts/%E7%96%AB%E6%83%85%E4%B8%8B%E7%9A%84%E7%94%9F%E6%B4%BB/20220520-192500@2x.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/%E7%96%AB%E6%83%85%E4%B8%8B%E7%9A%84%E7%94%9F%E6%B4%BB/20220520-192500@2x.png_320x.webp 320w, https://liudon.com/posts/%E7%96%AB%E6%83%85%E4%B8%8B%E7%9A%84%E7%94%9F%E6%B4%BB/20220520-192500@2x.png_480x.webp 480w, https://liudon.com/posts/%E7%96%AB%E6%83%85%E4%B8%8B%E7%9A%84%E7%94%9F%E6%B4%BB/20220520-192500@2x.png_720x.webp 720w, https://liudon.com/posts/%E7%96%AB%E6%83%85%E4%B8%8B%E7%9A%84%E7%94%9F%E6%B4%BB/20220520-192500@2x.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/%E7%96%AB%E6%83%85%E4%B8%8B%E7%9A%84%E7%94%9F%E6%B4%BB/20220520-192500@2x.png\" alt=\"20220520-192500@2x\"\n         width=\"1080\" height=\"692\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e不知不觉，北京这一波疫情已经一个月了，目前还是每天50例左右新增。\u003c/p\u003e\n\u003cp\u003e昨天看新闻，基本没有社会面新增了，感觉要解封了。\u003c/p\u003e\n\u003cp\u003e没想到今天直接被打脸，封控升级了。\u003c/p\u003e\n\u003cp\u003e居家办公已经快两周了，也不知道这种日子还要多久。\u003c/p\u003e\n\u003cp\u003e在家使用Mac(13寸 m1)办公，屏幕太小，两周下来感觉眼睛要瞎了。\u003c/p\u003e\n\u003cp\u003e媳妇帮我想了个办法，投屏到电视上。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/%E7%96%AB%E6%83%85%E4%B8%8B%E7%9A%84%E7%94%9F%E6%B4%BB/20220520194127.png_320x.avif 320w, https://liudon.com/posts/%E7%96%AB%E6%83%85%E4%B8%8B%E7%9A%84%E7%94%9F%E6%B4%BB/20220520194127.png_480x.avif 480w, https://liudon.com/posts/%E7%96%AB%E6%83%85%E4%B8%8B%E7%9A%84%E7%94%9F%E6%B4%BB/20220520194127.png_720x.avif 720w, https://liudon.com/posts/%E7%96%AB%E6%83%85%E4%B8%8B%E7%9A%84%E7%94%9F%E6%B4%BB/20220520194127.png_912x.avif 912w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/%E7%96%AB%E6%83%85%E4%B8%8B%E7%9A%84%E7%94%9F%E6%B4%BB/20220520194127.png_320x.webp 320w, https://liudon.com/posts/%E7%96%AB%E6%83%85%E4%B8%8B%E7%9A%84%E7%94%9F%E6%B4%BB/20220520194127.png_480x.webp 480w, https://liudon.com/posts/%E7%96%AB%E6%83%85%E4%B8%8B%E7%9A%84%E7%94%9F%E6%B4%BB/20220520194127.png_720x.webp 720w, https://liudon.com/posts/%E7%96%AB%E6%83%85%E4%B8%8B%E7%9A%84%E7%94%9F%E6%B4%BB/20220520194127.png_912x.webp 912w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/%E7%96%AB%E6%83%85%E4%B8%8B%E7%9A%84%E7%94%9F%E6%B4%BB/20220520194127.png\" alt=\"20220520194127\"\n         width=\"912\" height=\"1202\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e居家不出门，实在没动力收拾，现在胡子拉碴，一周可能收拾一次。\u003c/p\u003e\n\u003cp\u003e不知道这波还要多久。\u003c/p\u003e\n","date_published":"2022-05-20T19:17:57+08:00","tags":["疫情","北京"]},{"title":"整理下博客的一些调整","id":"https://liudon.com/posts/%E6%95%B4%E7%90%86%E4%B8%8B%E5%8D%9A%E5%AE%A2%E7%9A%84%E4%B8%80%E4%BA%9B%E8%B0%83%E6%95%B4/","url":"https://liudon.com/posts/%E6%95%B4%E7%90%86%E4%B8%8B%E5%8D%9A%E5%AE%A2%E7%9A%84%E4%B8%80%E4%BA%9B%E8%B0%83%E6%95%B4/","summary":"\u003cp\u003e新域名上线一段时间了，通过\u003ccode\u003eGoogle Search Console\u003c/code\u003e发现了一些问题，整理下最近进行的一些调整。\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e更新主题版本，展示文章tag标签\n通过对比主题作者的网站，发现使用的不是最新代码。\u003c/p\u003e","content_html":"\u003cp\u003e新域名上线一段时间了，通过\u003ccode\u003eGoogle Search Console\u003c/code\u003e发现了一些问题，整理下最近进行的一些调整。\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e更新主题版本，展示文章tag标签\n通过对比主题作者的网站，发现使用的不是最新代码。\u003c/p\u003e\n\u003cp\u003e通过调整\u003ccode\u003eGithub Actions\u003c/code\u003e命令解决：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e- name: Checkout repository\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    uses: actions/checkout@v2\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  - name: Checkout submodules\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    run: git submodule update --init --recursive --remote\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e修正404页面不生效的问题\n主题是自带了404.html文件的，但是部署后没有生成对应文件。\u003c/p\u003e\n\u003cp\u003e修改404.html文件内容后解决，具体原因没有深究，感觉是文件内容不是完整html导致。\u003c/p\u003e\n\u003cp\u003e可参考\u003ca href=\"https://github.com/Liudon/liudon.github.io/blob/code/layouts/404.html\"\u003e文件代码\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e两个域名导致的页面权重问题\n发现有些页面\u003ccode\u003eliudon.xyz\u003c/code\u003e收录后，\u003ccode\u003eliudon.com\u003c/code\u003e就不再收录。\u003c/p\u003e\n\u003cp\u003e为了规避这种收录问题，将\u003ccode\u003eliudon.xyz\u003c/code\u003e直接301到了\u003ccode\u003eliudon.com\u003c/code\u003e上。\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e目前已调整完毕，观察后续收录情况。\u003c/p\u003e\n","date_published":"2022-05-13T18:20:52+08:00","tags":["博客","收录"]},{"title":"疫情下的五一假期","id":"https://liudon.com/posts/%E7%96%AB%E6%83%85%E4%B8%8B%E7%9A%84%E4%BA%94%E4%B8%80%E5%81%87%E6%9C%9F/","url":"https://liudon.com/posts/%E7%96%AB%E6%83%85%E4%B8%8B%E7%9A%84%E4%BA%94%E4%B8%80%E5%81%87%E6%9C%9F/","summary":"\u003cp\u003e五一假期前一周，北京疫情又起，说是已经隐蔽传播一周了。\u003c/p\u003e\n\u003cp\u003e当天晚上大家就开始屯货了，晚上看着APP里可买的东西一点点没了。\u003c/p\u003e\n\u003cp\u003e说实话，出现几粒确诊没有慌，这么抢购搞的有点心慌了，也下单买了点东西。\u003c/p\u003e","content_html":"\u003cp\u003e五一假期前一周，北京疫情又起，说是已经隐蔽传播一周了。\u003c/p\u003e\n\u003cp\u003e当天晚上大家就开始屯货了，晚上看着APP里可买的东西一点点没了。\u003c/p\u003e\n\u003cp\u003e说实话，出现几粒确诊没有慌，这么抢购搞的有点心慌了，也下单买了点东西。\u003c/p\u003e\n\u003cp\u003e毕竟老话说的好，手中有粮，心里不慌。\u003c/p\u003e\n\u003cp\u003e第二天出去做核酸，特意去了趟超市，想着再买点肉，结果超市也是各种采购，东西都没了，空手而归。\u003c/p\u003e\n\u003cp\u003e工作上五一前有两个大版本的功能要发布，提前1周需求才提，节前这一周忙的要死，还赶上了疫情，好在赶在发布截止日总算发出去了。\u003c/p\u003e\n\u003cp\u003e就五一当天带娃去了家旁边的公园遛了下，这次轮滑滑的不错，一直玩到晚上7点才回家。\u003c/p\u003e\n\u003cp\u003e夏天到了，北京的杨絮、柳絮各种满天飞，出门真是受罪，其余时间都在家呆着了，偶尔下楼在小区玩会。\u003c/p\u003e\n\u003cp\u003e这个假期基本上每天核酸，感觉以后要常态化核酸了。\u003c/p\u003e\n\u003cp\u003e老家在假期里突然也疫情又起，县城整个封控了，不过老爸还是回到家了，过程稍微费了点劲。\u003c/p\u003e\n\u003cp\u003e突然发现今年的疫情貌似就没消停过，去年五一假期的时候在老家烧烤，今年还不知道什么时候能回家。\u003c/p\u003e\n\u003cp\u003e这疫情什么时候是个头啊……\u003c/p\u003e\n","date_published":"2022-05-05T20:22:23+08:00","tags":["疫情"]},{"title":"自己动手，更换thinkpad x1硬盘","id":"https://liudon.com/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/","url":"https://liudon.com/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/","summary":"\u003cp\u003e电脑突然没法用了，提示\u0026quot;A disk read error occurred\u0026quot;的错误。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/491650584526_.pic.jpg_320x.avif 320w, https://liudon.com/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/491650584526_.pic.jpg_480x.avif 480w, https://liudon.com/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/491650584526_.pic.jpg_720x.avif 720w, https://liudon.com/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/491650584526_.pic.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/491650584526_.pic.jpg_320x.webp 320w, https://liudon.com/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/491650584526_.pic.jpg_480x.webp 480w, https://liudon.com/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/491650584526_.pic.jpg_720x.webp 720w, https://liudon.com/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/491650584526_.pic.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/491650584526_.pic.jpg\" alt=\"491650584526_.pic\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e多次重启也不行，感觉是硬盘挂了。\u003c/p\u003e","content_html":"\u003cp\u003e电脑突然没法用了，提示\u0026quot;A disk read error occurred\u0026quot;的错误。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/491650584526_.pic.jpg_320x.avif 320w, https://liudon.com/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/491650584526_.pic.jpg_480x.avif 480w, https://liudon.com/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/491650584526_.pic.jpg_720x.avif 720w, https://liudon.com/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/491650584526_.pic.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/491650584526_.pic.jpg_320x.webp 320w, https://liudon.com/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/491650584526_.pic.jpg_480x.webp 480w, https://liudon.com/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/491650584526_.pic.jpg_720x.webp 720w, https://liudon.com/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/491650584526_.pic.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/491650584526_.pic.jpg\" alt=\"491650584526_.pic\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e多次重启也不行，感觉是硬盘挂了。\u003c/p\u003e\n\u003cp\u003e机器去年过保了，之前有过在售后维护的经历，费用不低，这次决定自己动手。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/WechatIMG64.jpeg_320x.avif 320w, https://liudon.com/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/WechatIMG64.jpeg_480x.avif 480w, https://liudon.com/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/WechatIMG64.jpeg_720x.avif 720w, https://liudon.com/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/WechatIMG64.jpeg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/WechatIMG64.jpeg_320x.webp 320w, https://liudon.com/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/WechatIMG64.jpeg_480x.webp 480w, https://liudon.com/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/WechatIMG64.jpeg_720x.webp 720w, https://liudon.com/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/WechatIMG64.jpeg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/WechatIMG64.jpeg\" alt=\"WechatIMG64\"\n         width=\"1080\" height=\"1249\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e一共就5个螺丝，打开后盖。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/621650757850_.pic.jpg_320x.avif 320w, https://liudon.com/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/621650757850_.pic.jpg_480x.avif 480w, https://liudon.com/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/621650757850_.pic.jpg_720x.avif 720w, https://liudon.com/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/621650757850_.pic.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/621650757850_.pic.jpg_320x.webp 320w, https://liudon.com/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/621650757850_.pic.jpg_480x.webp 480w, https://liudon.com/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/621650757850_.pic.jpg_720x.webp 720w, https://liudon.com/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/621650757850_.pic.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/621650757850_.pic.jpg\" alt=\"621650757850_.pic\"\n         width=\"1080\" height=\"1250\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e可以看到电池旁边的螺丝，拧下取出电池。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/631650757850_.pic.jpg_320x.avif 320w, https://liudon.com/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/631650757850_.pic.jpg_480x.avif 480w, https://liudon.com/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/631650757850_.pic.jpg_720x.avif 720w, https://liudon.com/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/631650757850_.pic.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/631650757850_.pic.jpg_320x.webp 320w, https://liudon.com/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/631650757850_.pic.jpg_480x.webp 480w, https://liudon.com/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/631650757850_.pic.jpg_720x.webp 720w, https://liudon.com/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/631650757850_.pic.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/631650757850_.pic.jpg\" alt=\"631650757850_.pic\"\n         width=\"1080\" height=\"1439\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e拧开硬盘上的固定螺丝，取出硬盘。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/541650584531_.pic.jpg_320x.avif 320w, https://liudon.com/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/541650584531_.pic.jpg_480x.avif 480w, https://liudon.com/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/541650584531_.pic.jpg_720x.avif 720w, https://liudon.com/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/541650584531_.pic.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/541650584531_.pic.jpg_320x.webp 320w, https://liudon.com/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/541650584531_.pic.jpg_480x.webp 480w, https://liudon.com/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/541650584531_.pic.jpg_720x.webp 720w, https://liudon.com/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/541650584531_.pic.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/541650584531_.pic.jpg\" alt=\"541650584531_.pic\"\n         width=\"1080\" height=\"1441\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e印象里硬盘还是那种又大又厚的样子，没想到现在都这么小一块了。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/WechatIMG55.jpeg_320x.avif 320w, https://liudon.com/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/WechatIMG55.jpeg_480x.avif 480w, https://liudon.com/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/WechatIMG55.jpeg_720x.avif 720w, https://liudon.com/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/WechatIMG55.jpeg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/WechatIMG55.jpeg_320x.webp 320w, https://liudon.com/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/WechatIMG55.jpeg_480x.webp 480w, https://liudon.com/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/WechatIMG55.jpeg_720x.webp 720w, https://liudon.com/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/WechatIMG55.jpeg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/WechatIMG55.jpeg\" alt=\"WechatIMG55\"\n         width=\"1080\" height=\"1441\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e我在京东买的\u003ca href=\"https://u.jd.com/Zdch2qO\"\u003e三星970 EVO Plus\u003c/a\u003e这款，顺利换上。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/611650757849_.pic.jpg_320x.avif 320w, https://liudon.com/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/611650757849_.pic.jpg_480x.avif 480w, https://liudon.com/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/611650757849_.pic.jpg_720x.avif 720w, https://liudon.com/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/611650757849_.pic.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/611650757849_.pic.jpg_320x.webp 320w, https://liudon.com/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/611650757849_.pic.jpg_480x.webp 480w, https://liudon.com/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/611650757849_.pic.jpg_720x.webp 720w, https://liudon.com/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/611650757849_.pic.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E6%9B%B4%E6%8D%A2thinkpad-x1%E7%A1%AC%E7%9B%98/611650757849_.pic.jpg\" alt=\"611650757849_.pic\"\n         width=\"1080\" height=\"1441\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e重装系统，搞定，省了一笔，好开心。\u003c/p\u003e\n","date_published":"2022-04-22T08:04:18+08:00","tags":["thinkpad","SSD","硬盘","三星"]},{"title":"二刷百望山","id":"https://liudon.com/posts/%E4%BA%8C%E5%88%B7%E7%99%BE%E6%9C%9B%E5%B1%B1/","url":"https://liudon.com/posts/%E4%BA%8C%E5%88%B7%E7%99%BE%E6%9C%9B%E5%B1%B1/","summary":"\u003cp\u003e又是周末，娃约了小伙伴一起爬山。\u003c/p\u003e\n\u003cp\u003e百望山，二刷走起。\u003c/p\u003e\n\u003cp\u003e约好了9点半门口见面，早上睁眼8点了，赶紧起床洗漱吃饭。\u003c/p\u003e\n\u003cp\u003e出门晚了，还打不到车，快10点才到。\u003c/p\u003e\n\u003cp\u003e小伙伴和人爸爸已经先爬上去了，带着娃一路小跑，20分钟从大门爬到山上。\u003c/p\u003e","content_html":"\u003cp\u003e又是周末，娃约了小伙伴一起爬山。\u003c/p\u003e\n\u003cp\u003e百望山，二刷走起。\u003c/p\u003e\n\u003cp\u003e约好了9点半门口见面，早上睁眼8点了，赶紧起床洗漱吃饭。\u003c/p\u003e\n\u003cp\u003e出门晚了，还打不到车，快10点才到。\u003c/p\u003e\n\u003cp\u003e小伙伴和人爸爸已经先爬上去了，带着娃一路小跑，20分钟从大门爬到山上。\u003c/p\u003e\n\u003cp\u003e继续赶路爬楼梯，总算登上了观景台，俩小朋友终于见面了，一人奖励一个冰激凌。\u003c/p\u003e\n\u003cp\u003e这次来，山上明显绿了，花开的更多了，人比上次少多了。\u003c/p\u003e\n\u003cp\u003e下山后，又一起吃了个饭，自助吃的有点撑。\u003c/p\u003e\n\u003cp\u003e今天天气真好，视野相当不错，就是太晒了。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/%E4%BA%8C%E5%88%B7%E7%99%BE%E6%9C%9B%E5%B1%B1/WechatIMG48.jpeg_320x.avif 320w, https://liudon.com/posts/%E4%BA%8C%E5%88%B7%E7%99%BE%E6%9C%9B%E5%B1%B1/WechatIMG48.jpeg_480x.avif 480w, https://liudon.com/posts/%E4%BA%8C%E5%88%B7%E7%99%BE%E6%9C%9B%E5%B1%B1/WechatIMG48.jpeg_720x.avif 720w, https://liudon.com/posts/%E4%BA%8C%E5%88%B7%E7%99%BE%E6%9C%9B%E5%B1%B1/WechatIMG48.jpeg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/%E4%BA%8C%E5%88%B7%E7%99%BE%E6%9C%9B%E5%B1%B1/WechatIMG48.jpeg_320x.webp 320w, https://liudon.com/posts/%E4%BA%8C%E5%88%B7%E7%99%BE%E6%9C%9B%E5%B1%B1/WechatIMG48.jpeg_480x.webp 480w, https://liudon.com/posts/%E4%BA%8C%E5%88%B7%E7%99%BE%E6%9C%9B%E5%B1%B1/WechatIMG48.jpeg_720x.webp 720w, https://liudon.com/posts/%E4%BA%8C%E5%88%B7%E7%99%BE%E6%9C%9B%E5%B1%B1/WechatIMG48.jpeg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/%E4%BA%8C%E5%88%B7%E7%99%BE%E6%9C%9B%E5%B1%B1/WechatIMG48.jpeg\" alt=\"俯瞰北京\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/%E4%BA%8C%E5%88%B7%E7%99%BE%E6%9C%9B%E5%B1%B1/WechatIMG47.jpeg_320x.avif 320w, https://liudon.com/posts/%E4%BA%8C%E5%88%B7%E7%99%BE%E6%9C%9B%E5%B1%B1/WechatIMG47.jpeg_480x.avif 480w, https://liudon.com/posts/%E4%BA%8C%E5%88%B7%E7%99%BE%E6%9C%9B%E5%B1%B1/WechatIMG47.jpeg_720x.avif 720w, https://liudon.com/posts/%E4%BA%8C%E5%88%B7%E7%99%BE%E6%9C%9B%E5%B1%B1/WechatIMG47.jpeg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/%E4%BA%8C%E5%88%B7%E7%99%BE%E6%9C%9B%E5%B1%B1/WechatIMG47.jpeg_320x.webp 320w, https://liudon.com/posts/%E4%BA%8C%E5%88%B7%E7%99%BE%E6%9C%9B%E5%B1%B1/WechatIMG47.jpeg_480x.webp 480w, https://liudon.com/posts/%E4%BA%8C%E5%88%B7%E7%99%BE%E6%9C%9B%E5%B1%B1/WechatIMG47.jpeg_720x.webp 720w, https://liudon.com/posts/%E4%BA%8C%E5%88%B7%E7%99%BE%E6%9C%9B%E5%B1%B1/WechatIMG47.jpeg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/%E4%BA%8C%E5%88%B7%E7%99%BE%E6%9C%9B%E5%B1%B1/WechatIMG47.jpeg\" alt=\"不知名的树\"\n         width=\"1080\" height=\"1441\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/%E4%BA%8C%E5%88%B7%E7%99%BE%E6%9C%9B%E5%B1%B1/WechatIMG46.jpeg_320x.avif 320w, https://liudon.com/posts/%E4%BA%8C%E5%88%B7%E7%99%BE%E6%9C%9B%E5%B1%B1/WechatIMG46.jpeg_480x.avif 480w, https://liudon.com/posts/%E4%BA%8C%E5%88%B7%E7%99%BE%E6%9C%9B%E5%B1%B1/WechatIMG46.jpeg_720x.avif 720w, https://liudon.com/posts/%E4%BA%8C%E5%88%B7%E7%99%BE%E6%9C%9B%E5%B1%B1/WechatIMG46.jpeg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/%E4%BA%8C%E5%88%B7%E7%99%BE%E6%9C%9B%E5%B1%B1/WechatIMG46.jpeg_320x.webp 320w, https://liudon.com/posts/%E4%BA%8C%E5%88%B7%E7%99%BE%E6%9C%9B%E5%B1%B1/WechatIMG46.jpeg_480x.webp 480w, https://liudon.com/posts/%E4%BA%8C%E5%88%B7%E7%99%BE%E6%9C%9B%E5%B1%B1/WechatIMG46.jpeg_720x.webp 720w, https://liudon.com/posts/%E4%BA%8C%E5%88%B7%E7%99%BE%E6%9C%9B%E5%B1%B1/WechatIMG46.jpeg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/%E4%BA%8C%E5%88%B7%E7%99%BE%E6%9C%9B%E5%B1%B1/WechatIMG46.jpeg\" alt=\"山顶\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n","date_published":"2022-04-17T22:57:41+08:00","tags":["爬山","遛娃"]},{"title":"带娃游颐和园","id":"https://liudon.com/posts/%E5%B8%A6%E5%A8%83%E6%B8%B8%E9%A2%90%E5%92%8C%E5%9B%AD/","url":"https://liudon.com/posts/%E5%B8%A6%E5%A8%83%E6%B8%B8%E9%A2%90%E5%92%8C%E5%9B%AD/","summary":"\u003cp\u003e上周的北海之行，本来是想划船的，可惜人太多没有划成，答应娃这周末带她去划船。\u003c/p\u003e\n\u003cp\u003e周六7点准时起床，得早点去省得人多排队。\u003c/p\u003e\n\u003cp\u003e8点半吃完饭洗漱完出发，特意带娃坐了一趟双层公交车 —— 二楼第一排观光区。\u003c/p\u003e","content_html":"\u003cp\u003e上周的北海之行，本来是想划船的，可惜人太多没有划成，答应娃这周末带她去划船。\u003c/p\u003e\n\u003cp\u003e周六7点准时起床，得早点去省得人多排队。\u003c/p\u003e\n\u003cp\u003e8点半吃完饭洗漱完出发，特意带娃坐了一趟双层公交车 —— 二楼第一排观光区。\u003c/p\u003e\n\u003cp\u003e路上不堵，40多分钟到站。\u003c/p\u003e\n\u003cp\u003e进园先去码头排队，人不太多，等了有十几分钟，终于轮到了。\u003c/p\u003e\n\u003cp\u003e总算开上了船，不过天气不太好，灰蒙蒙的。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/%E5%B8%A6%E5%A8%83%E6%B8%B8%E9%A2%90%E5%92%8C%E5%9B%AD/WechatIMG40.jpeg_320x.avif 320w, https://liudon.com/posts/%E5%B8%A6%E5%A8%83%E6%B8%B8%E9%A2%90%E5%92%8C%E5%9B%AD/WechatIMG40.jpeg_480x.avif 480w, https://liudon.com/posts/%E5%B8%A6%E5%A8%83%E6%B8%B8%E9%A2%90%E5%92%8C%E5%9B%AD/WechatIMG40.jpeg_720x.avif 720w, https://liudon.com/posts/%E5%B8%A6%E5%A8%83%E6%B8%B8%E9%A2%90%E5%92%8C%E5%9B%AD/WechatIMG40.jpeg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/%E5%B8%A6%E5%A8%83%E6%B8%B8%E9%A2%90%E5%92%8C%E5%9B%AD/WechatIMG40.jpeg_320x.webp 320w, https://liudon.com/posts/%E5%B8%A6%E5%A8%83%E6%B8%B8%E9%A2%90%E5%92%8C%E5%9B%AD/WechatIMG40.jpeg_480x.webp 480w, https://liudon.com/posts/%E5%B8%A6%E5%A8%83%E6%B8%B8%E9%A2%90%E5%92%8C%E5%9B%AD/WechatIMG40.jpeg_720x.webp 720w, https://liudon.com/posts/%E5%B8%A6%E5%A8%83%E6%B8%B8%E9%A2%90%E5%92%8C%E5%9B%AD/WechatIMG40.jpeg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/%E5%B8%A6%E5%A8%83%E6%B8%B8%E9%A2%90%E5%92%8C%E5%9B%AD/WechatIMG40.jpeg\" alt=\"终于坐上了船\"\n         width=\"1080\" height=\"720\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e水上荡了1个小时，下船向佛香阁进发。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/%E5%B8%A6%E5%A8%83%E6%B8%B8%E9%A2%90%E5%92%8C%E5%9B%AD/WechatIMG41.jpeg_320x.avif 320w, https://liudon.com/posts/%E5%B8%A6%E5%A8%83%E6%B8%B8%E9%A2%90%E5%92%8C%E5%9B%AD/WechatIMG41.jpeg_480x.avif 480w, https://liudon.com/posts/%E5%B8%A6%E5%A8%83%E6%B8%B8%E9%A2%90%E5%92%8C%E5%9B%AD/WechatIMG41.jpeg_720x.avif 720w, https://liudon.com/posts/%E5%B8%A6%E5%A8%83%E6%B8%B8%E9%A2%90%E5%92%8C%E5%9B%AD/WechatIMG41.jpeg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/%E5%B8%A6%E5%A8%83%E6%B8%B8%E9%A2%90%E5%92%8C%E5%9B%AD/WechatIMG41.jpeg_320x.webp 320w, https://liudon.com/posts/%E5%B8%A6%E5%A8%83%E6%B8%B8%E9%A2%90%E5%92%8C%E5%9B%AD/WechatIMG41.jpeg_480x.webp 480w, https://liudon.com/posts/%E5%B8%A6%E5%A8%83%E6%B8%B8%E9%A2%90%E5%92%8C%E5%9B%AD/WechatIMG41.jpeg_720x.webp 720w, https://liudon.com/posts/%E5%B8%A6%E5%A8%83%E6%B8%B8%E9%A2%90%E5%92%8C%E5%9B%AD/WechatIMG41.jpeg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/%E5%B8%A6%E5%A8%83%E6%B8%B8%E9%A2%90%E5%92%8C%E5%9B%AD/WechatIMG41.jpeg\" alt=\"佛香阁\"\n         width=\"1080\" height=\"1620\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e一路向上，终于登顶，园内风景一览无余。\u003c/p\u003e\n\u003cp\u003e下来后，又去逛了十七孔桥，逛了下湖心小岛。\u003c/p\u003e\n\u003cp\u003e回家又特意坐的双层公交，第一排观光区，哈哈。\u003c/p\u003e\n\u003cp\u003e一天下来1w多步，娃估计得更多，到家直接累摊。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/%E5%B8%A6%E5%A8%83%E6%B8%B8%E9%A2%90%E5%92%8C%E5%9B%AD/WechatIMG42.jpeg_320x.avif 320w, https://liudon.com/posts/%E5%B8%A6%E5%A8%83%E6%B8%B8%E9%A2%90%E5%92%8C%E5%9B%AD/WechatIMG42.jpeg_480x.avif 480w, https://liudon.com/posts/%E5%B8%A6%E5%A8%83%E6%B8%B8%E9%A2%90%E5%92%8C%E5%9B%AD/WechatIMG42.jpeg_720x.avif 720w, https://liudon.com/posts/%E5%B8%A6%E5%A8%83%E6%B8%B8%E9%A2%90%E5%92%8C%E5%9B%AD/WechatIMG42.jpeg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/%E5%B8%A6%E5%A8%83%E6%B8%B8%E9%A2%90%E5%92%8C%E5%9B%AD/WechatIMG42.jpeg_320x.webp 320w, https://liudon.com/posts/%E5%B8%A6%E5%A8%83%E6%B8%B8%E9%A2%90%E5%92%8C%E5%9B%AD/WechatIMG42.jpeg_480x.webp 480w, https://liudon.com/posts/%E5%B8%A6%E5%A8%83%E6%B8%B8%E9%A2%90%E5%92%8C%E5%9B%AD/WechatIMG42.jpeg_720x.webp 720w, https://liudon.com/posts/%E5%B8%A6%E5%A8%83%E6%B8%B8%E9%A2%90%E5%92%8C%E5%9B%AD/WechatIMG42.jpeg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/%E5%B8%A6%E5%A8%83%E6%B8%B8%E9%A2%90%E5%92%8C%E5%9B%AD/WechatIMG42.jpeg\" alt=\"这是鸳鸯吧\"\n         width=\"1080\" height=\"720\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/%E5%B8%A6%E5%A8%83%E6%B8%B8%E9%A2%90%E5%92%8C%E5%9B%AD/WechatIMG43.jpeg_320x.avif 320w, https://liudon.com/posts/%E5%B8%A6%E5%A8%83%E6%B8%B8%E9%A2%90%E5%92%8C%E5%9B%AD/WechatIMG43.jpeg_480x.avif 480w, https://liudon.com/posts/%E5%B8%A6%E5%A8%83%E6%B8%B8%E9%A2%90%E5%92%8C%E5%9B%AD/WechatIMG43.jpeg_720x.avif 720w, https://liudon.com/posts/%E5%B8%A6%E5%A8%83%E6%B8%B8%E9%A2%90%E5%92%8C%E5%9B%AD/WechatIMG43.jpeg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/%E5%B8%A6%E5%A8%83%E6%B8%B8%E9%A2%90%E5%92%8C%E5%9B%AD/WechatIMG43.jpeg_320x.webp 320w, https://liudon.com/posts/%E5%B8%A6%E5%A8%83%E6%B8%B8%E9%A2%90%E5%92%8C%E5%9B%AD/WechatIMG43.jpeg_480x.webp 480w, https://liudon.com/posts/%E5%B8%A6%E5%A8%83%E6%B8%B8%E9%A2%90%E5%92%8C%E5%9B%AD/WechatIMG43.jpeg_720x.webp 720w, https://liudon.com/posts/%E5%B8%A6%E5%A8%83%E6%B8%B8%E9%A2%90%E5%92%8C%E5%9B%AD/WechatIMG43.jpeg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/%E5%B8%A6%E5%A8%83%E6%B8%B8%E9%A2%90%E5%92%8C%E5%9B%AD/WechatIMG43.jpeg\" alt=\"佛香阁\"\n         width=\"1080\" height=\"1620\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/%E5%B8%A6%E5%A8%83%E6%B8%B8%E9%A2%90%E5%92%8C%E5%9B%AD/WechatIMG44.jpeg_320x.avif 320w, https://liudon.com/posts/%E5%B8%A6%E5%A8%83%E6%B8%B8%E9%A2%90%E5%92%8C%E5%9B%AD/WechatIMG44.jpeg_480x.avif 480w, https://liudon.com/posts/%E5%B8%A6%E5%A8%83%E6%B8%B8%E9%A2%90%E5%92%8C%E5%9B%AD/WechatIMG44.jpeg_720x.avif 720w, https://liudon.com/posts/%E5%B8%A6%E5%A8%83%E6%B8%B8%E9%A2%90%E5%92%8C%E5%9B%AD/WechatIMG44.jpeg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/%E5%B8%A6%E5%A8%83%E6%B8%B8%E9%A2%90%E5%92%8C%E5%9B%AD/WechatIMG44.jpeg_320x.webp 320w, https://liudon.com/posts/%E5%B8%A6%E5%A8%83%E6%B8%B8%E9%A2%90%E5%92%8C%E5%9B%AD/WechatIMG44.jpeg_480x.webp 480w, https://liudon.com/posts/%E5%B8%A6%E5%A8%83%E6%B8%B8%E9%A2%90%E5%92%8C%E5%9B%AD/WechatIMG44.jpeg_720x.webp 720w, https://liudon.com/posts/%E5%B8%A6%E5%A8%83%E6%B8%B8%E9%A2%90%E5%92%8C%E5%9B%AD/WechatIMG44.jpeg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/%E5%B8%A6%E5%A8%83%E6%B8%B8%E9%A2%90%E5%92%8C%E5%9B%AD/WechatIMG44.jpeg\" alt=\"十七孔桥\"\n         width=\"1080\" height=\"1620\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n","date_published":"2022-04-11T00:37:55+08:00","tags":[]},{"title":"博客架构说明","id":"https://liudon.com/posts/%E5%8D%9A%E5%AE%A2%E6%9E%B6%E6%9E%84%E8%AF%B4%E6%98%8E/","url":"https://liudon.com/posts/%E5%8D%9A%E5%AE%A2%E6%9E%B6%E6%9E%84%E8%AF%B4%E6%98%8E/","summary":"\u003cp\u003e在拿到\u003ccode\u003eliudon.com\u003c/code\u003e域名前，手中已有两个域名：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eliudon.org\u003c/li\u003e\n\u003cli\u003eliudon.xyz\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/%E5%8D%9A%E5%AE%A2%E6%9E%B6%E6%9E%84%E8%AF%B4%E6%98%8E/%E5%8D%9A%E5%AE%A2%E6%9E%B6%E6%9E%84.png_320x.avif 320w, https://liudon.com/posts/%E5%8D%9A%E5%AE%A2%E6%9E%B6%E6%9E%84%E8%AF%B4%E6%98%8E/%E5%8D%9A%E5%AE%A2%E6%9E%B6%E6%9E%84.png_480x.avif 480w, https://liudon.com/posts/%E5%8D%9A%E5%AE%A2%E6%9E%B6%E6%9E%84%E8%AF%B4%E6%98%8E/%E5%8D%9A%E5%AE%A2%E6%9E%B6%E6%9E%84.png_653x.avif 653w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/%E5%8D%9A%E5%AE%A2%E6%9E%B6%E6%9E%84%E8%AF%B4%E6%98%8E/%E5%8D%9A%E5%AE%A2%E6%9E%B6%E6%9E%84.png_320x.webp 320w, https://liudon.com/posts/%E5%8D%9A%E5%AE%A2%E6%9E%B6%E6%9E%84%E8%AF%B4%E6%98%8E/%E5%8D%9A%E5%AE%A2%E6%9E%B6%E6%9E%84.png_480x.webp 480w, https://liudon.com/posts/%E5%8D%9A%E5%AE%A2%E6%9E%B6%E6%9E%84%E8%AF%B4%E6%98%8E/%E5%8D%9A%E5%AE%A2%E6%9E%B6%E6%9E%84.png_653x.webp 653w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/%E5%8D%9A%E5%AE%A2%E6%9E%B6%E6%9E%84%E8%AF%B4%E6%98%8E/%E5%8D%9A%E5%AE%A2%E6%9E%B6%E6%9E%84.png\" alt=\"两套域名说明\"\n         width=\"653\" height=\"206\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eliudon.org\u003c/code\u003e已经不再更新，仅作归档使用。\n\u003ccode\u003eliudon.xyz\u003c/code\u003e当时是静态博客流行，尝鲜使用。\u003c/p\u003e","content_html":"\u003cp\u003e在拿到\u003ccode\u003eliudon.com\u003c/code\u003e域名前，手中已有两个域名：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eliudon.org\u003c/li\u003e\n\u003cli\u003eliudon.xyz\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/%E5%8D%9A%E5%AE%A2%E6%9E%B6%E6%9E%84%E8%AF%B4%E6%98%8E/%E5%8D%9A%E5%AE%A2%E6%9E%B6%E6%9E%84.png_320x.avif 320w, https://liudon.com/posts/%E5%8D%9A%E5%AE%A2%E6%9E%B6%E6%9E%84%E8%AF%B4%E6%98%8E/%E5%8D%9A%E5%AE%A2%E6%9E%B6%E6%9E%84.png_480x.avif 480w, https://liudon.com/posts/%E5%8D%9A%E5%AE%A2%E6%9E%B6%E6%9E%84%E8%AF%B4%E6%98%8E/%E5%8D%9A%E5%AE%A2%E6%9E%B6%E6%9E%84.png_653x.avif 653w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/%E5%8D%9A%E5%AE%A2%E6%9E%B6%E6%9E%84%E8%AF%B4%E6%98%8E/%E5%8D%9A%E5%AE%A2%E6%9E%B6%E6%9E%84.png_320x.webp 320w, https://liudon.com/posts/%E5%8D%9A%E5%AE%A2%E6%9E%B6%E6%9E%84%E8%AF%B4%E6%98%8E/%E5%8D%9A%E5%AE%A2%E6%9E%B6%E6%9E%84.png_480x.webp 480w, https://liudon.com/posts/%E5%8D%9A%E5%AE%A2%E6%9E%B6%E6%9E%84%E8%AF%B4%E6%98%8E/%E5%8D%9A%E5%AE%A2%E6%9E%B6%E6%9E%84.png_653x.webp 653w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/%E5%8D%9A%E5%AE%A2%E6%9E%B6%E6%9E%84%E8%AF%B4%E6%98%8E/%E5%8D%9A%E5%AE%A2%E6%9E%B6%E6%9E%84.png\" alt=\"两套域名说明\"\n         width=\"653\" height=\"206\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eliudon.org\u003c/code\u003e已经不再更新，仅作归档使用。\n\u003ccode\u003eliudon.xyz\u003c/code\u003e当时是静态博客流行，尝鲜使用。\u003c/p\u003e\n\u003cp\u003e拿到\u003ccode\u003eliudon.com\u003c/code\u003e域名后，怎么部署博客成了个问题。\u003c/p\u003e\n\u003cp\u003e因为\u003ccode\u003egithub pages\u003c/code\u003e只能绑定一个自定义域名，当然可以通过创建另外一个项目，实现两套域名，但是同一个博客两个项目总感觉不太优雅。\u003c/p\u003e\n\u003cp\u003e经过一番资料查找，终于有了下面这套方案。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/%E5%8D%9A%E5%AE%A2%E6%9E%B6%E6%9E%84%E8%AF%B4%E6%98%8E/%E5%8D%9A%E5%AE%A2%E6%9E%84%E5%BB%BA%E6%B5%81%E7%A8%8B.png_320x.avif 320w, https://liudon.com/posts/%E5%8D%9A%E5%AE%A2%E6%9E%B6%E6%9E%84%E8%AF%B4%E6%98%8E/%E5%8D%9A%E5%AE%A2%E6%9E%84%E5%BB%BA%E6%B5%81%E7%A8%8B.png_480x.avif 480w, https://liudon.com/posts/%E5%8D%9A%E5%AE%A2%E6%9E%B6%E6%9E%84%E8%AF%B4%E6%98%8E/%E5%8D%9A%E5%AE%A2%E6%9E%84%E5%BB%BA%E6%B5%81%E7%A8%8B.png_720x.avif 720w, https://liudon.com/posts/%E5%8D%9A%E5%AE%A2%E6%9E%B6%E6%9E%84%E8%AF%B4%E6%98%8E/%E5%8D%9A%E5%AE%A2%E6%9E%84%E5%BB%BA%E6%B5%81%E7%A8%8B.png_1037x.avif 1037w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/%E5%8D%9A%E5%AE%A2%E6%9E%B6%E6%9E%84%E8%AF%B4%E6%98%8E/%E5%8D%9A%E5%AE%A2%E6%9E%84%E5%BB%BA%E6%B5%81%E7%A8%8B.png_320x.webp 320w, https://liudon.com/posts/%E5%8D%9A%E5%AE%A2%E6%9E%B6%E6%9E%84%E8%AF%B4%E6%98%8E/%E5%8D%9A%E5%AE%A2%E6%9E%84%E5%BB%BA%E6%B5%81%E7%A8%8B.png_480x.webp 480w, https://liudon.com/posts/%E5%8D%9A%E5%AE%A2%E6%9E%B6%E6%9E%84%E8%AF%B4%E6%98%8E/%E5%8D%9A%E5%AE%A2%E6%9E%84%E5%BB%BA%E6%B5%81%E7%A8%8B.png_720x.webp 720w, https://liudon.com/posts/%E5%8D%9A%E5%AE%A2%E6%9E%B6%E6%9E%84%E8%AF%B4%E6%98%8E/%E5%8D%9A%E5%AE%A2%E6%9E%84%E5%BB%BA%E6%B5%81%E7%A8%8B.png_1037x.webp 1037w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/%E5%8D%9A%E5%AE%A2%E6%9E%B6%E6%9E%84%E8%AF%B4%E6%98%8E/%E5%8D%9A%E5%AE%A2%E6%9E%84%E5%BB%BA%E6%B5%81%E7%A8%8B.png\" alt=\"博客构建流程\"\n         width=\"1037\" height=\"260\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e通过\u003ccode\u003egithub actions\u003c/code\u003e 和 \u003ccode\u003enetlify\u003c/code\u003e 部署了两套自动化部署方案：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003egithub actions\u003c/code\u003e部署到\u003ccode\u003egithub pages\u003c/code\u003e，绑定自定义域名\u003ccode\u003eliudon.com\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003enetlify\u003c/code\u003e部署到\u003ccode\u003eipfs\u003c/code\u003e，通过\u003ccode\u003ecloudfare ipfs gateway\u003c/code\u003e解析到\u003ccode\u003eipfs\u003c/code\u003e资源，绑定自定义域名\u003ccode\u003eliudon.xyz\u003c/code\u003e。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e这里要说明一下，\u003ccode\u003eipfs\u003c/code\u003e目前访问延迟较大，这里仅作尝鲜使用。\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003ehugo\u003c/code\u003e的\u003ccode\u003econfig.toml\u003c/code\u003e定义了网站域名，这里为了区分两套域名，在\u003ccode\u003enetlify\u003c/code\u003e部署时，对配置文件做了修改，保证两套域名访问各自页面，具体可参考\u003ca href=\"https://github.com/Liudon/liudon.github.io/blob/code/netlify.toml\"\u003egithub文件内容\u003c/a\u003e。\u003c/p\u003e\n","date_published":"2022-04-10T20:41:57+08:00","tags":[]},{"title":"难得的清明假期","id":"https://liudon.com/posts/%E9%9A%BE%E5%BE%97%E7%9A%84%E6%B8%85%E6%98%8E%E5%81%87%E6%9C%9F/","url":"https://liudon.com/posts/%E9%9A%BE%E5%BE%97%E7%9A%84%E6%B8%85%E6%98%8E%E5%81%87%E6%9C%9F/","summary":"\u003cp\u003e前面有写到，被隔离了一周，好在赶在假期开始前解除了隔离。\u003c/p\u003e\n\u003cp\u003e趁着这次难得的假期，外出放松一下。\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e爬百望山。\u003c/p\u003e\n\u003cp\u003e娃是第一次爬山，百望山不高，适合带娃体验爬山，我也从13、14年之后没再爬过山了。\u003c/p\u003e","content_html":"\u003cp\u003e前面有写到，被隔离了一周，好在赶在假期开始前解除了隔离。\u003c/p\u003e\n\u003cp\u003e趁着这次难得的假期，外出放松一下。\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e爬百望山。\u003c/p\u003e\n\u003cp\u003e娃是第一次爬山，百望山不高，适合带娃体验爬山，我也从13、14年之后没再爬过山了。\u003c/p\u003e\n\u003cp\u003e进园后，选择大路往上爬，中间走了一段山间台阶路。\u003c/p\u003e\n\u003cp\u003e一路走走停停，补充能量，估计有半个小时，我们就登顶了。\u003c/p\u003e\n\u003cp\u003e山上风有点大，视野不错，可以直接看到互联网的核心公司。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e游北海公园\u003c/p\u003e\n\u003cp\u003e本来是想着去公园划船，结果到了之后发现排队的人太多了，于是放弃，改为游白塔。\u003c/p\u003e\n\u003cp\u003e我们是从北门进的园，然后一路向西去码头打算划船，绕着园子继续往南走。\u003c/p\u003e\n\u003cp\u003e一路走到了南门，心想这出去了还咋去白塔，难道要再走回去？\u003c/p\u003e\n\u003cp\u003e问了门口保安，说是可以出去往东走，从南门再进去。\u003c/p\u003e\n\u003cp\u003e进去后，要爬好几层楼梯才能上到白塔平台，一览园内风景。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/%E9%9A%BE%E5%BE%97%E7%9A%84%E6%B8%85%E6%98%8E%E5%81%87%E6%9C%9F/IMG39.png_320x.avif 320w, https://liudon.com/posts/%E9%9A%BE%E5%BE%97%E7%9A%84%E6%B8%85%E6%98%8E%E5%81%87%E6%9C%9F/IMG39.png_480x.avif 480w, https://liudon.com/posts/%E9%9A%BE%E5%BE%97%E7%9A%84%E6%B8%85%E6%98%8E%E5%81%87%E6%9C%9F/IMG39.png_720x.avif 720w, https://liudon.com/posts/%E9%9A%BE%E5%BE%97%E7%9A%84%E6%B8%85%E6%98%8E%E5%81%87%E6%9C%9F/IMG39.png_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/%E9%9A%BE%E5%BE%97%E7%9A%84%E6%B8%85%E6%98%8E%E5%81%87%E6%9C%9F/IMG39.png_320x.webp 320w, https://liudon.com/posts/%E9%9A%BE%E5%BE%97%E7%9A%84%E6%B8%85%E6%98%8E%E5%81%87%E6%9C%9F/IMG39.png_480x.webp 480w, https://liudon.com/posts/%E9%9A%BE%E5%BE%97%E7%9A%84%E6%B8%85%E6%98%8E%E5%81%87%E6%9C%9F/IMG39.png_720x.webp 720w, https://liudon.com/posts/%E9%9A%BE%E5%BE%97%E7%9A%84%E6%B8%85%E6%98%8E%E5%81%87%E6%9C%9F/IMG39.png_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/%E9%9A%BE%E5%BE%97%E7%9A%84%E6%B8%85%E6%98%8E%E5%81%87%E6%9C%9F/IMG39.png\" alt=\"北海白塔\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e希望疫情尽快散去，恢复到正常的生活。\u003c/p\u003e\n","date_published":"2022-04-06T08:06:19+08:00","tags":[]},{"title":"十一年的等待，终于拿到了liudon.com域名","id":"https://liudon.com/posts/%E5%8D%81%E4%B8%80%E5%B9%B4%E7%9A%84%E7%AD%89%E5%BE%85%E7%BB%88%E4%BA%8E%E6%8B%BF%E5%88%B0%E4%BA%86liudon.com%E5%9F%9F%E5%90%8D/","url":"https://liudon.com/posts/%E5%8D%81%E4%B8%80%E5%B9%B4%E7%9A%84%E7%AD%89%E5%BE%85%E7%BB%88%E4%BA%8E%E6%8B%BF%E5%88%B0%E4%BA%86liudon.com%E5%9F%9F%E5%90%8D/","summary":"\u003cp\u003e在\u003ca href=\"https://liudon.com/about\"\u003e关于\u003c/a\u003e部分，有写域名的来历。\u003c/p\u003e\n\u003cp\u003e当时\u003ccode\u003eliudon.com\u003c/code\u003e已经被注册，所以只好注册了\u003ccode\u003eliudon.org\u003c/code\u003e。\u003c/p\u003e\n\u003cp\u003e2011年注册的\u003ccode\u003eliudon.org\u003c/code\u003e，最早用\u003ccode\u003ewordpress\u003c/code\u003e搭建了博客。\u003c/p\u003e","content_html":"\u003cp\u003e在\u003ca href=\"https://liudon.com/about\"\u003e关于\u003c/a\u003e部分，有写域名的来历。\u003c/p\u003e\n\u003cp\u003e当时\u003ccode\u003eliudon.com\u003c/code\u003e已经被注册，所以只好注册了\u003ccode\u003eliudon.org\u003c/code\u003e。\u003c/p\u003e\n\u003cp\u003e2011年注册的\u003ccode\u003eliudon.org\u003c/code\u003e，最早用\u003ccode\u003ewordpress\u003c/code\u003e搭建了博客。\u003c/p\u003e\n\u003cp\u003e这是当时的第一篇文章，\u003ca href=\"https://liudon.org/1.html\"\u003eHello world\u003c/a\u003e。\u003c/p\u003e\n\u003cp\u003e从2011年，到2019年，中间断断续续的在更新着，博客程序也从\u003ccode\u003ewordpress\u003c/code\u003e转到了\u003ccode\u003etypecho\u003c/code\u003e，再后来开始流行静态页博客，又转到了hugo下。\u003c/p\u003e\n\u003cp\u003e在这中间，一直想要拿到\u003ccode\u003eliudon.com\u003c/code\u003e域名。\u003c/p\u003e\n\u003cp\u003e看网站内容，应该是个德国乐队的网站，这里能看到网站\u003ca href=\"http://web.archive.org/web/20210621212816/http://www.liudon.com/\"\u003e最后的信息\u003c/a\u003e。\u003c/p\u003e\n\u003cp\u003e3月10日的时候，偶然看到群里有在说域名，于是又搜索了一番，发现域名上了阿里云域名拍卖，购买的时候提示卖家已下家。\u003c/p\u003e\n\u003cp\u003e到国外域名商上查了一下，\u003ccode\u003egodaddy\u003c/code\u003e提供代购，\u003ccode\u003ename\u003c/code\u003e提示为高级域名，可以购买。\u003c/p\u003e\n\u003cp\u003e看\u003ccode\u003earchive.org\u003c/code\u003e上的信息，2021年11月的时候服务不可用了，不知道发生了什么。\u003c/p\u003e\n\u003cp\u003e机不可失，时不再来，立马下单。\u003c/p\u003e\n\u003cp\u003e接下来就是漫长的等待了，系统显示需要5-10个工作日才能完成交易。\u003c/p\u003e\n\u003cp\u003e同时我发现他们服务条款写着，高级域名不支持退款，whois信息一直不变，担心打水漂。\u003c/p\u003e\n\u003cp\u003e期间有一天晚上11点联系客户，说是已经在加快处理。\u003c/p\u003e\n\u003cp\u003e过了10天后，交易还没完成，有点放弃了。\u003c/p\u003e\n\u003cp\u003e3月24日晚上，再次查whois，发现信息有变，登录name，发现订单已完成。\u003c/p\u003e\n\u003cp\u003e现在这个域名终于属于我了。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eliudon.org 老站，备份，不再更新\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eliudon.com -\u0026gt; github pages\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eliudon.xyz -\u0026gt; netfily -\u0026gt; ipfs\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","date_published":"2022-04-01T01:24:05+08:00","tags":[]},{"title":"被隔离的一周","id":"https://liudon.com/posts/%E8%A2%AB%E9%9A%94%E7%A6%BB%E7%9A%84%E4%B8%80%E5%91%A8/","url":"https://liudon.com/posts/%E8%A2%AB%E9%9A%94%E7%A6%BB%E7%9A%84%E4%B8%80%E5%91%A8/","summary":"\u003cp\u003e从没有想过疫情会离自己这么近，记录一下。\u003c/p\u003e\n\u003cp\u003e周一的时候说是有确诊同学来过公司，下午组织全员核酸，做完核酸立马回家。\u003c/p\u003e\n\u003cp\u003e周二早上全员核酸阴性，继续到公司上班。\u003c/p\u003e","content_html":"\u003cp\u003e从没有想过疫情会离自己这么近，记录一下。\u003c/p\u003e\n\u003cp\u003e周一的时候说是有确诊同学来过公司，下午组织全员核酸，做完核酸立马回家。\u003c/p\u003e\n\u003cp\u003e周二早上全员核酸阴性，继续到公司上班。\u003c/p\u003e\n\u003cp\u003e晚上8点10分刚和同事上地铁，部门群里有人说我们楼有人确诊，过了10分钟，说是大楼管控了，不让出楼了。\u003c/p\u003e\n\u003cp\u003e封在楼里的同学统一做核酸，结果出来后才能回家，好多人在公司过了夜。\u003c/p\u003e\n\u003cp\u003e周三到公司集体核酸，做完继续居家办公，今天开始公安局、社区开始联系确认信息，公司要求所有人员居家办公，社区反馈需要居家隔离。\u003c/p\u003e\n\u003cp\u003e头几天还说对门上封条了，没成想这次轮到自己了。\u003c/p\u003e\n\u003cp\u003e到03/31日，隔离解除，健康宝恢复正常。\u003c/p\u003e\n\u003cp\u003e第一次体验到健康宝显示弹窗，然后又显示居家隔离。\u003c/p\u003e\n\u003cp\u003e第一次体验到被贴封条上门磁。\u003c/p\u003e\n\u003cp\u003e第一次体验到鼻拭子，尤其解封前最后一次核酸，双鼻孔。\u003c/p\u003e\n","date_published":"2022-04-01T01:20:39+08:00","tags":["疫情"]},{"title":"mysql中字符串和整型自动转换的问题","id":"https://liudon.com/posts/strings-and-numbers-in-mysql/","url":"https://liudon.com/posts/strings-and-numbers-in-mysql/","summary":"\u003cp\u003e表结构如下\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003edesc\u003c/span\u003e \u003cspan class=\"n\"\u003einfo\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e+-------+-----------------+------+-----+---------+----------------+\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003eField\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003eType\u003c/span\u003e            \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003eNull\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003eKey\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003eDefault\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003eExtra\u003c/span\u003e          \u003cspan class=\"o\"\u003e|\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e+-------+-----------------+------+-----+---------+----------------+\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003eid\u003c/span\u003e    \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"ne\"\u003eint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e8\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003eunsigned\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003eNO\u003c/span\u003e   \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003ePRI\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003eNULL\u003c/span\u003e    \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003eauto_increment\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003ename\u003c/span\u003e  \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003evarchar\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e20\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e     \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003eYES\u003c/span\u003e  \u003cspan class=\"o\"\u003e|\u003c/span\u003e     \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003eNULL\u003c/span\u003e    \u003cspan class=\"o\"\u003e|\u003c/span\u003e                \u003cspan class=\"o\"\u003e|\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e+-------+-----------------+------+-----+---------+----------------+\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"mi\"\u003e2\u003c/span\u003e \u003cspan class=\"n\"\u003erows\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003eset\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mf\"\u003e0.00\u003c/span\u003e \u003cspan class=\"n\"\u003esec\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e执行sql.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003einsert into info values (\u0026#39;\u0026#39;, \u0026#39;xxx\u0026#39;);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003einsert into info values (\u0026#39;\u0026#39;, \u0026#39;yyy\u0026#39;);\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e查询记录.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eselect * from info;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e+----+------+\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e| id | name |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e+----+------+\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e|  1 | xxx  |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e|  2 | yyy  |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e+----+------+\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2 rows in set (0.00 sec)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e执行下面sql.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eselect * from info where id = 1;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eselect * from info where id = \u0026#39;1aaaa\u0026#39;;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e你先想想结果会是什么。\u003c/p\u003e","content_html":"\u003cp\u003e表结构如下\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003edesc\u003c/span\u003e \u003cspan class=\"n\"\u003einfo\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e+-------+-----------------+------+-----+---------+----------------+\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003eField\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003eType\u003c/span\u003e            \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003eNull\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003eKey\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003eDefault\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003eExtra\u003c/span\u003e          \u003cspan class=\"o\"\u003e|\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e+-------+-----------------+------+-----+---------+----------------+\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003eid\u003c/span\u003e    \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"ne\"\u003eint\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e8\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"n\"\u003eunsigned\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003eNO\u003c/span\u003e   \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003ePRI\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003eNULL\u003c/span\u003e    \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003eauto_increment\u003c/span\u003e \u003cspan class=\"o\"\u003e|\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003ename\u003c/span\u003e  \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003evarchar\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e20\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e     \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003eYES\u003c/span\u003e  \u003cspan class=\"o\"\u003e|\u003c/span\u003e     \u003cspan class=\"o\"\u003e|\u003c/span\u003e \u003cspan class=\"n\"\u003eNULL\u003c/span\u003e    \u003cspan class=\"o\"\u003e|\u003c/span\u003e                \u003cspan class=\"o\"\u003e|\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e+-------+-----------------+------+-----+---------+----------------+\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"mi\"\u003e2\u003c/span\u003e \u003cspan class=\"n\"\u003erows\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003eset\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mf\"\u003e0.00\u003c/span\u003e \u003cspan class=\"n\"\u003esec\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e执行sql.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003einsert into info values (\u0026#39;\u0026#39;, \u0026#39;xxx\u0026#39;);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003einsert into info values (\u0026#39;\u0026#39;, \u0026#39;yyy\u0026#39;);\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e查询记录.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eselect * from info;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e+----+------+\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e| id | name |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e+----+------+\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e|  1 | xxx  |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e|  2 | yyy  |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e+----+------+\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2 rows in set (0.00 sec)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e执行下面sql.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eselect * from info where id = 1;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eselect * from info where id = \u0026#39;1aaaa\u0026#39;;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e你先想想结果会是什么。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eselect * from info where id = 1;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e+----+------+\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e| id | name |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e+----+------+\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e|  1 | xxx  |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e+----+------+\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e1 row in set (0.00 sec)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eselect * from info where id = \u0026#39;1aaaa\u0026#39;;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e+----+------+\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e| id | name |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e+----+------+\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e|  1 | xxx  |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e+----+------+\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e1 row in set, 1 warning (0.01 sec)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e两个sql都查到了id = 1的记录，唯一的区别在于第二个sql有一个warning错误。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eshow warnings;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e+---------+------+-------------------------------------------+\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e| Level   | Code | Message                                   |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e+---------+------+-------------------------------------------+\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e| Warning | 1292 | Truncated incorrect DOUBLE value: \u0026#39;1aaaa\u0026#39; |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e+---------+------+-------------------------------------------+\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e1 row in set (0.00 sec)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003emysql在查询时，会根据字段类型进行转换，这里\u003ccode\u003e1aaaa\u003c/code\u003e被转为了\u003ccode\u003e1\u003c/code\u003e。\u003c/p\u003e\n","date_published":"2020-12-14T18:47:29+08:00","tags":["mysql"]},{"title":"一次惊心动魄的Mysql更新操作","id":"https://liudon.com/posts/%E4%B8%80%E6%AC%A1%E6%83%8A%E5%BF%83%E5%8A%A8%E9%AD%84%E7%9A%84mysql%E6%9B%B4%E6%96%B0%E6%93%8D%E4%BD%9C/","url":"https://liudon.com/posts/%E4%B8%80%E6%AC%A1%E6%83%8A%E5%BF%83%E5%8A%A8%E9%AD%84%E7%9A%84mysql%E6%9B%B4%E6%96%B0%E6%93%8D%E4%BD%9C/","summary":"\u003ch4 id=\"问题描述\"\u003e问题描述\u003c/h4\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# 表结构\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eMySQL \u0026gt; desc user_packages;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e+----------------+---------------------+------+-----+---------------------+----------------+\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e| Field          | Type                | Null | Key | Default             | Extra          |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e+----------------+---------------------+------+-----+---------------------+----------------+\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e| up_id          | bigint(20) unsigned | NO   | PRI | NULL                | auto_increment |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e| start_date     | date                | NO   |     | NULL                |                |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e| end_date       | date                | NO   |     | NULL                |                |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e| up_created     | datetime            | NO   | MUL | 0000-00-00 00:00:00 |                |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e| up_updated     | datetime            | NO   |     | 0000-00-00 00:00:00 |                |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e+----------------+---------------------+------+-----+---------------------+----------------+\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e5 rows in set (0.00 sec)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eMySQL \u0026gt; select * from user_packages limit 5;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e+-------+------------+------------+\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e| up_id | start_date | end_date   |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e+-------+------------+------------+\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e|   185 | 2018-04-01 | 2018-06-30 |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e|   186 | 2018-04-01 | 2018-06-30 |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e|   187 | 2018-04-01 | 2018-06-30 |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e|   188 | 2018-04-01 | 2018-06-30 |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e|   189 | 2018-04-01 | 2018-06-30 |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e+-------+------------+------------+\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e5 rows in set (0.00 sec)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"操作过程\"\u003e操作过程\u003c/h4\u003e\n\u003cp\u003e需要更新某条记录的\u003ccode\u003eend_date\u003c/code\u003e字段，执行sql如下：\u003c/p\u003e","content_html":"\u003ch4 id=\"问题描述\"\u003e问题描述\u003c/h4\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# 表结构\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eMySQL \u0026gt; desc user_packages;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e+----------------+---------------------+------+-----+---------------------+----------------+\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e| Field          | Type                | Null | Key | Default             | Extra          |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e+----------------+---------------------+------+-----+---------------------+----------------+\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e| up_id          | bigint(20) unsigned | NO   | PRI | NULL                | auto_increment |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e| start_date     | date                | NO   |     | NULL                |                |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e| end_date       | date                | NO   |     | NULL                |                |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e| up_created     | datetime            | NO   | MUL | 0000-00-00 00:00:00 |                |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e| up_updated     | datetime            | NO   |     | 0000-00-00 00:00:00 |                |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e+----------------+---------------------+------+-----+---------------------+----------------+\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e5 rows in set (0.00 sec)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eMySQL \u0026gt; select * from user_packages limit 5;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e+-------+------------+------------+\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e| up_id | start_date | end_date   |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e+-------+------------+------------+\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e|   185 | 2018-04-01 | 2018-06-30 |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e|   186 | 2018-04-01 | 2018-06-30 |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e|   187 | 2018-04-01 | 2018-06-30 |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e|   188 | 2018-04-01 | 2018-06-30 |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e|   189 | 2018-04-01 | 2018-06-30 |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e+-------+------------+------------+\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e5 rows in set (0.00 sec)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"操作过程\"\u003e操作过程\u003c/h4\u003e\n\u003cp\u003e需要更新某条记录的\u003ccode\u003eend_date\u003c/code\u003e字段，执行sql如下：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eMySQL \u0026gt; update user_packages set end_date = \u0026#39;2020-06-06\u0026#39; and up_id = 189 limit 1;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eQuery OK, 1 row affected, 1 warning (0.00 sec)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eRows matched: 1  Changed: 1  Warnings: 1\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e执行完，发现sql写错了！！！！\u003c/p\u003e\n\u003cp\u003e正确的sql应该是：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eupdate user_packages set end_date = \u0026#39;2020-06-06\u0026#39; where up_id = 189 limit 1;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e误把\u003ccode\u003ewhere\u003c/code\u003e写成了\u003ccode\u003eand\u003c/code\u003e，还好指定了\u003ccode\u003elimit = 1\u003c/code\u003e，只操作了一条记录。\u003c/p\u003e\n\u003ch4 id=\"回滚\"\u003e回滚\u003c/h4\u003e\n\u003cp\u003e回滚的前提，要先找到更新的那条记录。\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eup_id\u003c/code\u003e为表的主键，更新前表里已经有这条记录了，主键不能重复，感觉语句应该没有执行成功。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eMySQL \u0026gt; select * from user_packages where up_id = 189;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e+-------+------------+------------+\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e| up_id | start_date | end_date   |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e+-------+------------+------------+\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e|   189 | 2018-04-01 | 2018-06-30 |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e+-------+------------+------------+\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e1 rows in set (0.00 sec)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e执行查询语句，表里确实也只有这一条\u003ccode\u003eup_id=189\u003c/code\u003e的记录。\u003c/p\u003e\n\u003cp\u003e感觉这个\u003ccode\u003eupdate\u003c/code\u003e语句应该没执行成功，但是没执行成功应该报错的呀。\u003c/p\u003e\n\u003cp\u003e这个时候把希望放到了语句结果里的\u003ccode\u003eWarnings: 1\u003c/code\u003e，是不是没执行成功呢。\u003c/p\u003e\n\u003cp\u003e因为紧接着又执行了其他语句，所以也无法通过\u003ccode\u003eshow warnings\u003c/code\u003e查看具体的错误信息了。\u003c/p\u003e\n\u003cp\u003e那么这条语句到底执行成功了吗？如果执行成功，那么修改的是哪条记录呢？\u003c/p\u003e\n\u003cp\u003e这里通过一番查找，终于定位到了记录。\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eAND\u003c/code\u003e分隔符，在mysql语句里优先级最高。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eupdate user_packages set end_date = \u0026#39;2020-06-06\u0026#39; and up_id = 189 limit 1;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e等效为\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eupdate user_packages set end_date = (\u0026#39;2020-06-06\u0026#39; and up_id = 189) limit 1;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e即\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eupdate user_packages set end_date = 0 limit 1;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e因为\u003ccode\u003eend_date\u003c/code\u003e字段为\u003ccode\u003edate\u003c/code\u003e类型，所以写入表后的记录为\u003ccode\u003e0000-00-00\u003c/code\u003e。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eMySQL \u0026gt; select * from user_packages where end_date = \u0026#39;0000-00-00\u0026#39;;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e+-------+------------+------------+\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e| up_id | start_date | end_date   |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e+-------+------------+------------+\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e|   185 | 2018-04-01 | 0000-00-00 |\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e+-------+------------+------------+\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e1 rows in set (0.00 sec)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e好在这次只更新了一条记录，否则后果无法想象。\u003c/p\u003e\n\u003cp\u003e切记不要在现网直接操作DB。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e相关资料：\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://wing324.github.io/2016/08/25/%E4%B8%80%E4%B8%AA%E6%88%91%E8%AE%A4%E4%B8%BA%E6%98%AFbug%E7%9A%84UPDATE%E8%AF%AD%E5%8F%A5/\"\u003e一个我认为是bug的UPDATE语句\u003c/a\u003e\u003c/p\u003e\n","date_published":"2020-05-19T17:16:53+08:00","tags":["mysql"]},{"title":"如何在北京公积金网站上修改婚姻状况","id":"https://liudon.com/posts/how-to-modify-marital-status/","url":"https://liudon.com/posts/how-to-modify-marital-status/","summary":"\u003cblockquote\u003e\n\u003cp\u003e关于取消住房公积金提取业务纸质申请表及部分业务网上办结的公告\u003c/p\u003e\n\u003cp\u003e时间：2020年01月08日\u003c/p\u003e\n\u003cp\u003e来源：http://gjj.beijing.gov.cn/web/zwgk/_300583/zxzysx/675803/index.html\u003c/p\u003e","content_html":"\u003cblockquote\u003e\n\u003cp\u003e关于取消住房公积金提取业务纸质申请表及部分业务网上办结的公告\u003c/p\u003e\n\u003cp\u003e时间：2020年01月08日\u003c/p\u003e\n\u003cp\u003e来源：http://gjj.beijing.gov.cn/web/zwgk/_300583/zxzysx/675803/index.html\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e1月8日，北京公积金中心发文，从1月10日开始可以网上办理公积金提取了。\u003c/p\u003e\n\u003cp\u003e这里单独讲一下外地领证的情况下，如何修改婚姻状况。\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e进入提取页面，默认显示为未说明的婚姻状况。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/how-to-modify-marital-status/f7HvbKlitaOm1T2.jpg_320x.avif 320w, https://liudon.com/posts/how-to-modify-marital-status/f7HvbKlitaOm1T2.jpg_480x.avif 480w, https://liudon.com/posts/how-to-modify-marital-status/f7HvbKlitaOm1T2.jpg_720x.avif 720w, https://liudon.com/posts/how-to-modify-marital-status/f7HvbKlitaOm1T2.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/how-to-modify-marital-status/f7HvbKlitaOm1T2.jpg_320x.webp 320w, https://liudon.com/posts/how-to-modify-marital-status/f7HvbKlitaOm1T2.jpg_480x.webp 480w, https://liudon.com/posts/how-to-modify-marital-status/f7HvbKlitaOm1T2.jpg_720x.webp 720w, https://liudon.com/posts/how-to-modify-marital-status/f7HvbKlitaOm1T2.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/how-to-modify-marital-status/f7HvbKlitaOm1T2.jpg\" alt=\"QQ截图20200117170836.jpg\"\n         width=\"1080\" height=\"127\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e点击婚姻状况，选择已婚。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/how-to-modify-marital-status/VYnKduoHTtzDw4f.jpg_320x.avif 320w, https://liudon.com/posts/how-to-modify-marital-status/VYnKduoHTtzDw4f.jpg_480x.avif 480w, https://liudon.com/posts/how-to-modify-marital-status/VYnKduoHTtzDw4f.jpg_720x.avif 720w, https://liudon.com/posts/how-to-modify-marital-status/VYnKduoHTtzDw4f.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/how-to-modify-marital-status/VYnKduoHTtzDw4f.jpg_320x.webp 320w, https://liudon.com/posts/how-to-modify-marital-status/VYnKduoHTtzDw4f.jpg_480x.webp 480w, https://liudon.com/posts/how-to-modify-marital-status/VYnKduoHTtzDw4f.jpg_720x.webp 720w, https://liudon.com/posts/how-to-modify-marital-status/VYnKduoHTtzDw4f.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/how-to-modify-marital-status/VYnKduoHTtzDw4f.jpg\" alt=\"QQ截图20200117170917.jpg\"\n         width=\"1080\" height=\"154\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e可以看到婚姻状态相关的输入框都为灰色，不可修改。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e点击婚姻信息修改按钮，会弹出一个民政校验的弹窗，因为我是外地领证，这里查不到信息。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/how-to-modify-marital-status/WpV28uBMvjyzPJN.jpg_320x.avif 320w, https://liudon.com/posts/how-to-modify-marital-status/WpV28uBMvjyzPJN.jpg_480x.avif 480w, https://liudon.com/posts/how-to-modify-marital-status/WpV28uBMvjyzPJN.jpg_720x.avif 720w, https://liudon.com/posts/how-to-modify-marital-status/WpV28uBMvjyzPJN.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/how-to-modify-marital-status/WpV28uBMvjyzPJN.jpg_320x.webp 320w, https://liudon.com/posts/how-to-modify-marital-status/WpV28uBMvjyzPJN.jpg_480x.webp 480w, https://liudon.com/posts/how-to-modify-marital-status/WpV28uBMvjyzPJN.jpg_720x.webp 720w, https://liudon.com/posts/how-to-modify-marital-status/WpV28uBMvjyzPJN.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/how-to-modify-marital-status/WpV28uBMvjyzPJN.jpg\" alt=\"QQ截图20200117171149.jpg\"\n         width=\"1080\" height=\"363\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e注意图片右下角还是只有一个婚姻信息修改按钮。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e点击弹窗里的确认按钮。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/how-to-modify-marital-status/kMhnwRzgtrNOFAI.jpg_320x.avif 320w, https://liudon.com/posts/how-to-modify-marital-status/kMhnwRzgtrNOFAI.jpg_480x.avif 480w, https://liudon.com/posts/how-to-modify-marital-status/kMhnwRzgtrNOFAI.jpg_720x.avif 720w, https://liudon.com/posts/how-to-modify-marital-status/kMhnwRzgtrNOFAI.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/how-to-modify-marital-status/kMhnwRzgtrNOFAI.jpg_320x.webp 320w, https://liudon.com/posts/how-to-modify-marital-status/kMhnwRzgtrNOFAI.jpg_480x.webp 480w, https://liudon.com/posts/how-to-modify-marital-status/kMhnwRzgtrNOFAI.jpg_720x.webp 720w, https://liudon.com/posts/how-to-modify-marital-status/kMhnwRzgtrNOFAI.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/how-to-modify-marital-status/kMhnwRzgtrNOFAI.jpg\" alt=\"QQ截图20200117171236.jpg\"\n         width=\"1080\" height=\"158\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e这下婚姻状况相关的输入框都可以填写了。\u003c/p\u003e\n\u003cp\u003e另外图片右下角里多了一个上传结婚证按钮。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e填写完信息后，点击上传结婚证按钮。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/how-to-modify-marital-status/fohyvH3iGaTtm1n.jpg_320x.avif 320w, https://liudon.com/posts/how-to-modify-marital-status/fohyvH3iGaTtm1n.jpg_480x.avif 480w, https://liudon.com/posts/how-to-modify-marital-status/fohyvH3iGaTtm1n.jpg_720x.avif 720w, https://liudon.com/posts/how-to-modify-marital-status/fohyvH3iGaTtm1n.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/how-to-modify-marital-status/fohyvH3iGaTtm1n.jpg_320x.webp 320w, https://liudon.com/posts/how-to-modify-marital-status/fohyvH3iGaTtm1n.jpg_480x.webp 480w, https://liudon.com/posts/how-to-modify-marital-status/fohyvH3iGaTtm1n.jpg_720x.webp 720w, https://liudon.com/posts/how-to-modify-marital-status/fohyvH3iGaTtm1n.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/how-to-modify-marital-status/fohyvH3iGaTtm1n.jpg\" alt=\"QQ截图20200117171252.jpg\"\n         width=\"1080\" height=\"541\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e按说明上传两张结婚证照片，点击确认即可。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e其余的按\u003ca href=\"http://gjj.beijing.gov.cn/web/bsznx/386727/386730/386732/index.html\"\u003e公积金官网文档\u003c/a\u003e操作，最后提交即可。\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e关于提取时间，我是前一天中午申请，第二天下午就到账了，效率还是很棒的。\u003c/p\u003e\n","date_published":"2020-01-17T17:14:32+08:00","tags":["公积金"]},{"title":"PHP7.2编译安装后没有php.ini文件的问题","id":"https://liudon.com/posts/php7.2%E7%BC%96%E8%AF%91%E5%AE%89%E8%A3%85%E5%90%8E%E6%B2%A1%E6%9C%89php.ini%E6%96%87%E4%BB%B6/","url":"https://liudon.com/posts/php7.2%E7%BC%96%E8%AF%91%E5%AE%89%E8%A3%85%E5%90%8E%E6%B2%A1%E6%9C%89php.ini%E6%96%87%E4%BB%B6/","summary":"\u003cp\u003e下载PHP7.2源码，编译安装。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[root@VM_73_135_centos ~/swoole-src-4.4.12]# php -v\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePHP 7.2.25 (cli) (built: Nov 26 2019 19:33:23) ( NTS )\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCopyright (c) 1997-2018 The PHP Group\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eZend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[root@VM_73_135_centos ~/swoole-src-4.4.12]# \n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e安装Swoole。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ephpize \u0026amp;\u0026amp; \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e./configure \u0026amp;\u0026amp; \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emake \u0026amp;\u0026amp; make install\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e安装完，准备修改\u003ccode\u003ephp.ini\u003c/code\u003e文件，结果没找到。\u003c/p\u003e","content_html":"\u003cp\u003e下载PHP7.2源码，编译安装。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[root@VM_73_135_centos ~/swoole-src-4.4.12]# php -v\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePHP 7.2.25 (cli) (built: Nov 26 2019 19:33:23) ( NTS )\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCopyright (c) 1997-2018 The PHP Group\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eZend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[root@VM_73_135_centos ~/swoole-src-4.4.12]# \n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e安装Swoole。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ephpize \u0026amp;\u0026amp; \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e./configure \u0026amp;\u0026amp; \\\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003emake \u0026amp;\u0026amp; make install\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e安装完，准备修改\u003ccode\u003ephp.ini\u003c/code\u003e文件，结果没找到。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[root@VM_73_135_centos ~/swoole-src-4.4.12]# ll /usr/local/services/php/etc/\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etotal 88\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e-rw-r--r-- 1 root root  1364 Nov 26 19:34 pear.conf\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e-rw-r--r-- 1 root root  4508 Nov 26 19:34 php-fpm.conf.default\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edrwxr-xr-x 2 root root  4096 Nov 26 19:34 php-fpm.d\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[root@VM_73_135_centos ~/swoole-src-4.4.12]# php -i | grep \u0026#34;Loaded Confi\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eLoaded Configuration File =\u0026gt; (none)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e这是什么鬼，居然没有\u003ccode\u003ephp.ini\u003c/code\u003e文件。\u003c/p\u003e\n\u003cp\u003e原来PHP源码里提供了两个\u003ccode\u003ephp.ini\u003c/code\u003e文件，你需要按需拷贝到你的PHP的目录下。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[root@VM_73_135_centos ~/swoole-src-4.4.12]# ll ../php-7.2.25 | grep ini\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e-rw-rw-r--  1 root root   71232 Nov 20 23:11 php.ini-development\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e-rw-rw-r--  1 root root   71413 Nov 20 23:11 php.ini-production\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e拷贝后。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[root@VM_73_135_centos ~/swoole-src-4.4.12]# php -i | grep \u0026#34;Loaded Confi\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eLoaded Configuration File =\u0026gt; /usr/local/services/php/etc/php.ini\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[root@VM_73_135_centos ~/swoole-src-4.4.12]#\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","date_published":"2019-11-26T19:56:18+08:00","tags":["php"]},{"title":"检测网站支持的SSL/TLS协议版本","id":"https://liudon.com/posts/how-to-check-what-ssl-tls-versions-are-available-for-a-website/","url":"https://liudon.com/posts/how-to-check-what-ssl-tls-versions-are-available-for-a-website/","summary":"\u003cblockquote\u003e\n\u003cp\u003eChrome 72及以上版本不支持TLS 1.0和TLS 1.1，访问TLS 1.0或1.1证书的站点会告警，但不阻止用户访问站点。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e为了解决Chrome的这个问题，今天升级了下Nginx的TLS协议版本，这里记录一下如何检测支持的协议版本。\u003c/p\u003e","content_html":"\u003cblockquote\u003e\n\u003cp\u003eChrome 72及以上版本不支持TLS 1.0和TLS 1.1，访问TLS 1.0或1.1证书的站点会告警，但不阻止用户访问站点。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e为了解决Chrome的这个问题，今天升级了下Nginx的TLS协议版本，这里记录一下如何检测支持的协议版本。\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e检测是否支持TLSv1\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eopenssl s_client -connect [ip or 域名]:443 -tls1\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e检测是否支持TLSv1.1\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eopenssl s_client -connect [ip or 域名]:443 -tls1_1\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e检测是否支持TLSv1.2\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eopenssl s_client -connect [ip or 域名]:443 -tls1_2\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e参考资料：\u003ca href=\"https://support.plesk.com/hc/en-us/articles/115004991834-How-to-check-what-SSL-TLS-versions-are-available-for-a-website-\"\u003eHow to check what SSL/TLS versions are available for a website?\u003c/a\u003e\u003c/p\u003e\n","date_published":"2019-11-14T14:48:08+08:00","tags":["nginx","ssl"]},{"title":"记一次难忘的手术经历","id":"https://liudon.com/posts/an-unforgettable-surgical-experience/","url":"https://liudon.com/posts/an-unforgettable-surgical-experience/","summary":"有痔青年的手术经历","content_html":"\u003cp\u003e俗话说的好，十人九痔。这九个人里就有我一个。 😂\u003c/p\u003e\n\u003cp\u003e去年因为痔疮去过一趟医院，医生当时建议手术。\u003c/p\u003e\n\u003cp\u003e后来用了点药，没啥症状了，就不放在心上了。\u003c/p\u003e\n\u003cp\u003e结果前两天公司团建吃了点辣，痔疮又犯了，大便拉不出来，憋的难受。\u003c/p\u003e\n\u003cp\u003e第二天赶紧上医院检查，先上开塞露通便，通完舒服多了。\u003c/p\u003e\n\u003cp\u003e医生检查完，让住院手术，这次狠了狠心，手术做掉，一了百了。\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e10/15住院\u003c/li\u003e\n\u003cli\u003e10/16手术\u003c/li\u003e\n\u003cli\u003e10/22出院\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e上一次手术是在10年前了，全麻，什么都不知道。\u003c/p\u003e\n\u003cp\u003e这次是局麻，上手术台后，医生往腰上打了一针，很疼。\u003c/p\u003e\n\u003cp\u003e过了10分钟左右，肛门已经使不上劲了，开始手术。\u003c/p\u003e\n\u003cp\u003e过程一直感觉有往里打气，东西插进去。\u003c/p\u003e\n\u003cp\u003e医生说有用镇静，后来越来越困，感觉要晕过去，不过还是撑着没睡。\u003c/p\u003e\n\u003cp\u003e出来后，整个下午下半身都是麻的，没啥精神，事后就记得媳妇坐在我对面。\u003c/p\u003e\n\u003cp\u003e术后6个小时内要小便，不然就得插尿管。\u003c/p\u003e\n\u003cp\u003e第二天开始喝流食，然后就是每天医生给换药。\u003c/p\u003e\n\u003cp\u003e第三天开始大便，伤口那个痛啊。 😭😭😭\u003c/p\u003e\n\u003cp\u003e后来学会在热水里泡着拉，感觉舒服了点。\u003c/p\u003e\n\u003cp\u003e每天都要担心大便，担心不拉，或者担心拉的太多。\u003c/p\u003e\n\u003cp\u003e出院后第二天，早上大便一盆血，以为是大出血，把媳妇叫回来直奔医院。\u003c/p\u003e\n\u003cp\u003e到医院病房，主治医生不在，找了个其他医生给检查，说是有点出血。\u003c/p\u003e\n\u003cp\u003e检查的时候塞了个肛门镜，这玩意实在是痛苦。\u003c/p\u003e\n\u003cp\u003e然后说病房没工具，上门诊处理吧。然后我就拖着身子，走到门诊。\u003c/p\u003e\n\u003cp\u003e主治医生说没啥大事，其实可以不处理，不过你也是来医院了，还是处理一下吧。\u003c/p\u003e\n\u003cp\u003e处理的时候，又塞了个肛门镜，然后往屁眼上打了三针封闭，想死的心都有了。\u003c/p\u003e\n\u003cp\u003e回家后，继续卧床休息，每天换药。\u003c/p\u003e\n\u003cp\u003e朋友们，请一定要好好对你的🌻。\u003c/p\u003e\n","date_published":"2019-10-28T19:03:31+08:00","tags":[]},{"title":"十一假期经历","id":"https://liudon.com/posts/chinese-national-day/","url":"https://liudon.com/posts/chinese-national-day/","summary":"\u003cp\u003e今年的十一火车票非常难抢，12306的候补订单，一直等到时间截止也没订上票。\u003c/p\u003e\n\u003cp\u003e只好请了2天假，提前回家了，给自己也放个假休息一下。\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e回家的几个经历：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e家里的老洗衣机光荣退休了，年龄比我都要大，爸妈舍不得换一直用着。\u003c/p\u003e","content_html":"\u003cp\u003e今年的十一火车票非常难抢，12306的候补订单，一直等到时间截止也没订上票。\u003c/p\u003e\n\u003cp\u003e只好请了2天假，提前回家了，给自己也放个假休息一下。\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e回家的几个经历：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e家里的老洗衣机光荣退休了，年龄比我都要大，爸妈舍不得换一直用着。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/chinese-national-day/SkRx5uFwQ8Cliyq.jpg_320x.avif 320w, https://liudon.com/posts/chinese-national-day/SkRx5uFwQ8Cliyq.jpg_480x.avif 480w, https://liudon.com/posts/chinese-national-day/SkRx5uFwQ8Cliyq.jpg_720x.avif 720w, https://liudon.com/posts/chinese-national-day/SkRx5uFwQ8Cliyq.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/chinese-national-day/SkRx5uFwQ8Cliyq.jpg_320x.webp 320w, https://liudon.com/posts/chinese-national-day/SkRx5uFwQ8Cliyq.jpg_480x.webp 480w, https://liudon.com/posts/chinese-national-day/SkRx5uFwQ8Cliyq.jpg_720x.webp 720w, https://liudon.com/posts/chinese-national-day/SkRx5uFwQ8Cliyq.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/chinese-national-day/SkRx5uFwQ8Cliyq.jpg\" alt=\"64F68D7789A8D877A41E6D694ABE5444.png\" title=\"服役了30年的洗衣机\"\n         width=\"1080\" height=\"810\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e村里今年也要通天然气了，各家各户都要拆煤炉，装壁挂炉，希望天然气供应不出问题。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e全家一起去了趟家门口的园博园，希望以后可以走的更远一些。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/chinese-national-day/wfUv5Kb1LGEdNHc.jpg_320x.avif 320w, https://liudon.com/posts/chinese-national-day/wfUv5Kb1LGEdNHc.jpg_480x.avif 480w, https://liudon.com/posts/chinese-national-day/wfUv5Kb1LGEdNHc.jpg_720x.avif 720w, https://liudon.com/posts/chinese-national-day/wfUv5Kb1LGEdNHc.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/chinese-national-day/wfUv5Kb1LGEdNHc.jpg_320x.webp 320w, https://liudon.com/posts/chinese-national-day/wfUv5Kb1LGEdNHc.jpg_480x.webp 480w, https://liudon.com/posts/chinese-national-day/wfUv5Kb1LGEdNHc.jpg_720x.webp 720w, https://liudon.com/posts/chinese-national-day/wfUv5Kb1LGEdNHc.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/chinese-national-day/wfUv5Kb1LGEdNHc.jpg\" alt=\"F69E19D28B34C163878F2A6E1A43E039.png\" title=\"园博园\"\n         width=\"1080\" height=\"1440\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e娃确实是长大了，有了自己的想法，有自己的脾气了。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e背景：晚上开着灯，要睡觉了。\u003c/p\u003e\n\u003cp\u003e我：睡觉吧。\u003c/p\u003e\n\u003cp\u003e娃：爸爸，你说开着灯能睡觉吗？\u003c/p\u003e\n\u003cp\u003e我：不能吧\u0026hellip;（不知道她为啥问这个问题）\u003c/p\u003e\n\u003cp\u003e娃：那你开着灯让我睡觉，我怎么睡呀！\u003c/p\u003e\n\u003cp\u003e我：原来你在这里等着我呢啊\u0026hellip;\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003chr\u003e\n\u003cp\u003e接下来，就努力工作吧。\u003c/p\u003e\n","date_published":"2019-10-08T13:13:36+08:00","tags":[]},{"title":"Swoft 框架运行分析（五） —— ConsoleProcessor模块分析","id":"https://liudon.com/posts/swoft-console-processor-analysis/","url":"https://liudon.com/posts/swoft-console-processor-analysis/","summary":"\u003cblockquote\u003e\n\u003cp\u003e这里以Swoft启动http server为例。\u003c/p\u003e\n\u003cp\u003ephp bin/swoft http:start\u003c/p\u003e\n\u003cp\u003e执行上述命令，启动http server。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e在前面第一篇文章的时候，提到了如何启动http服务。\u003c/p\u003e\n\u003cp\u003e今天我们就来看一下http服务是如何启动的，具体实现就在\u003ccode\u003eConsoleProcess\u003c/code\u003e这个模块。\u003c/p\u003e","content_html":"\u003cblockquote\u003e\n\u003cp\u003e这里以Swoft启动http server为例。\u003c/p\u003e\n\u003cp\u003ephp bin/swoft http:start\u003c/p\u003e\n\u003cp\u003e执行上述命令，启动http server。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e在前面第一篇文章的时候，提到了如何启动http服务。\u003c/p\u003e\n\u003cp\u003e今天我们就来看一下http服务是如何启动的，具体实现就在\u003ccode\u003eConsoleProcess\u003c/code\u003e这个模块。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003eHandle\u003c/span\u003e \u003cspan class=\"n\"\u003econsole\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"ne\"\u003ebool\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003ethrows\u003c/span\u003e \u003cspan class=\"n\"\u003eReflectionException\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003ethrows\u003c/span\u003e \u003cspan class=\"n\"\u003eContainerException\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003epublic\u003c/span\u003e \u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003ehandle\u003c/span\u003e\u003cspan class=\"p\"\u003e():\u003c/span\u003e \u003cspan class=\"ne\"\u003ebool\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e!$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eapplication\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ebeforeConsole\u003c/span\u003e\u003cspan class=\"p\"\u003e())\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"bp\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e/**\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003eRouter\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003erouter\u003c/span\u003e \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003erouter\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ebean\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;cliRouter\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eRegister\u003c/span\u003e \u003cspan class=\"n\"\u003econsole\u003c/span\u003e \u003cspan class=\"n\"\u003eroutes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eCommandRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eregister\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003erouter\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eCLog\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003einfo\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"s1\"\u003e\u0026#39;Console command route registered (group \u003c/span\u003e\u003cspan class=\"si\"\u003e%d\u003c/span\u003e\u003cspan class=\"s1\"\u003e, command \u003c/span\u003e\u003cspan class=\"si\"\u003e%d\u003c/span\u003e\u003cspan class=\"s1\"\u003e)\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003erouter\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003egroupCount\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003erouter\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ecount\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eRun\u003c/span\u003e \u003cspan class=\"n\"\u003econsole\u003c/span\u003e \u003cspan class=\"n\"\u003eapplication\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003ebean\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;cliApp\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eapplication\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eafterConsole\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e这里调用了\u003ccode\u003ebean\u003c/code\u003e方法获取\u003ccode\u003eBean\u003c/code\u003e实例，定义见\u003ccode\u003eswoft-component-2.0.5\\src\\bean\\src\\Helper\\Functions.php\u003c/code\u003e。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eif (!function_exists(\u0026#39;bean\u0026#39;)) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    /**\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     * Get bean by name\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     *\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     * @param string $name Bean name Or alias Or class name\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     *\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     * @return object|string|mixed\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     */\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    function bean(string $name)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        if (BeanFactory::isSingleton(\u0026#39;config\u0026#39;)) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            return BeanFactory::getBean($name);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        return sprintf(\u0026#39;${%s}\u0026#39;, $name);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e这里调用了\u003ccode\u003eBeanFactory\u003c/code\u003e的\u003ccode\u003egetBean\u003c/code\u003e方法。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * Get object by name\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    *\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @param string $name Bean name Or alias Or class name\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    *\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @return object|mixed\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    */\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epublic static function getBean(string $name)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    return Container::getInstance()-\u0026gt;get($name);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e最终调用的是\u003ccode\u003eSwoft\\Bean\\Container\u003c/code\u003e下的\u003ccode\u003eget\u003c/code\u003e方法。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003eFinds\u003c/span\u003e \u003cspan class=\"n\"\u003ean\u003c/span\u003e \u003cspan class=\"n\"\u003eentry\u003c/span\u003e \u003cspan class=\"n\"\u003eof\u003c/span\u003e \u003cspan class=\"n\"\u003ethe\u003c/span\u003e \u003cspan class=\"n\"\u003econtainer\u003c/span\u003e \u003cspan class=\"n\"\u003eby\u003c/span\u003e \u003cspan class=\"n\"\u003eits\u003c/span\u003e \u003cspan class=\"n\"\u003eidentifier\u003c/span\u003e \u003cspan class=\"ow\"\u003eand\u003c/span\u003e \u003cspan class=\"n\"\u003ereturns\u003c/span\u003e \u003cspan class=\"n\"\u003eit\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eparam\u003c/span\u003e \u003cspan class=\"n\"\u003estring\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eid\u003c/span\u003e \u003cspan class=\"n\"\u003eBean\u003c/span\u003e \u003cspan class=\"n\"\u003ename\u003c/span\u003e \u003cspan class=\"n\"\u003eOr\u003c/span\u003e \u003cspan class=\"n\"\u003ealias\u003c/span\u003e \u003cspan class=\"n\"\u003eOr\u003c/span\u003e \u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"n\"\u003ename\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003eWhen\u003c/span\u003e \u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"n\"\u003ename\u003c/span\u003e \u003cspan class=\"n\"\u003ewill\u003c/span\u003e \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003eall\u003c/span\u003e \u003cspan class=\"n\"\u003eof\u003c/span\u003e \u003cspan class=\"n\"\u003einstance\u003c/span\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"n\"\u003ename\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003eobject\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003ethrows\u003c/span\u003e \u003cspan class=\"n\"\u003eInvalidArgumentException\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003epublic\u003c/span\u003e \u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eIt\u003c/span\u003e \u003cspan class=\"n\"\u003eis\u003c/span\u003e \u003cspan class=\"n\"\u003esingleton\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eisset\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003esingletonPool\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e]))\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003esingletonPool\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003ePrototype\u003c/span\u003e \u003cspan class=\"n\"\u003eby\u003c/span\u003e \u003cspan class=\"n\"\u003eclone\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eisset\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eprototypePool\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e]))\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003eclone\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eprototypePool\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eAlias\u003c/span\u003e \u003cspan class=\"n\"\u003ename\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ealiasId\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ealiases\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"err\"\u003e??\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ealiasId\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ealiasId\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eClass\u003c/span\u003e \u003cspan class=\"n\"\u003ename\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eclassNames\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eclassNames\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"err\"\u003e??\u003c/span\u003e \u003cspan class=\"p\"\u003e[];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eclassNames\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eid\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eend\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eclassNames\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eInterface\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003einterface_exists\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eid\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eInterfaceRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003egetInterfaceInjectBean\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eNot\u003c/span\u003e \u003cspan class=\"n\"\u003edefined\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"n\"\u003eisset\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eobjectDefinitions\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e]))\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003ethrow\u003c/span\u003e \u003cspan class=\"n\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eInvalidArgumentException\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esprintf\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;The bean of \u003c/span\u003e\u003cspan class=\"si\"\u003e%s\u003c/span\u003e\u003cspan class=\"s1\"\u003e is not defined\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e));\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e/*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003eObjectDefinition\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eobjectDefinition\u003c/span\u003e \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eobjectDefinition\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eobjectDefinitions\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003ePrototype\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003esafeNewBean\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eobjectDefinition\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003egetName\u003c/span\u003e\u003cspan class=\"p\"\u003e());\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e获取对应的\u003ccode\u003eObjectDefinition\u003c/code\u003e实例，然后调用\u003ccode\u003esafeNewBean\u003c/code\u003e方法。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * Secure creation of beans\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    *\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @param string $beanName\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @param string $id\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    *\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @return object|mixed\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    */\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eprivate function safeNewBean(string $beanName, string $id = \u0026#39;\u0026#39;)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    try {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        return $this-\u0026gt;newBean($beanName, $id);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    } catch (Throwable $e) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        throw new InvalidArgumentException($e-\u0026gt;getMessage(), 500, $e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e这里又调用了\u003ccode\u003enewBean\u003c/code\u003e方法，在上一篇文章里我们已经讲过这个方法，这里会返回实例化后的\u003ccode\u003eBean\u003c/code\u003e类。\u003c/p\u003e\n\u003cp\u003e那\u003ccode\u003ecliRouter\u003c/code\u003e对应的类是说明呢？这个定义在\u003ccode\u003eswoft-component-2.0.5\\src\\console\\src\\AutoLoader.php\u003c/code\u003e里。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * {@inheritDoc}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    */\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epublic function beans(): array\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    return [\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u0026#39;cliApp\u0026#39;    =\u0026gt; [\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u0026#39;class\u0026#39;   =\u0026gt; Application::class,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u0026#39;version\u0026#39; =\u0026gt; \u0026#39;2.0.0\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        ],\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u0026#39;cliRouter\u0026#39; =\u0026gt; [\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u0026#39;class\u0026#39; =\u0026gt; Router::class,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        ],\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u0026#39;cliDispatcher\u0026#39; =\u0026gt; [\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u0026#39;class\u0026#39; =\u0026gt; ConsoleDispatcher::class,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        ],\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    ];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e所以\u003ccode\u003e$router = bean('cliRouter')\u003c/code\u003e，返回的是一个\u003ccode\u003eSwoft\\Console\\Router\\Router\u003c/code\u003e类。\u003c/p\u003e\n\u003cp\u003e回到\u003ccode\u003eConsoleProcessor\u003c/code\u003e类，接着看代码。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCommandRegister::register($router);\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e调用了\u003ccode\u003eCommandRegister\u003c/code\u003e类的\u003ccode\u003eregister\u003c/code\u003e方法。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @param Router $router\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @throws ReflectionException\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    */\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epublic static function register(Router $router): void\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $maxLen  = 12;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $groups  = [];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $docOpts = [\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u0026#39;allow\u0026#39; =\u0026gt; [\u0026#39;example\u0026#39;]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    ];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $defInfo = [\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u0026#39;example\u0026#39;     =\u0026gt; \u0026#39;\u0026#39;,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u0026#39;description\u0026#39; =\u0026gt; \u0026#39;No description message\u0026#39;,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    ];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    foreach (self::$commands as $class =\u0026gt; $mapping) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        $names = [];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        $group = $mapping[\u0026#39;group\u0026#39;];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        // Set ID aliases\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        $router-\u0026gt;setIdAliases($mapping[\u0026#39;idAliases\u0026#39;]);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        // Set group name aliases\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        $router-\u0026gt;setGroupAliases($group, $mapping[\u0026#39;aliases\u0026#39;]);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        $refInfo = Swoft::getReflection($class);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        $mhdInfo = $refInfo[\u0026#39;methods\u0026#39;] ?? [];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        $grpOpts = $mapping[\u0026#39;options\u0026#39;] ?? [];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        foreach ($mapping[\u0026#39;commands\u0026#39;] as $method =\u0026gt; $route) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            // $method = $route[\u0026#39;method\u0026#39;];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            $cmdDesc = $route[\u0026#39;desc\u0026#39;];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            $command = $route[\u0026#39;command\u0026#39;];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            $idLen = strlen($group . $command);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            if ($idLen \u0026gt; $maxLen) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                $maxLen = $idLen;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            $cmdExam = \u0026#39;\u0026#39;;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            if (!empty($mhdInfo[$method][\u0026#39;comments\u0026#39;])) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                $tagInfo = DocBlock::getTags($mhdInfo[$method][\u0026#39;comments\u0026#39;], $docOpts, $defInfo);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                $cmdDesc = $cmdDesc ?: Str::firstLine($tagInfo[\u0026#39;description\u0026#39;]);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                $cmdExam = $tagInfo[\u0026#39;example\u0026#39;];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            $route[\u0026#39;group\u0026#39;]   = $group;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            $route[\u0026#39;desc\u0026#39;]    = ucfirst($cmdDesc);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            $route[\u0026#39;example\u0026#39;] = $cmdExam;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            $route[\u0026#39;options\u0026#39;] = self::mergeOptions($grpOpts, $route[\u0026#39;options\u0026#39;]);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            // Append group option\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            $route[\u0026#39;enabled\u0026#39;]   = $mapping[\u0026#39;enabled\u0026#39;];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            $route[\u0026#39;coroutine\u0026#39;] = $mapping[\u0026#39;coroutine\u0026#39;];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            $router-\u0026gt;map($group, $command, [$class, $method], $route);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            $names[] = $command;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        $groupExam = \u0026#39;\u0026#39;;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        $groupDesc = $mapping[\u0026#39;desc\u0026#39;];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        if (!empty($refInfo[\u0026#39;comments\u0026#39;])) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            $tagInfo   = DocBlock::getTags($refInfo[\u0026#39;comments\u0026#39;], $docOpts, $defInfo);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            $groupDesc = $groupDesc ?: Str::firstLine($tagInfo[\u0026#39;description\u0026#39;]);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            $groupExam = $tagInfo[\u0026#39;example\u0026#39;];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        $groups[$group] = [\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u0026#39;names\u0026#39;   =\u0026gt; $names,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u0026#39;desc\u0026#39;    =\u0026gt; ucfirst($groupDesc),\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u0026#39;class\u0026#39;   =\u0026gt; $class,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u0026#39;alias\u0026#39;   =\u0026gt; $mapping[\u0026#39;alias\u0026#39;],\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u0026#39;aliases\u0026#39; =\u0026gt; $mapping[\u0026#39;aliases\u0026#39;],\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u0026#39;example\u0026#39; =\u0026gt; $groupExam,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        ];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $router-\u0026gt;setGroups($groups);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    // +1 because router-\u0026gt;delimiter\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $router-\u0026gt;setKeyWidth($maxLen + 1);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    // clear data\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    self::$commands = [];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e这里遍历了类属性\u003ccode\u003e$commands\u003c/code\u003e注册路由。\u003c/p\u003e\n\u003cp\u003e那么\u003ccode\u003e$commands\u003c/code\u003e这个属性是哪里来的呢？\u003c/p\u003e\n\u003cp\u003e既然开头我们说的是http服务是怎么启动的，这里我们就以\u003ccode\u003ehttp-server\u003c/code\u003e来举例，找到\u003ccode\u003eswoft-component-2.0.5\\src\\http-server\\src\\Command\\HttpServerCommand.php\u003c/code\u003e文件。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"err\"\u003e?\u003c/span\u003e\u003cspan class=\"n\"\u003ephp\u003c/span\u003e \u003cspan class=\"n\"\u003edeclare\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003estrict_types\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003enamespace\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eHttp\u003c/span\u003e\\\u003cspan class=\"n\"\u003eServer\u003c/span\u003e\\\u003cspan class=\"n\"\u003eCommand\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eReflectionException\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eBean\u003c/span\u003e\\\u003cspan class=\"n\"\u003eException\u003c/span\u003e\\\u003cspan class=\"n\"\u003eContainerException\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eConsole\u003c/span\u003e\\\u003cspan class=\"n\"\u003eAnnotation\u003c/span\u003e\\\u003cspan class=\"n\"\u003eMapping\u003c/span\u003e\\\u003cspan class=\"n\"\u003eCommand\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eConsole\u003c/span\u003e\\\u003cspan class=\"n\"\u003eAnnotation\u003c/span\u003e\\\u003cspan class=\"n\"\u003eMapping\u003c/span\u003e\\\u003cspan class=\"n\"\u003eCommandMapping\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eConsole\u003c/span\u003e\\\u003cspan class=\"n\"\u003eAnnotation\u003c/span\u003e\\\u003cspan class=\"n\"\u003eMapping\u003c/span\u003e\\\u003cspan class=\"n\"\u003eCommandOption\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eConsole\u003c/span\u003e\\\u003cspan class=\"n\"\u003eHelper\u003c/span\u003e\\\u003cspan class=\"n\"\u003eShow\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eHttp\u003c/span\u003e\\\u003cspan class=\"n\"\u003eServer\u003c/span\u003e\\\u003cspan class=\"n\"\u003eHttpServer\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eServer\u003c/span\u003e\\\u003cspan class=\"n\"\u003eCommand\u003c/span\u003e\\\u003cspan class=\"n\"\u003eBaseServerCommand\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eServer\u003c/span\u003e\\\u003cspan class=\"n\"\u003eException\u003c/span\u003e\\\u003cspan class=\"n\"\u003eServerException\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003ebean\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003einput\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003eoutput\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003eProvide\u003c/span\u003e \u003cspan class=\"n\"\u003esome\u003c/span\u003e \u003cspan class=\"n\"\u003ecommands\u003c/span\u003e \u003cspan class=\"n\"\u003eto\u003c/span\u003e \u003cspan class=\"n\"\u003emanage\u003c/span\u003e \u003cspan class=\"n\"\u003ethe\u003c/span\u003e \u003cspan class=\"n\"\u003eswoft\u003c/span\u003e \u003cspan class=\"n\"\u003eHTTP\u003c/span\u003e \u003cspan class=\"n\"\u003eserver\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003esince\u003c/span\u003e \u003cspan class=\"mf\"\u003e2.0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eCommand\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;http\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ealias\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;httpsrv\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ecoroutine\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"bp\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eexample\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e  \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003efullCmd\u003c/span\u003e\u003cspan class=\"p\"\u003e}:\u003c/span\u003e\u003cspan class=\"n\"\u003estart\u003c/span\u003e     \u003cspan class=\"n\"\u003eStart\u003c/span\u003e \u003cspan class=\"n\"\u003ethe\u003c/span\u003e \u003cspan class=\"n\"\u003ehttp\u003c/span\u003e \u003cspan class=\"n\"\u003eserver\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e  \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003efullCmd\u003c/span\u003e\u003cspan class=\"p\"\u003e}:\u003c/span\u003e\u003cspan class=\"n\"\u003estop\u003c/span\u003e      \u003cspan class=\"n\"\u003eStop\u003c/span\u003e \u003cspan class=\"n\"\u003ethe\u003c/span\u003e \u003cspan class=\"n\"\u003ehttp\u003c/span\u003e \u003cspan class=\"n\"\u003eserver\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"n\"\u003eHttpServerCommand\u003c/span\u003e \u003cspan class=\"k\"\u003eextends\u003c/span\u003e \u003cspan class=\"n\"\u003eBaseServerCommand\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003eStart\u003c/span\u003e \u003cspan class=\"n\"\u003ethe\u003c/span\u003e \u003cspan class=\"n\"\u003ehttp\u003c/span\u003e \u003cspan class=\"n\"\u003eserver\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eCommandMapping\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eusage\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{fullCommand} [-d|--daemon]\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eCommandOption\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;daemon\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eshort\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;d\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003edesc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Run server on the background\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;bool\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003edefault\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;false\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003ethrows\u003c/span\u003e \u003cspan class=\"n\"\u003eReflectionException\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003ethrows\u003c/span\u003e \u003cspan class=\"n\"\u003eContainerException\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003ethrows\u003c/span\u003e \u003cspan class=\"n\"\u003eServerException\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eexample\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e   \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003efullCommand\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e   \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003efullCommand\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ed\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003epublic\u003c/span\u003e \u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003estart\u003c/span\u003e\u003cspan class=\"p\"\u003e():\u003c/span\u003e \u003cspan class=\"n\"\u003evoid\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eserver\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ecreateServer\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eCheck\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003eit\u003c/span\u003e \u003cspan class=\"n\"\u003ehas\u003c/span\u003e \u003cspan class=\"n\"\u003estarted\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eserver\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eisRunning\u003c/span\u003e\u003cspan class=\"p\"\u003e())\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003emasterPid\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eserver\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003egetPid\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eoutput\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ewriteln\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u0026lt;error\u0026gt;The HTTP server have been running!(PID: {$masterPid})\u0026lt;/error\u0026gt;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eStartup\u003c/span\u003e \u003cspan class=\"n\"\u003esettings\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003econfigStartOption\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eserver\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003esettings\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eserver\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003egetSetting\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eSetting\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eworkerNum\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003esettings\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;worker_num\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eServer\u003c/span\u003e \u003cspan class=\"n\"\u003estartup\u003c/span\u003e \u003cspan class=\"n\"\u003eparameters\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003emainHost\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eserver\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003egetHost\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003emainPort\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eserver\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003egetPort\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003emodeName\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eserver\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003egetModeName\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003etypeName\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eserver\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003egetTypeName\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eHttp\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003epanel\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"s1\"\u003e\u0026#39;HTTP\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"s1\"\u003e\u0026#39;listen\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003emainHost\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;:\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003emainPort\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"s1\"\u003e\u0026#39;type\u0026#39;\u003c/span\u003e   \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003etypeName\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"s1\"\u003e\u0026#39;mode\u0026#39;\u003c/span\u003e   \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003emodeName\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"s1\"\u003e\u0026#39;worker\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eworkerNum\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003ePort\u003c/span\u003e \u003cspan class=\"n\"\u003eListeners\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003epanel\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eappendPortsToPanel\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eserver\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003epanel\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eShow\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003epanel\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003epanel\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eoutput\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ewriteln\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;\u0026lt;success\u0026gt;HTTP server start success !\u0026lt;/success\u0026gt;\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eStart\u003c/span\u003e \u003cspan class=\"n\"\u003ethe\u003c/span\u003e \u003cspan class=\"n\"\u003eserver\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eserver\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003estart\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003eReload\u003c/span\u003e \u003cspan class=\"n\"\u003eworker\u003c/span\u003e \u003cspan class=\"n\"\u003eprocesses\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eCommandMapping\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eusage\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{fullCommand} [-t]\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eCommandOption\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;t\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003edesc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Only to reload task processes, default to reload worker and task\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003ethrows\u003c/span\u003e \u003cspan class=\"n\"\u003eReflectionException\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003ethrows\u003c/span\u003e \u003cspan class=\"n\"\u003eContainerException\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003epublic\u003c/span\u003e \u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003ereload\u003c/span\u003e\u003cspan class=\"p\"\u003e():\u003c/span\u003e \u003cspan class=\"n\"\u003evoid\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eserver\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ecreateServer\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003escript\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003einput\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003egetScript\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eCheck\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003eit\u003c/span\u003e \u003cspan class=\"n\"\u003ehas\u003c/span\u003e \u003cspan class=\"n\"\u003estarted\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e!$\u003c/span\u003e\u003cspan class=\"n\"\u003eserver\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eisRunning\u003c/span\u003e\u003cspan class=\"p\"\u003e())\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eoutput\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ewriteln\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;\u0026lt;error\u0026gt;The HTTP server is not running! cannot reload\u0026lt;/error\u0026gt;\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eoutput\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ewritef\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;\u0026lt;info\u0026gt;Server \u003c/span\u003e\u003cspan class=\"si\"\u003e%s\u003c/span\u003e\u003cspan class=\"s1\"\u003e is reloading\u0026lt;/info\u0026gt;\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ereloadTask\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003einput\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ehasOpt\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;t\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eShow\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003enotice\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;Will only reload task worker\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e!$\u003c/span\u003e\u003cspan class=\"n\"\u003eserver\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ereload\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ereloadTask\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eShow\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eerror\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;The swoole server worker process reload fail!\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eoutput\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ewritef\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;\u0026lt;success\u0026gt;HTTP server \u003c/span\u003e\u003cspan class=\"si\"\u003e%s\u003c/span\u003e\u003cspan class=\"s1\"\u003e reload success\u0026lt;/success\u0026gt;\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003eStop\u003c/span\u003e \u003cspan class=\"n\"\u003ethe\u003c/span\u003e \u003cspan class=\"n\"\u003ecurrently\u003c/span\u003e \u003cspan class=\"n\"\u003erunning\u003c/span\u003e \u003cspan class=\"n\"\u003eserver\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eCommandMapping\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003ethrows\u003c/span\u003e \u003cspan class=\"n\"\u003eReflectionException\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003ethrows\u003c/span\u003e \u003cspan class=\"n\"\u003eContainerException\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003epublic\u003c/span\u003e \u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003estop\u003c/span\u003e\u003cspan class=\"p\"\u003e():\u003c/span\u003e \u003cspan class=\"n\"\u003evoid\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eserver\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ecreateServer\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eCheck\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003eit\u003c/span\u003e \u003cspan class=\"n\"\u003ehas\u003c/span\u003e \u003cspan class=\"n\"\u003estarted\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e!$\u003c/span\u003e\u003cspan class=\"n\"\u003eserver\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eisRunning\u003c/span\u003e\u003cspan class=\"p\"\u003e())\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eoutput\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ewriteln\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;\u0026lt;error\u0026gt;The HTTP server is not running! cannot stop.\u0026lt;/error\u0026gt;\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eDo\u003c/span\u003e \u003cspan class=\"n\"\u003estopping\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eserver\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003estop\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003eRestart\u003c/span\u003e \u003cspan class=\"n\"\u003ethe\u003c/span\u003e \u003cspan class=\"n\"\u003ehttp\u003c/span\u003e \u003cspan class=\"n\"\u003eserver\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eCommandMapping\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eusage\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;{fullCommand} [-d|--daemon]\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eCommandOption\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;daemon\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eshort\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;d\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003edesc\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Run server on the background\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003ethrows\u003c/span\u003e \u003cspan class=\"n\"\u003eReflectionException\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003ethrows\u003c/span\u003e \u003cspan class=\"n\"\u003eContainerException\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eexample\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e  \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003efullCommand\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e  \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"n\"\u003efullCommand\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"n\"\u003ed\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003epublic\u003c/span\u003e \u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003erestart\u003c/span\u003e\u003cspan class=\"p\"\u003e():\u003c/span\u003e \u003cspan class=\"n\"\u003evoid\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eserver\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ecreateServer\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eCheck\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003eit\u003c/span\u003e \u003cspan class=\"n\"\u003ehas\u003c/span\u003e \u003cspan class=\"n\"\u003estarted\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eserver\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eisRunning\u003c/span\u003e\u003cspan class=\"p\"\u003e())\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003esuccess\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eserver\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003estop\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e!$\u003c/span\u003e\u003cspan class=\"n\"\u003esuccess\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eoutput\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eerror\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;Stop the old server failed!\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eoutput\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ewritef\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;\u0026lt;success\u0026gt;Server HTTP restart success !\u0026lt;/success\u0026gt;\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eserver\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003estartWithDaemonize\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003eHttpServer\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003ethrows\u003c/span\u003e \u003cspan class=\"n\"\u003eReflectionException\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003ethrows\u003c/span\u003e \u003cspan class=\"n\"\u003eContainerException\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eprivate\u003c/span\u003e \u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003ecreateServer\u003c/span\u003e\u003cspan class=\"p\"\u003e():\u003c/span\u003e \u003cspan class=\"n\"\u003eHttpServer\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003escript\u003c/span\u003e  \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003einput\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003egetScript\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ecommand\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003egetFullCommand\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e/**\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003eHttpServer\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eserver\u003c/span\u003e \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eserver\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ebean\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;httpServer\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eserver\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003esetScriptFile\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eapp\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003egetPath\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e));\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eserver\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003esetFullCommand\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ecommand\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eserver\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e通过\u003ca href=\"https://www.swoft.org/docs/2.x/zh-CN/annotation/usage.html\"\u003eSwoft文档\u003c/a\u003e，我们可以看到这里分别使用了类注解和方法注解。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e@Command(\u0026#34;http\u0026#34;, alias=\u0026#34;httpsrv\u0026#34;, coroutine=false)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e@CommandMapping(usage=\u0026#34;{fullCommand} [-d|--daemon]\u0026#34;)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e@CommandOption(\u0026#34;daemon\u0026#34;, short=\u0026#34;d\u0026#34;, desc=\u0026#34;Run server on the background\u0026#34;, type=\u0026#34;bool\u0026#34;, default=\u0026#34;false\u0026#34;)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e...\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e通过第二篇文章分析，我们知道这里会自动实例化对应的注解类。\u003c/p\u003e\n\u003cp\u003e这里以\u003ccode\u003eSwoft\\Console\\Annotation\\Mapping\\CommandMapping\u003c/code\u003e这个注解为例，对应的注解解析类为\u003ccode\u003eSwoft\\Console\\Annotation\\Parser\\CommandMappingParser\u003c/code\u003e。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"err\"\u003e?\u003c/span\u003e\u003cspan class=\"n\"\u003ephp\u003c/span\u003e \u003cspan class=\"n\"\u003edeclare\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003estrict_types\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003enamespace\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eConsole\u003c/span\u003e\\\u003cspan class=\"n\"\u003eAnnotation\u003c/span\u003e\\\u003cspan class=\"n\"\u003eParser\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eAnnotation\u003c/span\u003e\\\u003cspan class=\"n\"\u003eAnnotation\u003c/span\u003e\\\u003cspan class=\"n\"\u003eMapping\u003c/span\u003e\\\u003cspan class=\"n\"\u003eAnnotationParser\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eAnnotation\u003c/span\u003e\\\u003cspan class=\"n\"\u003eAnnotation\u003c/span\u003e\\\u003cspan class=\"n\"\u003eParser\u003c/span\u003e\\\u003cspan class=\"n\"\u003eParser\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eAnnotation\u003c/span\u003e\\\u003cspan class=\"n\"\u003eException\u003c/span\u003e\\\u003cspan class=\"n\"\u003eAnnotationException\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eConsole\u003c/span\u003e\\\u003cspan class=\"n\"\u003eAnnotation\u003c/span\u003e\\\u003cspan class=\"n\"\u003eMapping\u003c/span\u003e\\\u003cspan class=\"n\"\u003eCommandMapping\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eConsole\u003c/span\u003e\\\u003cspan class=\"n\"\u003eCommandRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003eClass\u003c/span\u003e \u003cspan class=\"n\"\u003eCommandMappingParser\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003esince\u003c/span\u003e \u003cspan class=\"mf\"\u003e2.0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eAnnotationParser\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eCommandMapping\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"k\"\u003eclass\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"n\"\u003eCommandMappingParser\u003c/span\u003e \u003cspan class=\"k\"\u003eextends\u003c/span\u003e \u003cspan class=\"n\"\u003eParser\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003eParse\u003c/span\u003e \u003cspan class=\"n\"\u003eobject\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eparam\u003c/span\u003e \u003cspan class=\"ne\"\u003eint\u003c/span\u003e            \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003etype\u003c/span\u003e \u003cspan class=\"n\"\u003eClass\u003c/span\u003e \u003cspan class=\"ow\"\u003eor\u003c/span\u003e \u003cspan class=\"n\"\u003eMethod\u003c/span\u003e \u003cspan class=\"ow\"\u003eor\u003c/span\u003e \u003cspan class=\"n\"\u003eProperty\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eparam\u003c/span\u003e \u003cspan class=\"n\"\u003eCommandMapping\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eannotation\u003c/span\u003e \u003cspan class=\"n\"\u003eAnnotation\u003c/span\u003e \u003cspan class=\"n\"\u003eobject\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003earray\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003eReturn\u003c/span\u003e \u003cspan class=\"n\"\u003eempty\u003c/span\u003e \u003cspan class=\"n\"\u003earray\u003c/span\u003e \u003cspan class=\"n\"\u003eis\u003c/span\u003e \u003cspan class=\"n\"\u003enothing\u003c/span\u003e \u003cspan class=\"n\"\u003eto\u003c/span\u003e \u003cspan class=\"k\"\u003edo\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003eWhen\u003c/span\u003e \u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"n\"\u003etype\u003c/span\u003e \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ebeanName\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eclassName\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003escope\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ealias\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003esize\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"n\"\u003eis\u003c/span\u003e \u003cspan class=\"n\"\u003eto\u003c/span\u003e \u003cspan class=\"n\"\u003einject\u003c/span\u003e \u003cspan class=\"n\"\u003ebean\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003eWhen\u003c/span\u003e \u003cspan class=\"n\"\u003eproperty\u003c/span\u003e \u003cspan class=\"n\"\u003etype\u003c/span\u003e \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003epropertyValue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eisRef\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"n\"\u003eis\u003c/span\u003e \u003cspan class=\"n\"\u003eto\u003c/span\u003e \u003cspan class=\"n\"\u003ereference\u003c/span\u003e \u003cspan class=\"n\"\u003evalue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003epublic\u003c/span\u003e \u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003eparse\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"ne\"\u003eint\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003etype\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eannotation\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e \u003cspan class=\"n\"\u003earray\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003etype\u003c/span\u003e \u003cspan class=\"o\"\u003e!==\u003c/span\u003e \u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eTYPE_METHOD\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003ethrow\u003c/span\u003e \u003cspan class=\"n\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eAnnotationException\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;`@CommandMapping` must be defined on class method!\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003emethod\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003emethodName\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eadd\u003c/span\u003e \u003cspan class=\"n\"\u003eroute\u003c/span\u003e \u003cspan class=\"n\"\u003einfo\u003c/span\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003econtroller\u003c/span\u003e \u003cspan class=\"n\"\u003eaction\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eCommandRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eaddRoute\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eclassName\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003emethod\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"s1\"\u003e\u0026#39;command\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eannotation\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003egetName\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"err\"\u003e?\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003emethod\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"s1\"\u003e\u0026#39;method\u0026#39;\u003c/span\u003e  \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003emethod\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"s1\"\u003e\u0026#39;alias\u0026#39;\u003c/span\u003e   \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eannotation\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003egetAlias\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"s1\"\u003e\u0026#39;aliases\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eannotation\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003egetAliases\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"s1\"\u003e\u0026#39;desc\u0026#39;\u003c/span\u003e    \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eannotation\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003egetDesc\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"s1\"\u003e\u0026#39;usage\u0026#39;\u003c/span\u003e   \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eannotation\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003egetUsage\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;example\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eannotation\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003egetExample\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e]);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"p\"\u003e[];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e看到这里，你应该可以猜到\u003ccode\u003eCommandRegister\u003c/code\u003e类的\u003ccode\u003e$commands\u003c/code\u003e是怎么来的了吧。\u003c/p\u003e\n\u003cp\u003e我们看下\u003ccode\u003eCommandRegister\u003c/code\u003e类的\u003ccode\u003eaddRoute\u003c/code\u003e方法，验证下想法。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @param string $class\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @param string $method\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @param array  $route\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    *\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @throws AnnotationException\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    */\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epublic static function addRoute(string $class, string $method, array $route): void\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    self::checkClass($class);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    // init some keys\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $route[\u0026#39;options\u0026#39;]   = [];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $route[\u0026#39;arguments\u0026#39;] = [];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    // save\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    self::$commands[$class][\u0026#39;commands\u0026#39;][$method] = $route;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003ebingo，跟我们猜想的一模一样，这下我们也知道\u003ccode\u003eCommandMapping\u003c/code\u003e这个注解是用来注册终端的路由信息。\u003c/p\u003e\n\u003cp\u003e回到\u003ccode\u003eConsoleProcessor\u003c/code\u003e类，接着看代码。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCLog::info(\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u0026#39;Console command route registered (group %d, command %d)\u0026#39;,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $router-\u0026gt;groupCount(),\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $router-\u0026gt;count()\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e打印日志。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e// Run console application\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ebean(\u0026#39;cliApp\u0026#39;)-\u0026gt;run();\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e感觉到了重头戏。\u003c/p\u003e\n\u003cp\u003e根据前面的代码，我们知道\u003ccode\u003ecliApp\u003c/code\u003e这个\u003ccode\u003eBean\u003c/code\u003e实例对应的类是\u003ccode\u003eSwoft\\Console\\Application\u003c/code\u003e。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003evoid\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003ethrows\u003c/span\u003e \u003cspan class=\"n\"\u003eContainerException\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003epublic\u003c/span\u003e \u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e():\u003c/span\u003e \u003cspan class=\"n\"\u003evoid\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003etry\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003etrigger\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eConsoleEvent\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eRUN_BEFORE\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003ePrepare\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eprepare\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eGet\u003c/span\u003e \u003cspan class=\"n\"\u003einput\u003c/span\u003e \u003cspan class=\"n\"\u003ecommand\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003einputCommand\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003einput\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003egetCommand\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e!$\u003c/span\u003e\u003cspan class=\"n\"\u003einputCommand\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003efilterSpecialOption\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003edoRun\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003einputCommand\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003etrigger\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eConsoleEvent\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eRUN_AFTER\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003einputCommand\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"n\"\u003ecatch\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eThrowable\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e/**\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003eConsoleErrorDispatcher\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eerrDispatcher\u003c/span\u003e \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eerrDispatcher\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eBeanFactory\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003egetSingleton\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eConsoleErrorDispatcher\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"k\"\u003eclass\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eHandle\u003c/span\u003e \u003cspan class=\"n\"\u003erequest\u003c/span\u003e \u003cspan class=\"n\"\u003eerror\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eerrDispatcher\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ee\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e通过\u003ccode\u003eSwoft::trigger\u003c/code\u003e，注册了\u003ccode\u003eConsoleEvent::RUN_BEFORE\u003c/code\u003e和\u003ccode\u003eConsoleEvent::RUN_AFTER\u003c/code\u003e两个事件。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eprotected\u003c/span\u003e \u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003eprepare\u003c/span\u003e\u003cspan class=\"p\"\u003e():\u003c/span\u003e \u003cspan class=\"n\"\u003evoid\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003einput\u003c/span\u003e  \u003cspan class=\"o\"\u003e=\u003c/span\u003e \\\u003cspan class=\"n\"\u003einput\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eoutput\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \\\u003cspan class=\"n\"\u003eoutput\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"nb\"\u003eload\u003c/span\u003e \u003cspan class=\"n\"\u003ebuiltin\u003c/span\u003e \u003cspan class=\"n\"\u003ecomments\u003c/span\u003e \u003cspan class=\"n\"\u003evars\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003esetCommentsVars\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ecommentsVars\u003c/span\u003e\u003cspan class=\"p\"\u003e());\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003ccode\u003eprepare\u003c/code\u003e比较简单，这里声明了输入和输出两个类。注意哈，这个后面会用到。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$inputCommand = $this-\u0026gt;input-\u0026gt;getCommand();\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eif (!$inputCommand) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $this-\u0026gt;filterSpecialOption();\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e} else {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $this-\u0026gt;doRun($inputCommand);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e获取终端命令行下的输入，如果有输入执行\u003ccode\u003edoRun\u003c/code\u003e方法。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eparam\u003c/span\u003e \u003cspan class=\"n\"\u003estring\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003einputCmd\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003evoid\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003ethrows\u003c/span\u003e \u003cspan class=\"n\"\u003eReflectionException\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003ethrows\u003c/span\u003e \u003cspan class=\"n\"\u003eContainerException\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003ethrows\u003c/span\u003e \u003cspan class=\"n\"\u003eThrowable\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eprotected\u003c/span\u003e \u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003edoRun\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003estring\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003einputCmd\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e \u003cspan class=\"n\"\u003evoid\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eoutput\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eoutput\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e/*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003eRouter\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003erouter\u003c/span\u003e \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003erouter\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003egetBean\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;cliRouter\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eresult\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003erouter\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ematch\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003einputCmd\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eCommand\u003c/span\u003e \u003cspan class=\"ow\"\u003enot\u003c/span\u003e \u003cspan class=\"n\"\u003efound\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eresult\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e===\u003c/span\u003e \u003cspan class=\"n\"\u003eRouter\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eNOT_FOUND\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003enames\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003erouter\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003egetAllNames\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eoutput\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eliteError\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;The entered command \u0026#39;{$inputCmd}\u0026#39; is not exists!\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003efind\u003c/span\u003e \u003cspan class=\"n\"\u003esimilar\u003c/span\u003e \u003cspan class=\"n\"\u003ecommand\u003c/span\u003e \u003cspan class=\"n\"\u003enames\u003c/span\u003e \u003cspan class=\"n\"\u003eby\u003c/span\u003e \u003cspan class=\"n\"\u003esimilar_text\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003esimilar\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eArr\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003efindSimilar\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003einputCmd\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003enames\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eoutput\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ewritef\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003eMaybe what you mean is:\u003c/span\u003e\u003cspan class=\"se\"\u003e\\n\u003c/span\u003e\u003cspan class=\"s2\"\u003e    \u0026lt;info\u0026gt;\u003c/span\u003e\u003cspan class=\"si\"\u003e%s\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026lt;/info\u0026gt;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eimplode\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;, \u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003esimilar\u003c/span\u003e\u003cspan class=\"p\"\u003e));\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eshowApplicationHelp\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"bp\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003einfo\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eresult\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eOnly\u003c/span\u003e \u003cspan class=\"n\"\u003einput\u003c/span\u003e \u003cspan class=\"n\"\u003ea\u003c/span\u003e \u003cspan class=\"n\"\u003egroup\u003c/span\u003e \u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003edisplay\u003c/span\u003e \u003cspan class=\"n\"\u003ehelp\u003c/span\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003ethe\u003c/span\u003e \u003cspan class=\"n\"\u003egroup\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eresult\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e===\u003c/span\u003e \u003cspan class=\"n\"\u003eRouter\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eONLY_GROUP\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eshowGroupHelp\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003einfo\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;group\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e]);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eDisplay\u003c/span\u003e \u003cspan class=\"n\"\u003ehelp\u003c/span\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003ea\u003c/span\u003e \u003cspan class=\"n\"\u003ecommand\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003einput\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003egetSameOpt\u003c/span\u003e\u003cspan class=\"p\"\u003e([\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;h\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;help\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e]))\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eshowCommandHelp\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003einfo\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eParse\u003c/span\u003e \u003cspan class=\"n\"\u003edefault\u003c/span\u003e \u003cspan class=\"n\"\u003eoptions\u003c/span\u003e \u003cspan class=\"ow\"\u003eand\u003c/span\u003e \u003cspan class=\"n\"\u003earguments\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ebindCommandFlags\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003einfo\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003einput\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003esetCommandId\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003einfo\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;cmdId\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e]);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003etriggerByArray\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eConsoleEvent\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eDISPATCH_BEFORE\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003einfo\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eCall\u003c/span\u003e \u003cspan class=\"n\"\u003ecommand\u003c/span\u003e \u003cspan class=\"n\"\u003ehandler\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e/**\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003eConsoleDispatcher\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003edispatcher\u003c/span\u003e \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003edispatcher\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003egetSingleton\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;cliDispatcher\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003edispatcher\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003edispatch\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003einfo\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003etriggerByArray\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eConsoleEvent\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eDISPATCH_AFTER\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003einfo\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$router = Swoft::getBean(\u0026#39;cliRouter\u0026#39;);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$result = $router-\u0026gt;match($inputCmd);\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e获取\u003ccode\u003ecliRouter\u003c/code\u003e实例，根据输入匹配路由操作类。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * Match route by input command\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    *\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @param array $params [$route]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    *\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @return array\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    *\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * [\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    *  status, info(array)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * ]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    */\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epublic function match(...$params): array\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $delimiter = $this-\u0026gt;delimiter;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $inputCmd  = trim($params[0], \u0026#34;$delimiter \u0026#34;);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $noSepChar = strpos($inputCmd, $delimiter) === false;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    // If use command ID alias\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    if ($noSepChar \u0026amp;\u0026amp; isset($this-\u0026gt;idAliases[$inputCmd])) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        $inputCmd = $this-\u0026gt;idAliases[$inputCmd];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        // Must re-check\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        $noSepChar = strpos($inputCmd, $delimiter) === false;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    if ($noSepChar \u0026amp;\u0026amp; in_array($inputCmd, $this-\u0026gt;defaultCommands, true)) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        $group   = $this-\u0026gt;defaultGroup;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        $command = $this-\u0026gt;resolveCommandAlias($inputCmd);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        // Only a group name\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    } elseif ($noSepChar) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        $group = $this-\u0026gt;resolveGroupAlias($inputCmd);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        if (isset($this-\u0026gt;groups[$group])) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            return [self::ONLY_GROUP, [\u0026#39;group\u0026#39; =\u0026gt; $group]];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        return [self::NOT_FOUND];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    } else {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        $nameList = explode($delimiter, $inputCmd, 2);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        if (count($nameList) === 2) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            [$group, $command] = $nameList;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            // resolve command alias\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            $command = $this-\u0026gt;resolveCommandAlias($command);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        } else {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            $command = \u0026#39;\u0026#39;;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            // $command = $this-\u0026gt;defaultCommand;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            $group = $nameList[0];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $group = $this-\u0026gt;resolveGroupAlias($group);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    // build command ID\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $commandID = $this-\u0026gt;buildCommandID($group, $command);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    if (isset($this-\u0026gt;routes[$commandID])) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        $info = $this-\u0026gt;routes[$commandID];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        // append some info\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        $info[\u0026#39;cmdId\u0026#39;] = $commandID;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        return [self::FOUND, $info];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    if ($group \u0026amp;\u0026amp; isset($this-\u0026gt;groups[$group])) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        return [self::ONLY_GROUP, [\u0026#39;group\u0026#39; =\u0026gt; $group]];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    return [self::NOT_FOUND];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e这里会返回匹配后的路由信息。\u003c/p\u003e\n\u003cp\u003e回到\u003ccode\u003edoRun\u003c/code\u003e方法。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e// Command not found\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eif ($result[0] === Router::NOT_FOUND) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $names = $router-\u0026gt;getAllNames();\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $output-\u0026gt;liteError(\u0026#34;The entered command \u0026#39;{$inputCmd}\u0026#39; is not exists!\u0026#34;);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    // find similar command names by similar_text()\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    if ($similar = Arr::findSimilar($inputCmd, $names)) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        $output-\u0026gt;writef(\u0026#34;\\nMaybe what you mean is:\\n    \u0026lt;info\u0026gt;%s\u0026lt;/info\u0026gt;\u0026#34;, implode(\u0026#39;, \u0026#39;, $similar));\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    } else {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        $this-\u0026gt;showApplicationHelp(false);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    return;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$info = $result[1];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e// Only input a group name, display help for the group\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eif ($result[0] === Router::ONLY_GROUP) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $this-\u0026gt;showGroupHelp($info[\u0026#39;group\u0026#39;]);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    return;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e// Display help for a command\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eif ($this-\u0026gt;input-\u0026gt;getSameOpt([\u0026#39;h\u0026#39;, \u0026#39;help\u0026#39;])) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $this-\u0026gt;showCommandHelp($info);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    return;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e根据返回的路由信息进行不同的处理。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e// Parse default options and arguments\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$this-\u0026gt;bindCommandFlags($info);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$this-\u0026gt;input-\u0026gt;setCommandId($info[\u0026#39;cmdId\u0026#39;]);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSwoft::triggerByArray(ConsoleEvent::DISPATCH_BEFORE, $this, $info);\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e绑定默认参数，注册\u003ccode\u003eConsoleEvent::DISPATCH_BEFORE\u003c/code\u003e事件。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eCall\u003c/span\u003e \u003cspan class=\"n\"\u003ecommand\u003c/span\u003e \u003cspan class=\"n\"\u003ehandler\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e/**\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003eConsoleDispatcher\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003edispatcher\u003c/span\u003e \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003edispatcher\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003egetSingleton\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;cliDispatcher\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003edispatcher\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003edispatch\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003einfo\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e获取\u003ccode\u003ecliDispatcher\u003c/code\u003e的\u003ccode\u003eBean\u003c/code\u003e实例，对应\u003ccode\u003eSwoft\\Console\\ConsoleDispatcher\u003c/code\u003e类，调用\u003ccode\u003edispatch\u003c/code\u003e方法。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @param array $params\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    *\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @return void\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @throws ReflectionException\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @throws Throwable\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    */\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epublic function dispatch(...$params): void\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $route = $params[0];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    // Handler info\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    [$className, $method] = $route[\u0026#39;handler\u0026#39;];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    // Bind method params\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $params = $this-\u0026gt;getBindParams($className, $method);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $object = Swoft::getSingleton($className);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    // Blocking running\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    if (!$route[\u0026#39;coroutine\u0026#39;]) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        $this-\u0026gt;before(get_parent_class($object), $method);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        PhpHelper::call([$object, $method], ...$params);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        $this-\u0026gt;after($method);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        return;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    // Hook php io function\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Runtime::enableCoroutine();\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    // If in unit test env, has been in coroutine.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    if (\\defined(\u0026#39;PHPUNIT_COMPOSER_INSTALL\u0026#39;)) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        $this-\u0026gt;executeByCo($object, $method, $params);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        return;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    // Coroutine running\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    srun(function () use ($object, $method, $params) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        $this-\u0026gt;executeByCo($object, $method, $params);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    });\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e获取路由对应的类和方法，通过\u003ccode\u003eSwoft::getSingleton($className);\u003c/code\u003e实例化对象。\u003c/p\u003e\n\u003cp\u003e如果未开启协程，则用\u003ccode\u003ePhpHelper::call([$object, $method], ...$params);\u003c/code\u003e调用对应的方法。\u003c/p\u003e\n\u003cp\u003e开启协程的话，使用\u003ccode\u003e$this-\u0026gt;executeByCo($object, $method, $params);\u003c/code\u003e调用对应的方法。\u003c/p\u003e\n\u003cp\u003e我们前面启动命令是\u003ccode\u003ephp bin/swoft http:start\u003c/code\u003e，这里对应的类就是\u003ccode\u003eSwoft\\Http\\Server\\Command\\HttpServerCommand\u003c/code\u003e，方法就是\u003ccode\u003estart\u003c/code\u003e。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * Start the http server\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    *\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @CommandMapping(usage=\u0026#34;{fullCommand} [-d|--daemon]\u0026#34;)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @CommandOption(\u0026#34;daemon\u0026#34;, short=\u0026#34;d\u0026#34;, desc=\u0026#34;Run server on the background\u0026#34;, type=\u0026#34;bool\u0026#34;, default=\u0026#34;false\u0026#34;)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    *\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @throws ReflectionException\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @throws ContainerException\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @throws ServerException\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @example\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    *   {fullCommand}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    *   {fullCommand} -d\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    *\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    */\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epublic function start(): void\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $server = $this-\u0026gt;createServer();\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    // Check if it has started\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    if ($server-\u0026gt;isRunning()) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        $masterPid = $server-\u0026gt;getPid();\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        output()-\u0026gt;writeln(\u0026#34;\u0026lt;error\u0026gt;The HTTP server have been running!(PID: {$masterPid})\u0026lt;/error\u0026gt;\u0026#34;);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        return;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    // Startup settings\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $this-\u0026gt;configStartOption($server);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $settings = $server-\u0026gt;getSetting();\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    // Setting\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $workerNum = $settings[\u0026#39;worker_num\u0026#39;];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    // Server startup parameters\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $mainHost = $server-\u0026gt;getHost();\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $mainPort = $server-\u0026gt;getPort();\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $modeName = $server-\u0026gt;getModeName();\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $typeName = $server-\u0026gt;getTypeName();\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    // Http\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $panel = [\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u0026#39;HTTP\u0026#39; =\u0026gt; [\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u0026#39;listen\u0026#39; =\u0026gt; $mainHost . \u0026#39;:\u0026#39; . $mainPort,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u0026#39;type\u0026#39;   =\u0026gt; $typeName,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u0026#39;mode\u0026#39;   =\u0026gt; $modeName,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u0026#39;worker\u0026#39; =\u0026gt; $workerNum,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        ],\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    ];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    // Port Listeners\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $panel = $this-\u0026gt;appendPortsToPanel($server, $panel);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Show::panel($panel);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    output()-\u0026gt;writeln(\u0026#39;\u0026lt;success\u0026gt;HTTP server start success !\u0026lt;/success\u0026gt;\u0026#39;);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    // Start the server\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $server-\u0026gt;start();\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e这里先调用了\u003ccode\u003ecreateServer\u003c/code\u003e方法。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003eHttpServer\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003ethrows\u003c/span\u003e \u003cspan class=\"n\"\u003eReflectionException\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003ethrows\u003c/span\u003e \u003cspan class=\"n\"\u003eContainerException\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eprivate\u003c/span\u003e \u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003ecreateServer\u003c/span\u003e\u003cspan class=\"p\"\u003e():\u003c/span\u003e \u003cspan class=\"n\"\u003eHttpServer\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003escript\u003c/span\u003e  \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003einput\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003egetScript\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ecommand\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003egetFullCommand\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e/**\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003eHttpServer\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eserver\u003c/span\u003e \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eserver\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ebean\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;httpServer\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eserver\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003esetScriptFile\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eapp\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003egetPath\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003escript\u003c/span\u003e\u003cspan class=\"p\"\u003e));\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eserver\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003esetFullCommand\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ecommand\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eserver\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e获取\u003ccode\u003ehttpServer\u003c/code\u003e的\u003ccode\u003eBean\u003c/code\u003e实例。\u003c/p\u003e\n\u003cp\u003e框架定义在\u003ccode\u003eswoft-component-2.0.5\\src\\http-server\\src\\AutoLoader.php\u003c/code\u003e，这里声明了\u003ccode\u003eonRequest\u003c/code\u003e回调事件。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026#39;httpServer\u0026#39;      =\u0026gt; [\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u0026#39;on\u0026#39; =\u0026gt; [\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        SwooleEvent::REQUEST =\u0026gt; bean(RequestListener::class)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    ]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e],\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e业务定义在\u003ccode\u003eswoft-2.0.5\\app\\bean.php\u003c/code\u003e。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026#39;httpServer\u0026#39;        =\u0026gt; [\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u0026#39;class\u0026#39;    =\u0026gt; HttpServer::class,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u0026#39;port\u0026#39;     =\u0026gt; 18306,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u0026#39;listener\u0026#39; =\u0026gt; [\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u0026#39;rpc\u0026#39; =\u0026gt; bean(\u0026#39;rpcServer\u0026#39;)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    ],\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u0026#39;process\u0026#39;  =\u0026gt; [\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e//            \u0026#39;monitor\u0026#39; =\u0026gt; bean(MonitorProcess::class)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e//            \u0026#39;crontab\u0026#39; =\u0026gt; bean(CrontabProcess::class)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    ],\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u0026#39;on\u0026#39;       =\u0026gt; [\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e//            SwooleEvent::TASK   =\u0026gt; bean(SyncTaskListener::class),  // Enable sync task\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        SwooleEvent::TASK   =\u0026gt; bean(TaskListener::class),  // Enable task must task and finish event\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        SwooleEvent::FINISH =\u0026gt; bean(FinishListener::class)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    ],\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    /* @see HttpServer::$setting */\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u0026#39;setting\u0026#39;  =\u0026gt; [\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u0026#39;task_worker_num\u0026#39;       =\u0026gt; 12,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u0026#39;task_enable_coroutine\u0026#39; =\u0026gt; true\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    ]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e],\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003ccode\u003ecreateServer\u003c/code\u003e返回的是一个\u003ccode\u003eSwoft\\Http\\Server\\HttpServer\u003c/code\u003e实例。\u003c/p\u003e\n\u003cp\u003e回到\u003ccode\u003eHttpServerCommand\u003c/code\u003e类的\u003ccode\u003estart\u003c/code\u003e方法。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e// Start the server\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$server-\u0026gt;start();\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e调用\u003ccode\u003eSwoft\\Http\\Server\\HttpServer\u003c/code\u003e类的\u003ccode\u003estart\u003c/code\u003e方法。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * Start server\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    *\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @throws ServerException\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @throws ContainerException\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    */\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epublic function start(): void\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $this-\u0026gt;swooleServer = new \\Swoole\\Http\\Server($this-\u0026gt;host, $this-\u0026gt;port, $this-\u0026gt;mode, $this-\u0026gt;type);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $this-\u0026gt;startSwoole();\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e声明\u003ccode\u003eSwoole\\Http\\Server\u003c/code\u003e对象，调用\u003ccode\u003estartSwoole\u003c/code\u003e方法。\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eSwoft\\Http\\Server\\HttpServer\u003c/code\u003e类继承自\u003ccode\u003eSwoft\\Server\\Server\u003c/code\u003e类，\u003ccode\u003estartSwoole\u003c/code\u003e方法定义在这个类。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * Bind swoole event and start swoole server\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    *\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @throws ServerException\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @throws Swoft\\Bean\\Exception\\ContainerException\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    */\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eprotected function startSwoole(): void\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    if (!$this-\u0026gt;swooleServer) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        throw new ServerException(\u0026#39;You must to new server before start swoole!\u0026#39;);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    // Always enable coroutine hook on server\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    CLog::info(\u0026#39;Swoole\\Runtime::enableCoroutine\u0026#39;);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Runtime::enableCoroutine();\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Swoft::trigger(ServerEvent::BEFORE_SETTING, $this);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    // Set settings\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $this-\u0026gt;swooleServer-\u0026gt;set($this-\u0026gt;setting);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    // Update setting property\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    // $this-\u0026gt;setSetting($this-\u0026gt;swooleServer-\u0026gt;setting);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    // Before Add event\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Swoft::trigger(ServerEvent::BEFORE_ADDED_EVENT, $this);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    // Register events\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $defaultEvents = $this-\u0026gt;defaultEvents();\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $swooleEvents  = array_merge($defaultEvents, $this-\u0026gt;on);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    // Add events\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $this-\u0026gt;addEvent($this-\u0026gt;swooleServer, $swooleEvents, $defaultEvents);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    //After add event\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Swoft::trigger(ServerEvent::AFTER_ADDED_EVENT, $this);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    // Before listener\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Swoft::trigger(ServerEvent::BEFORE_ADDED_LISTENER, $this);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    // Add port listener\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $this-\u0026gt;addListener();\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    // Before bind process\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Swoft::trigger(ServerEvent::BEFORE_ADDED_PROCESS, $this);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    // Add Process\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Swoft::trigger(ServerEvent::ADDED_PROCESS, $this);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    // After bind process\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Swoft::trigger(ServerEvent::AFTER_ADDED_PROCESS, $this);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    // Trigger event\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Swoft::trigger(ServerEvent::BEFORE_START, $this, array_keys($swooleEvents));\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    // Storage server instance\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    self::$server = $this;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    // Start swoole server\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $this-\u0026gt;swooleServer-\u0026gt;start();\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$this-\u0026gt;swooleServer-\u0026gt;set($this-\u0026gt;setting);\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e设置\u003ccode\u003eSwoole\u003c/code\u003e运行配置。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e// Register events\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$defaultEvents = $this-\u0026gt;defaultEvents();\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$swooleEvents  = array_merge($defaultEvents, $this-\u0026gt;on);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e// Add events\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$this-\u0026gt;addEvent($this-\u0026gt;swooleServer, $swooleEvents, $defaultEvents);\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e添加\u003ccode\u003eSwoole\u003c/code\u003e回调事件。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e// Add port listener\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$this-\u0026gt;addListener();\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e监听端口。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e// Start swoole server\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$this-\u0026gt;swooleServer-\u0026gt;start();\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e启动\u003ccode\u003eSwoole\\Http\\Server\u003c/code\u003e服务。\u003c/p\u003e\n\u003cp\u003e现在服务已经启动了，那\u003ccode\u003ehttp请求\u003c/code\u003e是怎么被处理的呢？\u003c/p\u003e\n\u003cp\u003e这个我们下一篇再继续讲。\u003c/p\u003e\n","date_published":"2019-09-26T13:14:23+08:00","tags":["Swoft"]},{"title":"Swoft 框架运行分析（四） —— EventProcessor模块分析","id":"https://liudon.com/posts/swoft-event-processor-analysis/","url":"https://liudon.com/posts/swoft-event-processor-analysis/","summary":"\u003cp\u003e今天我们来看一下\u003ccode\u003eEventProcessor\u003c/code\u003e的实现。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003eHandle\u003c/span\u003e \u003cspan class=\"n\"\u003eevent\u003c/span\u003e \u003cspan class=\"n\"\u003eregister\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"ne\"\u003ebool\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003epublic\u003c/span\u003e \u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003ehandle\u003c/span\u003e\u003cspan class=\"p\"\u003e():\u003c/span\u003e \u003cspan class=\"ne\"\u003ebool\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e!$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eapplication\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ebeforeEvent\u003c/span\u003e\u003cspan class=\"p\"\u003e())\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eCLog\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003ewarning\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;Stop event processor by beforeEvent return false\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"bp\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e/**\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003eEventManager\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eeventManager\u003c/span\u003e \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eeventManager\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ebean\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;eventManager\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ecount1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ecount2\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eListenerRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eregister\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eeventManager\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eCLog\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003einfo\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;Event manager initialized(\u003c/span\u003e\u003cspan class=\"si\"\u003e%d\u003c/span\u003e\u003cspan class=\"s1\"\u003e listener, \u003c/span\u003e\u003cspan class=\"si\"\u003e%d\u003c/span\u003e\u003cspan class=\"s1\"\u003e subscriber)\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ecount1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ecount2\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eTrigger\u003c/span\u003e \u003cspan class=\"n\"\u003ea\u003c/span\u003e \u003cspan class=\"n\"\u003eapp\u003c/span\u003e \u003cspan class=\"n\"\u003einit\u003c/span\u003e \u003cspan class=\"n\"\u003eevent\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003etrigger\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eSwoftEvent\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eAPP_INIT_COMPLETE\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eapplication\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eafterEvent\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e获取\u003ccode\u003eeventManager\u003c/code\u003e的\u003ccode\u003eBean\u003c/code\u003e实例，对应为\u003ccode\u003eSwoft\\Event\\Manager\\EventManager\u003c/code\u003e类。\u003c/p\u003e","content_html":"\u003cp\u003e今天我们来看一下\u003ccode\u003eEventProcessor\u003c/code\u003e的实现。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003eHandle\u003c/span\u003e \u003cspan class=\"n\"\u003eevent\u003c/span\u003e \u003cspan class=\"n\"\u003eregister\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"ne\"\u003ebool\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003epublic\u003c/span\u003e \u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003ehandle\u003c/span\u003e\u003cspan class=\"p\"\u003e():\u003c/span\u003e \u003cspan class=\"ne\"\u003ebool\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e!$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eapplication\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ebeforeEvent\u003c/span\u003e\u003cspan class=\"p\"\u003e())\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eCLog\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003ewarning\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;Stop event processor by beforeEvent return false\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"bp\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e/**\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003eEventManager\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eeventManager\u003c/span\u003e \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eeventManager\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ebean\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;eventManager\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ecount1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ecount2\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eListenerRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eregister\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eeventManager\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eCLog\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003einfo\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;Event manager initialized(\u003c/span\u003e\u003cspan class=\"si\"\u003e%d\u003c/span\u003e\u003cspan class=\"s1\"\u003e listener, \u003c/span\u003e\u003cspan class=\"si\"\u003e%d\u003c/span\u003e\u003cspan class=\"s1\"\u003e subscriber)\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ecount1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ecount2\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eTrigger\u003c/span\u003e \u003cspan class=\"n\"\u003ea\u003c/span\u003e \u003cspan class=\"n\"\u003eapp\u003c/span\u003e \u003cspan class=\"n\"\u003einit\u003c/span\u003e \u003cspan class=\"n\"\u003eevent\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003etrigger\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eSwoftEvent\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eAPP_INIT_COMPLETE\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eapplication\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eafterEvent\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e获取\u003ccode\u003eeventManager\u003c/code\u003e的\u003ccode\u003eBean\u003c/code\u003e实例，对应为\u003ccode\u003eSwoft\\Event\\Manager\\EventManager\u003c/code\u003e类。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[$count1, $count2] = ListenerRegister::register($eventManager);\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e调用\u003ccode\u003eListenerRegister\u003c/code\u003e类的\u003ccode\u003eregister\u003c/code\u003e方法。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @param EventManager $em\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    *\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @return array\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    */\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epublic static function register(EventManager $em): array\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    foreach (self::$listeners as $className =\u0026gt; $eventInfo) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        $listener = Swoft::getSingleton($className);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        if (!$listener instanceof EventHandlerInterface) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            throw new RuntimeException(\u0026#34;The event listener class \u0026#39;{$className}\u0026#39; must be instanceof EventHandlerInterface\u0026#34;);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        $em-\u0026gt;addListener($listener, $eventInfo);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    foreach (self::$subscribers as $className) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        $subscriber = Swoft::getSingleton($className);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        if (!$subscriber instanceof EventSubscriberInterface) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            throw new RuntimeException(\u0026#34;The event subscriber class \u0026#39;{$className}\u0026#39; must be instanceof EventSubscriberInterface\u0026#34;);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        $em-\u0026gt;addSubscriber($subscriber);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $count1 = count(self::$listeners);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $count2 = count(self::$subscribers);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    // Clear data\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    self::$listeners = self::$subscribers = [];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    return [$count1, $count2];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e遍历\u003ccode\u003eListenerRegister\u003c/code\u003e类下的\u003ccode\u003e$listeners\u003c/code\u003e和\u003ccode\u003e$subscribers\u003c/code\u003e属性，绑定事件到\u003ccode\u003eeventManager\u003c/code\u003e的\u003ccode\u003eBean\u003c/code\u003e实例上。\u003c/p\u003e\n\u003cp\u003e这里的\u003ccode\u003e$listeners\u003c/code\u003e和\u003ccode\u003e$subscribers\u003c/code\u003e是从哪里来的呢？\u003c/p\u003e\n\u003cp\u003e这里以\u003ccode\u003ehttp-server\u003c/code\u003e为例。\u003c/p\u003e\n\u003cp\u003e在\u003ccode\u003eswoft-component-2.0.5\\src\\http-server\\src\\Listener\u003c/code\u003e目录下，存在下面三个文件。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAfterRequestListener.php\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAppInitCompleteListener.php\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eBeforeRequestListener.php\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e这里我们以\u003ccode\u003eAppInitCompleteListener.php\u003c/code\u003e为例。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"err\"\u003e?\u003c/span\u003e\u003cspan class=\"n\"\u003ephp\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003enamespace\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eHttp\u003c/span\u003e\\\u003cspan class=\"n\"\u003eServer\u003c/span\u003e\\\u003cspan class=\"n\"\u003eListener\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003ebean\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eReflectionException\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eBean\u003c/span\u003e\\\u003cspan class=\"n\"\u003eException\u003c/span\u003e\\\u003cspan class=\"n\"\u003eContainerException\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eEvent\u003c/span\u003e\\\u003cspan class=\"n\"\u003eAnnotation\u003c/span\u003e\\\u003cspan class=\"n\"\u003eMapping\u003c/span\u003e\\\u003cspan class=\"n\"\u003eListener\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eEvent\u003c/span\u003e\\\u003cspan class=\"n\"\u003eEventHandlerInterface\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eEvent\u003c/span\u003e\\\u003cspan class=\"n\"\u003eEventInterface\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eHttp\u003c/span\u003e\\\u003cspan class=\"n\"\u003eServer\u003c/span\u003e\\\u003cspan class=\"n\"\u003eException\u003c/span\u003e\\\u003cspan class=\"n\"\u003eHttpServerException\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eHttp\u003c/span\u003e\\\u003cspan class=\"n\"\u003eServer\u003c/span\u003e\\\u003cspan class=\"n\"\u003eMiddleware\u003c/span\u003e\\\u003cspan class=\"n\"\u003eMiddlewareRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eHttp\u003c/span\u003e\\\u003cspan class=\"n\"\u003eServer\u003c/span\u003e\\\u003cspan class=\"n\"\u003eRouter\u003c/span\u003e\\\u003cspan class=\"n\"\u003eRouter\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eHttp\u003c/span\u003e\\\u003cspan class=\"n\"\u003eServer\u003c/span\u003e\\\u003cspan class=\"n\"\u003eRouter\u003c/span\u003e\\\u003cspan class=\"n\"\u003eRouteRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eSwoftEvent\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003eClass\u003c/span\u003e \u003cspan class=\"n\"\u003eAppInitCompleteListener\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003esince\u003c/span\u003e \u003cspan class=\"mf\"\u003e2.0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eListener\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eSwoftEvent\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eAPP_INIT_COMPLETE\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"n\"\u003eAppInitCompleteListener\u003c/span\u003e \u003cspan class=\"n\"\u003eimplements\u003c/span\u003e \u003cspan class=\"n\"\u003eEventHandlerInterface\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eparam\u003c/span\u003e \u003cspan class=\"n\"\u003eEventInterface\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eevent\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003ethrows\u003c/span\u003e \u003cspan class=\"n\"\u003eContainerException\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003ethrows\u003c/span\u003e \u003cspan class=\"n\"\u003eReflectionException\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003ethrows\u003c/span\u003e \u003cspan class=\"n\"\u003eHttpServerException\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003epublic\u003c/span\u003e \u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003ehandle\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eEventInterface\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eevent\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e \u003cspan class=\"n\"\u003evoid\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e/**\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003eRouter\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003erouter\u003c/span\u003e \u003cspan class=\"n\"\u003eRegister\u003c/span\u003e \u003cspan class=\"n\"\u003eHTTP\u003c/span\u003e \u003cspan class=\"n\"\u003eroutes\u003c/span\u003e \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003erouter\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ebean\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;httpRouter\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eRouteRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eregisterRoutes\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003erouter\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eRegister\u003c/span\u003e \u003cspan class=\"n\"\u003emiddleware\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eMiddlewareRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eregister\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e可以看到这里通过\u003ccode\u003e@Listener(SwoftEvent::APP_INIT_COMPLETE)\u003c/code\u003e，使用了\u003ccode\u003eSwoft\\Event\\Annotation\\Mapping\\Listener\u003c/code\u003e类注解，对应的注解解析类为\u003ccode\u003eSwoft\\Event\\Annotation\\Parser\\ListenerParser\u003c/code\u003e。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"err\"\u003e?\u003c/span\u003e\u003cspan class=\"n\"\u003ephp\u003c/span\u003e \u003cspan class=\"n\"\u003edeclare\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003estrict_types\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003enamespace\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eEvent\u003c/span\u003e\\\u003cspan class=\"n\"\u003eAnnotation\u003c/span\u003e\\\u003cspan class=\"n\"\u003eParser\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eDoctrine\u003c/span\u003e\\\u003cspan class=\"n\"\u003eCommon\u003c/span\u003e\\\u003cspan class=\"n\"\u003eAnnotations\u003c/span\u003e\\\u003cspan class=\"n\"\u003eAnnotationException\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eAnnotation\u003c/span\u003e\\\u003cspan class=\"n\"\u003eAnnotation\u003c/span\u003e\\\u003cspan class=\"n\"\u003eMapping\u003c/span\u003e\\\u003cspan class=\"n\"\u003eAnnotationParser\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eAnnotation\u003c/span\u003e\\\u003cspan class=\"n\"\u003eAnnotation\u003c/span\u003e\\\u003cspan class=\"n\"\u003eParser\u003c/span\u003e\\\u003cspan class=\"n\"\u003eParser\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eBean\u003c/span\u003e\\\u003cspan class=\"n\"\u003eAnnotation\u003c/span\u003e\\\u003cspan class=\"n\"\u003eMapping\u003c/span\u003e\\\u003cspan class=\"n\"\u003eBean\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eEvent\u003c/span\u003e\\\u003cspan class=\"n\"\u003eAnnotation\u003c/span\u003e\\\u003cspan class=\"n\"\u003eMapping\u003c/span\u003e\\\u003cspan class=\"n\"\u003eListener\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eEvent\u003c/span\u003e\\\u003cspan class=\"n\"\u003eListenerRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003eClass\u003c/span\u003e \u003cspan class=\"n\"\u003eListenerParser\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003esince\u003c/span\u003e \u003cspan class=\"mf\"\u003e2.0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eAnnotationParser\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eListener\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"k\"\u003eclass\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"n\"\u003eListenerParser\u003c/span\u003e \u003cspan class=\"k\"\u003eextends\u003c/span\u003e \u003cspan class=\"n\"\u003eParser\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eparam\u003c/span\u003e \u003cspan class=\"ne\"\u003eint\u003c/span\u003e      \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003etype\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eparam\u003c/span\u003e \u003cspan class=\"n\"\u003eListener\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eannotation\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003earray\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003ethrows\u003c/span\u003e \u003cspan class=\"n\"\u003eAnnotationException\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003epublic\u003c/span\u003e \u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003eparse\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"ne\"\u003eint\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003etype\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eannotation\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e \u003cspan class=\"n\"\u003earray\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003etype\u003c/span\u003e \u003cspan class=\"o\"\u003e!==\u003c/span\u003e \u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eTYPE_CLASS\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003ethrow\u003c/span\u003e \u003cspan class=\"n\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eAnnotationException\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;`@Listener` must be defined on class!\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003ecollect\u003c/span\u003e \u003cspan class=\"n\"\u003elisteners\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eListenerRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eaddListener\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eclassName\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eevent\u003c/span\u003e \u003cspan class=\"n\"\u003ename\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003elistener\u003c/span\u003e \u003cspan class=\"n\"\u003epriority\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eannotation\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003egetEvent\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eannotation\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003egetPriority\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e]);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eclassName\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eclassName\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eBean\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eSINGLETON\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-zed\" data-lang=\"zed\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e    * @param string $className\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e    * @param array  $definition [event name =\u0026gt; listener priority]\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e    */\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003epublic\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003estatic\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003efunction\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eaddListener\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003estring\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eclassName\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003earray\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"kt\"\u003edefinition\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[])\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003evoid\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Collect listeners\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eself\u003c/span\u003e\u003cspan class=\"o\"\u003e::\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003elisteners\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eclassName\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"kt\"\u003edefinition\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e可以看到这里通过\u003ccode\u003eListenerRegister::addListener\u003c/code\u003e方法，往\u003ccode\u003eListenerRegister\u003c/code\u003e上注册了\u003ccode\u003e$listeners\u003c/code\u003e属性。\u003c/p\u003e\n\u003cp\u003e属性\u003ccode\u003e$listeners\u003c/code\u003e和\u003ccode\u003e$subscribers\u003c/code\u003e的值，都是通过注解解析得来。\u003c/p\u003e\n\u003cp\u003e这里我们回到\u003ccode\u003eEventProcessor\u003c/code\u003e类的\u003ccode\u003ehandle\u003c/code\u003e方法。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e// Trigger a app init event\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSwoft::trigger(SwoftEvent::APP_INIT_COMPLETE);\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003etrigger的方法定义如下。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * Trigger an swoft application event\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    *\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @param string|EventInterface $event eg: \u0026#39;app.start\u0026#39; \u0026#39;app.stop\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @param null|mixed            $target\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @param array                 $params\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    *\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @return EventInterface\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    */\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epublic static function trigger($event, $target = null, ...$params): EventInterface\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    /** @see EventManager::trigger() */\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    return BeanFactory::getSingleton(\u0026#39;eventManager\u0026#39;)-\u0026gt;trigger($event, $target, $params);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e这里调用了\u003ccode\u003eeventManager\u003c/code\u003e这个\u003ccode\u003eBean\u003c/code\u003e实例的\u003ccode\u003etrigger\u003c/code\u003e方法。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003eTrigger\u003c/span\u003e \u003cspan class=\"n\"\u003ean\u003c/span\u003e \u003cspan class=\"n\"\u003eevent\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e \u003cspan class=\"n\"\u003eCan\u003c/span\u003e \u003cspan class=\"n\"\u003eaccept\u003c/span\u003e \u003cspan class=\"n\"\u003ean\u003c/span\u003e \u003cspan class=\"n\"\u003eEventInterface\u003c/span\u003e \u003cspan class=\"ow\"\u003eor\u003c/span\u003e \u003cspan class=\"n\"\u003ewill\u003c/span\u003e \u003cspan class=\"n\"\u003ecreate\u003c/span\u003e \u003cspan class=\"n\"\u003eone\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"ow\"\u003enot\u003c/span\u003e \u003cspan class=\"n\"\u003epassed\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eparam\u003c/span\u003e \u003cspan class=\"n\"\u003estring\u003c/span\u003e\u003cspan class=\"o\"\u003e|\u003c/span\u003e\u003cspan class=\"n\"\u003eEventInterface\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eevent\u003c/span\u003e  \u003cspan class=\"s1\"\u003e\u0026#39;app.start\u0026#39;\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;app.stop\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eparam\u003c/span\u003e \u003cspan class=\"n\"\u003emixed\u003c/span\u003e\u003cspan class=\"o\"\u003e|\u003c/span\u003e\u003cspan class=\"n\"\u003estring\u003c/span\u003e          \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003etarget\u003c/span\u003e \u003cspan class=\"n\"\u003eIt\u003c/span\u003e \u003cspan class=\"n\"\u003eis\u003c/span\u003e \u003cspan class=\"n\"\u003eobject\u003c/span\u003e \u003cspan class=\"ow\"\u003eor\u003c/span\u003e \u003cspan class=\"n\"\u003estring\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eparam\u003c/span\u003e \u003cspan class=\"n\"\u003earray\u003c/span\u003e\u003cspan class=\"o\"\u003e|\u003c/span\u003e\u003cspan class=\"n\"\u003emixed\u003c/span\u003e           \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eargs\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003eEventInterface\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003ethrows\u003c/span\u003e \u003cspan class=\"n\"\u003eInvalidArgumentException\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003epublic\u003c/span\u003e \u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003etrigger\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eevent\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003etarget\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003enull\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003earray\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eargs\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[]):\u003c/span\u003e \u003cspan class=\"n\"\u003eEventInterface\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eisString\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eis_string\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eevent\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ename\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003etrim\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eevent\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"n\"\u003eelseif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eevent\u003c/span\u003e \u003cspan class=\"n\"\u003einstanceof\u003c/span\u003e \u003cspan class=\"n\"\u003eEventInterface\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ename\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003etrim\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eevent\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003egetName\u003c/span\u003e\u003cspan class=\"p\"\u003e());\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003ethrow\u003c/span\u003e \u003cspan class=\"n\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eInvalidArgumentException\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;Invalid event params for trigger event handler\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eshouldCall\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eHave\u003c/span\u003e \u003cspan class=\"n\"\u003ematched\u003c/span\u003e \u003cspan class=\"n\"\u003elistener\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eisset\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003elistenedEvents\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e]))\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eshouldCall\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eLike\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;app.db.query\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003eprefix\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;app.db\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003epos\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003estrrpos\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;.\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eprefix\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003esubstr\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003epos\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eHave\u003c/span\u003e \u003cspan class=\"n\"\u003ea\u003c/span\u003e \u003cspan class=\"n\"\u003ewildcards\u003c/span\u003e \u003cspan class=\"n\"\u003elistener\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e \u003cspan class=\"n\"\u003eeg\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;app.db.*\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ewildcardEvent\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eprefix\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;.*\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eisset\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003elistenedEvents\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ewildcardEvent\u003c/span\u003e\u003cspan class=\"p\"\u003e]))\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eshouldCall\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ewildcardEvent\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003esubstr\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003epos\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eNot\u003c/span\u003e \u003cspan class=\"n\"\u003efound\u003c/span\u003e \u003cspan class=\"n\"\u003elisteners\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e!$\u003c/span\u003e\u003cspan class=\"n\"\u003eshouldCall\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eisString\u003c/span\u003e \u003cspan class=\"err\"\u003e?\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ebasicEvent\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eevent\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e/**\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003eEventInterface\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eevent\u003c/span\u003e \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eisString\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eevent\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eevents\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"err\"\u003e??\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ebasicEvent\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eInitial\u003c/span\u003e \u003cspan class=\"n\"\u003evalue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eevent\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003esetName\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eevent\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003esetParams\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eargs\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eevent\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003esetTarget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003etarget\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eevent\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003estopPropagation\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"bp\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eNotify\u003c/span\u003e \u003cspan class=\"n\"\u003eevent\u003c/span\u003e \u003cspan class=\"n\"\u003elisteners\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eforeach\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eshouldCall\u003c/span\u003e \u003cspan class=\"n\"\u003eas\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ename\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003emethod\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003etriggerListeners\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003elisteners\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eevent\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003emethod\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eevent\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eisPropagationStopped\u003c/span\u003e\u003cspan class=\"p\"\u003e())\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eevent\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eHave\u003c/span\u003e \u003cspan class=\"n\"\u003eglobal\u003c/span\u003e \u003cspan class=\"n\"\u003ewildcards\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;*\u0026#39;\u003c/span\u003e \u003cspan class=\"n\"\u003elistener\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eisset\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003elistenedEvents\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;*\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e]))\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003etriggerListeners\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003elisteners\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;*\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eevent\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eevent\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e如果存在对应的事件，调用\u003ccode\u003etriggerListeners\u003c/code\u003e方法。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @param array|ListenerQueue $listeners\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @param EventInterface      $event\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @param string              $method\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    */\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eprotected function triggerListeners($listeners, EventInterface $event, string $method = \u0026#39;\u0026#39;): void\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    // $handled = false;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $name     = $event-\u0026gt;getName();\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $callable = false === strpos($name, \u0026#39;.\u0026#39;);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    // 循环调用监听器，处理事件\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    foreach ($listeners as $listener) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        if ($event-\u0026gt;isPropagationStopped()) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            break;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        if (is_object($listener)) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            if ($listener instanceof EventHandlerInterface) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                $listener-\u0026gt;handle($event);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            } elseif ($method \u0026amp;\u0026amp; method_exists($listener, $method)) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                $listener-\u0026gt;$method($event);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            } elseif ($callable \u0026amp;\u0026amp; method_exists($listener, $name)) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                $listener-\u0026gt;$name($event);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            } elseif (method_exists($listener, \u0026#39;__invoke\u0026#39;)) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                $listener($event);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        } elseif (is_callable($listener)) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            $listener($event);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e遍历事件回调，执行对应方法。\u003c/p\u003e\n\u003cp\u003e回到\u003ccode\u003eEventProcessor\u003c/code\u003e类的\u003ccode\u003ehandle\u003c/code\u003e方法。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e// Trigger a app init event\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSwoft::trigger(SwoftEvent::APP_INIT_COMPLETE);\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e这里的事件为\u003ccode\u003eSwoftEvent::APP_INIT_COMPLETE\u003c/code\u003e，所以这里会执行这个事件下的所有回调。\u003c/p\u003e\n\u003cp\u003e这里以\u003ccode\u003eSwoft\\Http\\Server\\Listener\\AppInitCompleteListener\u003c/code\u003e为例。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"err\"\u003e?\u003c/span\u003e\u003cspan class=\"n\"\u003ephp\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003enamespace\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eHttp\u003c/span\u003e\\\u003cspan class=\"n\"\u003eServer\u003c/span\u003e\\\u003cspan class=\"n\"\u003eListener\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003ebean\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eReflectionException\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eBean\u003c/span\u003e\\\u003cspan class=\"n\"\u003eException\u003c/span\u003e\\\u003cspan class=\"n\"\u003eContainerException\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eEvent\u003c/span\u003e\\\u003cspan class=\"n\"\u003eAnnotation\u003c/span\u003e\\\u003cspan class=\"n\"\u003eMapping\u003c/span\u003e\\\u003cspan class=\"n\"\u003eListener\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eEvent\u003c/span\u003e\\\u003cspan class=\"n\"\u003eEventHandlerInterface\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eEvent\u003c/span\u003e\\\u003cspan class=\"n\"\u003eEventInterface\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eHttp\u003c/span\u003e\\\u003cspan class=\"n\"\u003eServer\u003c/span\u003e\\\u003cspan class=\"n\"\u003eException\u003c/span\u003e\\\u003cspan class=\"n\"\u003eHttpServerException\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eHttp\u003c/span\u003e\\\u003cspan class=\"n\"\u003eServer\u003c/span\u003e\\\u003cspan class=\"n\"\u003eMiddleware\u003c/span\u003e\\\u003cspan class=\"n\"\u003eMiddlewareRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eHttp\u003c/span\u003e\\\u003cspan class=\"n\"\u003eServer\u003c/span\u003e\\\u003cspan class=\"n\"\u003eRouter\u003c/span\u003e\\\u003cspan class=\"n\"\u003eRouter\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eHttp\u003c/span\u003e\\\u003cspan class=\"n\"\u003eServer\u003c/span\u003e\\\u003cspan class=\"n\"\u003eRouter\u003c/span\u003e\\\u003cspan class=\"n\"\u003eRouteRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eSwoftEvent\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003eClass\u003c/span\u003e \u003cspan class=\"n\"\u003eAppInitCompleteListener\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003esince\u003c/span\u003e \u003cspan class=\"mf\"\u003e2.0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eListener\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eSwoftEvent\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eAPP_INIT_COMPLETE\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"n\"\u003eAppInitCompleteListener\u003c/span\u003e \u003cspan class=\"n\"\u003eimplements\u003c/span\u003e \u003cspan class=\"n\"\u003eEventHandlerInterface\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eparam\u003c/span\u003e \u003cspan class=\"n\"\u003eEventInterface\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eevent\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003ethrows\u003c/span\u003e \u003cspan class=\"n\"\u003eContainerException\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003ethrows\u003c/span\u003e \u003cspan class=\"n\"\u003eReflectionException\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003ethrows\u003c/span\u003e \u003cspan class=\"n\"\u003eHttpServerException\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003epublic\u003c/span\u003e \u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003ehandle\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eEventInterface\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eevent\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e \u003cspan class=\"n\"\u003evoid\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e/**\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003eRouter\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003erouter\u003c/span\u003e \u003cspan class=\"n\"\u003eRegister\u003c/span\u003e \u003cspan class=\"n\"\u003eHTTP\u003c/span\u003e \u003cspan class=\"n\"\u003eroutes\u003c/span\u003e \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003erouter\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ebean\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;httpRouter\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eRouteRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eregisterRoutes\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003erouter\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eRegister\u003c/span\u003e \u003cspan class=\"n\"\u003emiddleware\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eMiddlewareRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eregister\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e这里使用了\u003ccode\u003eSwoft\\Event\\Annotation\\Mapping\\Listener\u003c/code\u003e注解，对应的事件为\u003ccode\u003eSwoftEvent::APP_INIT_COMPLETE\u003c/code\u003e。\u003c/p\u003e\n\u003cp\u003e按照上面的分析，这里会调用到\u003ccode\u003eAppInitCompleteListener\u003c/code\u003e的\u003ccode\u003ehandle\u003c/code\u003e方法，获取\u003ccode\u003ehttpRouter\u003c/code\u003e的\u003ccode\u003eBean\u003c/code\u003e实例，注册\u003ccode\u003ehttp服务\u003c/code\u003e的路由信息和中间件。\u003c/p\u003e\n\u003cp\u003e到这里，我们大概清楚了\u003ccode\u003eEventProcessor\u003c/code\u003e这个模块的作用，注册了所有事件的回调。\u003c/p\u003e\n","date_published":"2019-09-26T13:02:18+08:00","tags":["Swoft"]},{"title":"一个git submodule update引发的问题","id":"https://liudon.com/posts/a-issues-of-git-submodule-update/","url":"https://liudon.com/posts/a-issues-of-git-submodule-update/","summary":"\u003ch4 id=\"背景\"\u003e背景\u003c/h4\u003e\n\u003cp\u003e1月份的时候，用\u003ccode\u003ehugo\u003c/code\u003e搭了这套博客系统。\u003c/p\u003e\n\u003cp\u003e本机写md文件，更新到\u003ccode\u003egithub\u003c/code\u003e，然后通过\u003ccode\u003etravis-ci\u003c/code\u003e自动发布。\u003c/p\u003e\n\u003cp\u003ejane主题是通过\u003ccode\u003egit submodule\u003c/code\u003e引入的，\u003ccode\u003e.gitmodules\u003c/code\u003e文件内容。\u003c/p\u003e","content_html":"\u003ch4 id=\"背景\"\u003e背景\u003c/h4\u003e\n\u003cp\u003e1月份的时候，用\u003ccode\u003ehugo\u003c/code\u003e搭了这套博客系统。\u003c/p\u003e\n\u003cp\u003e本机写md文件，更新到\u003ccode\u003egithub\u003c/code\u003e，然后通过\u003ccode\u003etravis-ci\u003c/code\u003e自动发布。\u003c/p\u003e\n\u003cp\u003ejane主题是通过\u003ccode\u003egit submodule\u003c/code\u003e引入的，\u003ccode\u003e.gitmodules\u003c/code\u003e文件内容。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[submodule \u0026#34;themes/jane\u0026#34;]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\tpath = themes/jane\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\turl = https://github.com/xianmin/hugo-theme-jane.git\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"问题\"\u003e问题\u003c/h4\u003e\n\u003cp\u003e最近几天更新完文章后，发现首页显示出了问题。\u003c/p\u003e\n\u003cp\u003e一开始以为是主题有问题，具体描述见\u003ca href=\"https://github.com/xianmin/hugo-theme-jane/issues/244\"\u003e首页文章不显示了\u003c/a\u003e。\u003c/p\u003e\n\u003cp\u003e在\u003ccode\u003eissue\u003c/code\u003e里：\n\u003ccode\u003eshaform\u003c/code\u003e提到使用的并不是最新的版本。\n\u003ccode\u003eRocFang\u003c/code\u003e提到是\u003ccode\u003egit submodule\u003c/code\u003e使用的问题。\u003c/p\u003e\n\u003cp\u003e但是\u003ccode\u003etravis-ci\u003c/code\u003e每次都是通过\u003ccode\u003egit submodule update --init --recursive\u003c/code\u003e更新子仓库代码的，为什么会不是最新的代码呢。\u003c/p\u003e\n\u003ch4 id=\"问题重现\"\u003e问题重现\u003c/h4\u003e\n\u003cp\u003e接下来，我们用一个新的仓库，来模拟重现一下。\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e克隆仓库。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[root@VM_81_18_centos xx]# git clone git@github.com:Liudon/test.git\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCloning into \u0026#39;test\u0026#39;...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[root@VM_81_18_centos test]# \n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e添加文件。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e [root@VM_81_18_centos xx]# cd test/\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e [root@VM_81_18_centos test]# echo \u0026#34;# test\u0026#34; \u0026gt;\u0026gt; README.md\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e [root@VM_81_18_centos test]# git add README.md\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e [root@VM_81_18_centos test]# \n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e引用子仓库。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e [root@VM_81_18_centos test]# git submodule add git@github.com:xianmin/hugo-theme-jane.git theme/jane\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Cloning into \u0026#39;theme/jane\u0026#39;...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e remote: Enumerating objects: 216, done.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e remote: Counting objects: 100% (216/216), done.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e remote: Compressing objects: 100% (128/128), done.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e remote: Total 6165 (delta 102), reused 159 (delta 65), pack-reused 5949\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Receiving objects: 100% (6165/6165), 3.05 MiB | 1.70 MiB/s, done.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e Resolving deltas: 100% (3443/3443), done.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e查看文件列表。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e [root@VM_81_18_centos test]# ll\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e total 8\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e -rw-r--r-- 1 root root    5 Sep  6 16:05 README.md\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e drwxr-xr-x 7 root root 4096 Sep  6 16:08 typecho\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e [root@VM_81_18_centos test]# \n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e查看状态。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[root@VM_81_18_centos test]# git status\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# On branch master\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e#\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# Initial commit\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e#\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e# Changes to be committed:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e#   (use \u0026#34;git rm --cached \u0026lt;file\u0026gt;...\u0026#34; to unstage)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e#\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e#\tnew file:   .gitmodules\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e#\tnew file:   README.md\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e#\tnew file:   typecho\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e#\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[root@VM_81_18_centos test]# \n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e查看修改。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[root@VM_81_18_centos test]# git diff --cached\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ediff --git a/.gitmodules b/.gitmodules\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003enew file mode 100644\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eindex 0000000..b1ddf70\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e--- /dev/null\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e+++ b/.gitmodules\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e@@ -0,0 +1,3 @@\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e+[submodule \u0026#34;typecho\u0026#34;]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e+       path = typecho\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e+       url = https://github.com/Liudon/typecho\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ediff --git a/README.md b/README.md\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003enew file mode 100644\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eindex 0000000..9daeafb\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e--- /dev/null\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e+++ b/README.md\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e@@ -0,0 +1 @@\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e+test\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ediff --git a/typecho b/typecho\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003enew file mode 160000\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eindex 0000000..b0c4cc7\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e--- /dev/null\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e+++ b/typecho\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e@@ -0,0 +1 @@\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e+Subproject commit b0c4cc77a7f8f04661fb9f75d4ba6d4d7915b0f1\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[root@VM_81_18_centos test]# \n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e注意最后一行\u003ccode\u003eSubproject commit b0c4cc77a7f8f04661fb9f75d4ba6d4d7915b0f1\u003c/code\u003e。\u003c/p\u003e\n\u003cp\u003e这个\u003ccode\u003ecommitId\u003c/code\u003e是子仓库最新提交的记录id，对应的\u003ca href=\"https://github.com/Liudon/typecho/commit/b0c4cc77a7f8f04661fb9f75d4ba6d4d7915b0f1\"\u003e修改记录\u003c/a\u003e。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e提交修改。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[root@VM_81_18_centos test]# git push -u origin master\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCounting objects: 4, done.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCompressing objects: 100% (3/3), done.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eWriting objects: 100% (4/4), 362 bytes | 0 bytes/s, done.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eTotal 4 (delta 0), reused 0 (delta 0)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eTo git@github.com:Liudon/test.git\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e* [new branch]      master -\u0026gt; master\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eBranch master set up to track remote branch master from origin.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[root@VM_81_18_centos test]# \n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cimg src=\"https://static.liudon.com/64412246-9050f100-d0c1-11e9-893a-f9b0766533ad.png\" alt=\"提交后Github显示\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/p\u003e\n\u003cp\u003e提交后，在github上子仓库后面会多显示一个\u003ccode\u003e@xxxxx\u003c/code\u003e，这里就是引用的\u003ccode\u003ecommitId\u003c/code\u003e，对应到前面\u003ccode\u003egit diff\u003c/code\u003e最后一行。\u003c/p\u003e\n\u003cp\u003e点击查看\u003ca href=\"https://github.com/Liudon/test/commit/5b11d515db8ad8d299ef1691f115590e0015c3b7\"\u003e提交记录\u003c/a\u003e。\u003c/p\u003e\n\u003cp\u003e\u003cimg src=\"https://static.liudon.com/64412419-e4f46c00-d0c1-11e9-8c2d-6fa1581529f3.png\" alt=\"提交记录\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/p\u003e\n\u003cp\u003e本次提交的\u003ccode\u003ecommitId\u003c/code\u003e为\u003ccode\u003e5b11d515db8ad8d299ef1691f115590e0015c3b7\u003c/code\u003e，子仓库typecho单独记录了引入时的\u003ccode\u003ecommitId\u003c/code\u003e，为\u003ccode\u003eb0c4cc77a7f8f04661fb9f75d4ba6d4d7915b0f1\u003c/code\u003e，对应的\u003ca href=\"https://github.com/Liudon/typecho/tree/b0c4cc77a7f8f04661fb9f75d4ba6d4d7915b0f1\"\u003e提交记录\u003c/a\u003e。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e接下来克隆子仓库，进行更新提交。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[root@VM_81_18_centos xx]# git clone git@github.com:Liudon/typecho.git\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCloning into \u0026#39;typecho\u0026#39;...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eremote: Enumerating objects: 1, done.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eremote: Counting objects: 100% (1/1), done.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eremote: Total 7179 (delta 0), reused 0 (delta 0), pack-reused 7178\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eReceiving objects: 100% (7179/7179), 7.26 MiB | 2.02 MiB/s, done.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eResolving deltas: 100% (4844/4844), done.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[root@VM_81_18_centos xx]# \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[root@VM_81_18_centos xx]# cd typecho/\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[root@VM_81_18_centos typecho]# git log -n 1\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecommit b0c4cc77a7f8f04661fb9f75d4ba6d4d7915b0f1\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eMerge: c904005 8fd7492\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAuthor: 祁宁 \u0026lt;magike.net@gmail.com\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eDate:   Tue Nov 18 13:59:52 2014 +0800\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Merge branch \u0026#39;master\u0026#39; of https://github.com/typecho/typecho\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[root@VM_81_18_centos typecho]#\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e通过\u003ccode\u003egit log\u003c/code\u003e，确认最新的提交commitId为\u003ccode\u003eb0c4cc77a7f8f04661fb9f75d4ba6d4d7915b0f1\u003c/code\u003e，与前面的引入的一致。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[root@VM_81_18_centos typecho]# echo \u0026#34;xxx\u0026#34; \u0026gt; test\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[root@VM_81_18_centos typecho]# \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[root@VM_81_18_centos typecho]# git add test\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[root@VM_81_18_centos typecho]# git commit -m \u0026#39;test\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[master 5dcc8f4] test\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e1 file changed, 1 insertion(+)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecreate mode 100644 test\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[root@VM_81_18_centos typecho]# git push\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCounting objects: 4, done.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCompressing objects: 100% (2/2), done.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eWriting objects: 100% (3/3), 252 bytes | 0 bytes/s, done.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eTotal 3 (delta 1), reused 0 (delta 0)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eremote: Resolving deltas: 100% (1/1), completed with 1 local object.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eTo git@github.com:Liudon/typecho.git\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eb0c4cc7..5dcc8f4  master -\u0026gt; master\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[root@VM_81_18_centos typecho]# \n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e修改文件提交。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[root@VM_81_18_centos typecho]# git log -n 1\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecommit 5dcc8f4e91cc724ba82aba5b9e7955727b58c5c2\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAuthor: liudon \u0026lt;i.mu@qq.com\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eDate:   Fri Sep 6 16:26:47 2019 +0800\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    test\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[root@VM_81_18_centos typecho]#\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e最新提交的\u003ccode\u003ecommitId\u003c/code\u003e为\u003ccode\u003e5dcc8f4e91cc724ba82aba5b9e7955727b58c5c2\u003c/code\u003e。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e重新克隆\u003ccode\u003etest\u003c/code\u003e库。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[root@VM_81_18_centos yy]# git clone git@github.com:Liudon/test.git\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCloning into \u0026#39;test\u0026#39;...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eremote: Enumerating objects: 4, done.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eremote: Counting objects: 100% (4/4), done.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eremote: Compressing objects: 100% (3/3), done.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eremote: Total 4 (delta 0), reused 4 (delta 0), pack-reused 0\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eReceiving objects: 100% (4/4), done.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[root@VM_81_18_centos yy]# cd test/\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[root@VM_81_18_centos test]# ll\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etotal 8\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e-rw-r--r-- 1 root root    5 Sep  6 16:31 README.md\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edrwxr-xr-x 2 root root 4096 Sep  6 16:31 typecho\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[root@VM_81_18_centos test]# ll typecho/\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etotal 0\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[root@VM_81_18_centos test]# \n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e这里可以看到\u003ccode\u003etypecho\u003c/code\u003e目录下是没有文件的。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[root@VM_81_18_centos test]# git submodule update --init --recursive\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSubmodule \u0026#39;typecho\u0026#39; (https://github.com/Liudon/typecho) registered for path \u0026#39;typecho\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCloning into \u0026#39;typecho\u0026#39;...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eremote: Enumerating objects: 4, done.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eremote: Counting objects: 100% (4/4), done.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eremote: Compressing objects: 100% (3/3), done.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eremote: Total 7182 (delta 0), reused 2 (delta 0), pack-reused 7178\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eReceiving objects: 100% (7182/7182), 7.26 MiB | 1.26 MiB/s, done.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eResolving deltas: 100% (4844/4844), done.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSubmodule path \u0026#39;typecho\u0026#39;: checked out \u0026#39;b0c4cc77a7f8f04661fb9f75d4ba6d4d7915b0f1\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[root@VM_81_18_centos test]#\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e更新子仓库代码，这里可以看到最终\u003ccode\u003echeckout\u003c/code\u003e的版本为\u003ccode\u003eb0c4cc77a7f8f04661fb9f75d4ba6d4d7915b0f1\u003c/code\u003e，与前面提交时的版本一致。\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch4 id=\"问题分析\"\u003e问题分析\u003c/h4\u003e\n\u003cp\u003e\u003ccode\u003egit submodule add\u003c/code\u003e的时候，会记录当时引入时子仓库的版本id。\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003egit submodule update --init --recursive\u003c/code\u003e，会检出引入时的仓库版本，这就是为啥代码没有更新了。\u003c/p\u003e\n\u003ch4 id=\"问题解决\"\u003e问题解决\u003c/h4\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[root@VM_81_18_centos yy]# git clone git@github.com:Liudon/test.git\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCloning into \u0026#39;test\u0026#39;...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eremote: Enumerating objects: 4, done.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eremote: Counting objects: 100% (4/4), done.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eremote: Compressing objects: 100% (3/3), done.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eremote: Total 4 (delta 0), reused 4 (delta 0), pack-reused 0\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eReceiving objects: 100% (4/4), done.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[root@VM_81_18_centos yy]# \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[root@VM_81_18_centos yy]# \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[root@VM_81_18_centos yy]# cd test/\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[root@VM_81_18_centos test]# ll\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etotal 8\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e-rw-r--r-- 1 root root    5 Sep  6 16:37 README.md\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003edrwxr-xr-x 2 root root 4096 Sep  6 16:37 typecho\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[root@VM_81_18_centos test]# ll typecho/\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etotal 0\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[root@VM_81_18_centos test]# \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[root@VM_81_18_centos test]# git submodule update --init --remote --recursive\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSubmodule \u0026#39;typecho\u0026#39; (https://github.com/Liudon/typecho) registered for path \u0026#39;typecho\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eCloning into \u0026#39;typecho\u0026#39;...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eremote: Enumerating objects: 4, done.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eremote: Counting objects: 100% (4/4), done.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eremote: Compressing objects: 100% (3/3), done.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eremote: Total 7182 (delta 0), reused 2 (delta 0), pack-reused 7178\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eReceiving objects: 100% (7182/7182), 7.26 MiB | 1.24 MiB/s, done.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eResolving deltas: 100% (4844/4844), done.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSubmodule path \u0026#39;typecho\u0026#39;: checked out \u0026#39;5dcc8f4e91cc724ba82aba5b9e7955727b58c5c2\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[root@VM_81_18_centos test]#\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e使用\u003ccode\u003egit submodule update --init --remote --recursive\u003c/code\u003e命令。\u003c/p\u003e\n","date_published":"2019-09-06T15:13:51+08:00","tags":["git"]},{"title":"一个Curl的耗时长的问题","id":"https://liudon.com/posts/curl-cost-time-long/","url":"https://liudon.com/posts/curl-cost-time-long/","summary":"\u003cp\u003e发现某个接口请求很慢，但是后端确认接口是很快的。\u003c/p\u003e\n\u003cp\u003e在机器上通过shell执行curl命令，确实很快，但是PHP代码里请求又确实很慢。\u003c/p\u003e\n\u003cp\u003e业务里用到了\u003ccode\u003eRequests\u003c/code\u003e这个库，一开始以为是这个库导致的问题。\u003c/p\u003e","content_html":"\u003cp\u003e发现某个接口请求很慢，但是后端确认接口是很快的。\u003c/p\u003e\n\u003cp\u003e在机器上通过shell执行curl命令，确实很快，但是PHP代码里请求又确实很慢。\u003c/p\u003e\n\u003cp\u003e业务里用到了\u003ccode\u003eRequests\u003c/code\u003e这个库，一开始以为是这个库导致的问题。\u003c/p\u003e\n\u003cp\u003e在\u003ccode\u003eRequests_Transport_cURL\u003c/code\u003e类里断点定位了下，确实很慢，\u003ccode\u003ecurl_getinfo\u003c/code\u003e返回的信息如下。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003earray\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s1\"\u003e\u0026#39;url\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;http://xxxxx\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s1\"\u003e\u0026#39;content_type\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;text/html\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s1\"\u003e\u0026#39;http_code\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"mi\"\u003e200\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s1\"\u003e\u0026#39;header_size\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"mi\"\u003e64\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s1\"\u003e\u0026#39;request_size\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"mi\"\u003e305\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s1\"\u003e\u0026#39;filetime\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s1\"\u003e\u0026#39;ssl_verify_result\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s1\"\u003e\u0026#39;redirect_count\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s1\"\u003e\u0026#39;total_time\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"mf\"\u003e2.074094\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s1\"\u003e\u0026#39;namelookup_time\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"mf\"\u003e2.5E-5\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s1\"\u003e\u0026#39;connect_time\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.032107\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s1\"\u003e\u0026#39;pretransfer_time\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"mf\"\u003e0.032109\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s1\"\u003e\u0026#39;size_upload\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"mi\"\u003e186\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s1\"\u003e\u0026#39;size_download\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"mi\"\u003e99\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s1\"\u003e\u0026#39;speed_download\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"mi\"\u003e47\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s1\"\u003e\u0026#39;speed_upload\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"mi\"\u003e89\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s1\"\u003e\u0026#39;download_content_length\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"mi\"\u003e99\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s1\"\u003e\u0026#39;upload_content_length\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"mi\"\u003e186\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s1\"\u003e\u0026#39;starttransfer_time\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"mf\"\u003e2.032866\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s1\"\u003e\u0026#39;redirect_time\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"s1\"\u003e\u0026#39;certinfo\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"n\"\u003earray\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e这里可以看到\u003ccode\u003estarttransfer_time\u003c/code\u003e时间很长。\u003c/p\u003e\n\u003cp\u003e搜索了一番，发现网上一个case，\u003ca href=\"https://stackoverflow.com/questions/20428632/curl-slow-starttransfer-time\"\u003ecURL slow starttransfer_time\u003c/a\u003e。\u003c/p\u003e\n\u003cp\u003e里面提供了\u003ccode\u003eExpect: 100-continue\u003c/code\u003e这个header，又搜索了一番这个header资料。\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003ecurl\u003c/code\u003e在发\u003ccode\u003ePOST\u003c/code\u003e请求的时候，如果body大于1k：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e先追加一个\u003ccode\u003eExpect: 100-continue\u003c/code\u003e请求头信息，发送这个不包含 \u003ccode\u003ePOST\u003c/code\u003e 数据的请求；\u003c/li\u003e\n\u003cli\u003e如果服务器返回的响应头信息中包含Expect: 100-continue，则表示 Server 愿意接受数据，这时才 POST 真正数据给 Server；\n如果等待1s，没有收到服务器肯定或否定的应答，那么继续发起POST请求，这种会导致请求耗时变长。\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e在机器上抓了个包，执行下面命令。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e注意，下面port后面的80改成实际的端口\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etcpdump -A -s 0 \u0026#39;tcp port 80 and (((ip[2:2] - ((ip[0]\u0026amp;0xf)\u0026lt;\u0026lt;2)) - ((tcp[12]\u0026amp;0xf0)\u0026gt;\u0026gt;2)) != 0)\u0026#39;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e拿到的包信息。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e09:17:19.421587 IP xxx.54360 \u0026gt; xxxxx:12345: Flags [P.], seq 767181008:767181314, ack 353986709, win 115, options [nop,nop,TS val 2628114858 ecr 1424896084], length 306\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eE..f.m@.@...d}@.        A...XF.-.@...h....s.......\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e....T.0TPOST /cgi HTTP/1.1\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eUser-Agent: php-requests/1.6\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAccept: */*\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eAccept-Encoding: deflate, gzip\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eReferer: http://xxxxx:12345/cgi\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eContent-Length: 188\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eExpect: 100-continue\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eContent-Type: multipart/form-data; boundary=----------------------------ee2f4d848646\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e09:17:21.421786 IP xxx.54360 \u0026gt; xxxxx:12345: Flags [P.], seq 306:494, ack 1, win 115, options [nop,nop,TS val 2628115359 ecr 1424896091], length 188\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eE....n@.@..Md}@.        A...XF.-.B...h....s./.....\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e....T.0[------------------------------ee2f4d848646\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eContent-Disposition: form-data; name=\u0026#34;req\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{\u0026#34;command\u0026#34;:\u0026#34;zzz\u0026#34;,\u0026#34;appId\u0026#34;:\u0026#34;yyyy\u0026#34;}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e------------------------------ee2f4d848646--\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e09:17:21.458628 IP xxxxx:12345 \u0026gt; xxx.54360: Flags [P.], seq 1:118, ack 494, win 130, options [nop,nop,TS val 1424896593 ecr 2628115359], length 117\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eE...X.@.5.Q2    A..d}@.F..X..h.-.B......3.....\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eT.2Q....HTTP/1.1 200 OK\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eContent-Type: text/html\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eContent-Length: 53\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u0026#34;data\u0026#34;: [],\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u0026#34;errno\u0026#34;: 0,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u0026#34;error\u0026#34;: \u0026#34;ok\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e可以看到确实是先发了一个\u003ccode\u003e100-continue\u003c/code\u003e的请求，然后再发的实际\u003ccode\u003ePOST\u003c/code\u003e请求。\u003c/p\u003e\n\u003cp\u003e在机器上执行下面的shell命令。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ecurl \u0026#39;http://xxxxx:12345/cgi\u0026#39; -H\u0026#34;Expect: 100-continue\u0026#34; -v\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e返回如下，可以看到返回的header头里确实没有\u003ccode\u003eExpect\u003c/code\u003e这项。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e* About to connect() to xxxxx port 12345 (#0)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e*   Trying xxxxx...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e* Connected to xxxxx (xxxxx) port 12345 (#0)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026gt; GET /cloud_cgi HTTP/1.1\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026gt; User-Agent: curl/7.29.0\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026gt; Host: xxxxx:12345\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026gt; Accept: */*\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026gt; Expect: 100-continue\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026gt; \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt; HTTP/1.1 200 OK\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt; Content-Type: text/html\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt; Content-Length: 42\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt; \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e* Connection #0 to host xxxxx left intact\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{\u0026#34;errno\u0026#34;:100,\u0026#34;error\u0026#34;:\u0026#34;参数格式错误\u0026#34;}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e解决方法：\u003c/p\u003e\n\u003cp\u003e请求的时候，header里新增一项。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eExpect:\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","date_published":"2019-09-04T11:07:46+08:00","tags":["php","curl"]},{"title":"Swoft 框架运行分析（三） —— BeanProcessor模块分析","id":"https://liudon.com/posts/swoft-bean-processor-analysis/","url":"https://liudon.com/posts/swoft-bean-processor-analysis/","summary":"\u003cp\u003e今天讲一下\u003ccode\u003eBeanProcessor\u003c/code\u003e模块，先看一下\u003ccode\u003ehandle\u003c/code\u003e方法实现。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003eHandle\u003c/span\u003e \u003cspan class=\"n\"\u003ebean\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"ne\"\u003ebool\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003ethrows\u003c/span\u003e \u003cspan class=\"n\"\u003eReflectionException\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003ethrows\u003c/span\u003e \u003cspan class=\"n\"\u003eAnnotationException\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003epublic\u003c/span\u003e \u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003ehandle\u003c/span\u003e\u003cspan class=\"p\"\u003e():\u003c/span\u003e \u003cspan class=\"ne\"\u003ebool\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e!$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eapplication\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ebeforeBean\u003c/span\u003e\u003cspan class=\"p\"\u003e())\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"bp\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ehandler\u003c/span\u003e     \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eBeanHandler\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003edefinitions\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003egetDefinitions\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eparsers\u003c/span\u003e     \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eAnnotationRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003egetParsers\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eannotations\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eAnnotationRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003egetAnnotations\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eBeanFactory\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eaddDefinitions\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003edefinitions\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eBeanFactory\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eaddAnnotations\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eannotations\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eBeanFactory\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eaddParsers\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eparsers\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eBeanFactory\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003esetHandler\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ehandler\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eBeanFactory\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003einit\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e/*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003eConfig\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003econfig\u003c/span\u003e\u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003econfig\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eBeanFactory\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003egetBean\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;config\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eCLog\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003einfo\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;config path=\u003c/span\u003e\u003cspan class=\"si\"\u003e%s\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003econfig\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003egetPath\u003c/span\u003e\u003cspan class=\"p\"\u003e());\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eCLog\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003einfo\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;config env=\u003c/span\u003e\u003cspan class=\"si\"\u003e%s\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003econfig\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003egetEnv\u003c/span\u003e\u003cspan class=\"p\"\u003e());\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003estats\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eBeanFactory\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003egetStats\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eCLog\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003einfo\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;Bean is initialized(\u003c/span\u003e\u003cspan class=\"si\"\u003e%s\u003c/span\u003e\u003cspan class=\"s1\"\u003e)\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoftHelper\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eformatStats\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003estats\u003c/span\u003e\u003cspan class=\"p\"\u003e));\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eapplication\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eafterBean\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e先通过\u003ccode\u003egetDefinitions\u003c/code\u003e方法获取所有的Bean定义。\u003c/p\u003e","content_html":"\u003cp\u003e今天讲一下\u003ccode\u003eBeanProcessor\u003c/code\u003e模块，先看一下\u003ccode\u003ehandle\u003c/code\u003e方法实现。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003eHandle\u003c/span\u003e \u003cspan class=\"n\"\u003ebean\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"ne\"\u003ebool\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003ethrows\u003c/span\u003e \u003cspan class=\"n\"\u003eReflectionException\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003ethrows\u003c/span\u003e \u003cspan class=\"n\"\u003eAnnotationException\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003epublic\u003c/span\u003e \u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003ehandle\u003c/span\u003e\u003cspan class=\"p\"\u003e():\u003c/span\u003e \u003cspan class=\"ne\"\u003ebool\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e!$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eapplication\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ebeforeBean\u003c/span\u003e\u003cspan class=\"p\"\u003e())\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"bp\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ehandler\u003c/span\u003e     \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eBeanHandler\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003edefinitions\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003egetDefinitions\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eparsers\u003c/span\u003e     \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eAnnotationRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003egetParsers\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eannotations\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eAnnotationRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003egetAnnotations\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eBeanFactory\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eaddDefinitions\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003edefinitions\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eBeanFactory\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eaddAnnotations\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eannotations\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eBeanFactory\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eaddParsers\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eparsers\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eBeanFactory\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003esetHandler\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ehandler\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eBeanFactory\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003einit\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e/*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003eConfig\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003econfig\u003c/span\u003e\u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003econfig\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eBeanFactory\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003egetBean\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;config\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eCLog\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003einfo\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;config path=\u003c/span\u003e\u003cspan class=\"si\"\u003e%s\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003econfig\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003egetPath\u003c/span\u003e\u003cspan class=\"p\"\u003e());\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eCLog\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003einfo\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;config env=\u003c/span\u003e\u003cspan class=\"si\"\u003e%s\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003econfig\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003egetEnv\u003c/span\u003e\u003cspan class=\"p\"\u003e());\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003estats\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eBeanFactory\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003egetStats\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eCLog\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003einfo\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;Bean is initialized(\u003c/span\u003e\u003cspan class=\"si\"\u003e%s\u003c/span\u003e\u003cspan class=\"s1\"\u003e)\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoftHelper\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eformatStats\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003estats\u003c/span\u003e\u003cspan class=\"p\"\u003e));\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eapplication\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eafterBean\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e先通过\u003ccode\u003egetDefinitions\u003c/code\u003e方法获取所有的Bean定义。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003eGet\u003c/span\u003e \u003cspan class=\"n\"\u003ebean\u003c/span\u003e \u003cspan class=\"n\"\u003edefinitions\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003earray\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eprivate\u003c/span\u003e \u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003egetDefinitions\u003c/span\u003e\u003cspan class=\"p\"\u003e():\u003c/span\u003e \u003cspan class=\"n\"\u003earray\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eCore\u003c/span\u003e \u003cspan class=\"n\"\u003ebeans\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003edefinitions\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eautoLoaders\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eAnnotationRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003egetAutoLoaders\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eget\u003c/span\u003e \u003cspan class=\"n\"\u003edisabled\u003c/span\u003e \u003cspan class=\"n\"\u003eloaders\u003c/span\u003e \u003cspan class=\"n\"\u003eby\u003c/span\u003e \u003cspan class=\"n\"\u003eapplication\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003edisabledLoaders\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eapplication\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003egetDisabledAutoLoaders\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eforeach\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eautoLoaders\u003c/span\u003e \u003cspan class=\"n\"\u003eas\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eautoLoader\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e!$\u003c/span\u003e\u003cspan class=\"n\"\u003eautoLoader\u003c/span\u003e \u003cspan class=\"n\"\u003einstanceof\u003c/span\u003e \u003cspan class=\"n\"\u003eDefinitionInterface\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003econtinue\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eloaderClass\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eget_class\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eautoLoader\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eIf\u003c/span\u003e \u003cspan class=\"n\"\u003ethe\u003c/span\u003e \u003cspan class=\"n\"\u003ecomponent\u003c/span\u003e \u003cspan class=\"n\"\u003eis\u003c/span\u003e \u003cspan class=\"n\"\u003edisabled\u003c/span\u003e \u003cspan class=\"n\"\u003eby\u003c/span\u003e \u003cspan class=\"n\"\u003euser\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eisset\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003edisabledLoaders\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eloaderClass\u003c/span\u003e\u003cspan class=\"p\"\u003e]))\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eCLog\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003einfo\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;Auto loader(\u003c/span\u003e\u003cspan class=\"si\"\u003e%s\u003c/span\u003e\u003cspan class=\"s1\"\u003e) is \u0026lt;cyan\u0026gt;disabled\u0026lt;/cyan\u0026gt;, skip handle it\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eloaderClass\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003econtinue\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eIf\u003c/span\u003e \u003cspan class=\"n\"\u003ethe\u003c/span\u003e \u003cspan class=\"n\"\u003ecomponent\u003c/span\u003e \u003cspan class=\"n\"\u003eis\u003c/span\u003e \u003cspan class=\"ow\"\u003enot\u003c/span\u003e \u003cspan class=\"n\"\u003eenabled\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eautoLoader\u003c/span\u003e \u003cspan class=\"n\"\u003einstanceof\u003c/span\u003e \u003cspan class=\"n\"\u003eComponentInterface\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"o\"\u003e!$\u003c/span\u003e\u003cspan class=\"n\"\u003eautoLoader\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eisEnable\u003c/span\u003e\u003cspan class=\"p\"\u003e())\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003econtinue\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003edefinitions\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eArrayHelper\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003emerge\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003edefinitions\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eautoLoader\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ebeans\u003c/span\u003e\u003cspan class=\"p\"\u003e());\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eBean\u003c/span\u003e \u003cspan class=\"n\"\u003edefinitions\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ebeanFile\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eapplication\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003egetBeanFile\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ebeanFile\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ealias\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ebeanFile\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"n\"\u003efile_exists\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ebeanFile\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003ethrow\u003c/span\u003e \u003cspan class=\"n\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eInvalidArgumentException\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003esprintf\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;The bean config file of \u003c/span\u003e\u003cspan class=\"si\"\u003e%s\u003c/span\u003e\u003cspan class=\"s1\"\u003e is not exist!\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ebeanFile\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ebeanDefinitions\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003erequire\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ebeanFile\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003edefinitions\u003c/span\u003e     \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eArrayHelper\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003emerge\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003edefinitions\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ebeanDefinitions\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003edefinitions\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e通过\u003ccode\u003eAnnotationRegister::getAutoLoaders()\u003c/code\u003e拿到所有的autoloader对象，排除掉非\u003ccode\u003eDefinitionInterface\u003c/code\u003e对象，通过\u003ccode\u003ebean()\u003c/code\u003e方法获取定义的Bean信息。\u003c/p\u003e\n\u003cp\u003e这里以\u003ccode\u003ehttp-server\\src\\AutoLoader.php\u003c/code\u003e为例。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"err\"\u003e?\u003c/span\u003e\u003cspan class=\"n\"\u003ephp\u003c/span\u003e \u003cspan class=\"n\"\u003edeclare\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003estrict_types\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003enamespace\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eHttp\u003c/span\u003e\\\u003cspan class=\"n\"\u003eServer\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003ebean\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003edirname\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eReflectionException\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eBean\u003c/span\u003e\\\u003cspan class=\"n\"\u003eException\u003c/span\u003e\\\u003cspan class=\"n\"\u003eContainerException\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eHelper\u003c/span\u003e\\\u003cspan class=\"n\"\u003eComposerJSON\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eHttp\u003c/span\u003e\\\u003cspan class=\"n\"\u003eMessage\u003c/span\u003e\\\u003cspan class=\"n\"\u003eContentType\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eHttp\u003c/span\u003e\\\u003cspan class=\"n\"\u003eMessage\u003c/span\u003e\\\u003cspan class=\"n\"\u003eResponse\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eHttp\u003c/span\u003e\\\u003cspan class=\"n\"\u003eServer\u003c/span\u003e\\\u003cspan class=\"n\"\u003eFormatter\u003c/span\u003e\\\u003cspan class=\"n\"\u003eHtmlResponseFormatter\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eHttp\u003c/span\u003e\\\u003cspan class=\"n\"\u003eServer\u003c/span\u003e\\\u003cspan class=\"n\"\u003eFormatter\u003c/span\u003e\\\u003cspan class=\"n\"\u003eJsonResponseFormatter\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eHttp\u003c/span\u003e\\\u003cspan class=\"n\"\u003eServer\u003c/span\u003e\\\u003cspan class=\"n\"\u003eFormatter\u003c/span\u003e\\\u003cspan class=\"n\"\u003eXmlResponseFormatter\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eHttp\u003c/span\u003e\\\u003cspan class=\"n\"\u003eServer\u003c/span\u003e\\\u003cspan class=\"n\"\u003eParser\u003c/span\u003e\\\u003cspan class=\"n\"\u003eJsonRequestParser\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eHttp\u003c/span\u003e\\\u003cspan class=\"n\"\u003eServer\u003c/span\u003e\\\u003cspan class=\"n\"\u003eParser\u003c/span\u003e\\\u003cspan class=\"n\"\u003eXmlRequestParser\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eHttp\u003c/span\u003e\\\u003cspan class=\"n\"\u003eServer\u003c/span\u003e\\\u003cspan class=\"n\"\u003eSwoole\u003c/span\u003e\\\u003cspan class=\"n\"\u003eRequestListener\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eServer\u003c/span\u003e\\\u003cspan class=\"n\"\u003eSwooleEvent\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eSwoftComponent\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003eClass\u003c/span\u003e \u003cspan class=\"n\"\u003eAutoLoader\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003esince\u003c/span\u003e \u003cspan class=\"mf\"\u003e2.0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"n\"\u003eAutoLoader\u003c/span\u003e \u003cspan class=\"k\"\u003eextends\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoftComponent\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003eMetadata\u003c/span\u003e \u003cspan class=\"n\"\u003einformation\u003c/span\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003ethe\u003c/span\u003e \u003cspan class=\"n\"\u003ecomponent\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003earray\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003esee\u003c/span\u003e \u003cspan class=\"n\"\u003eComponentInterface\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003egetMetadata\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003epublic\u003c/span\u003e \u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003emetadata\u003c/span\u003e\u003cspan class=\"p\"\u003e():\u003c/span\u003e \u003cspan class=\"n\"\u003earray\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ejsonFile\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003edirname\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003e__DIR__\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;/composer.json\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003eComposerJSON\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eopen\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ejsonFile\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003egetMetadata\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003eGet\u003c/span\u003e \u003cspan class=\"n\"\u003enamespace\u003c/span\u003e \u003cspan class=\"ow\"\u003eand\u003c/span\u003e \u003cspan class=\"n\"\u003edirs\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003earray\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003epublic\u003c/span\u003e \u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003egetPrefixDirs\u003c/span\u003e\u003cspan class=\"p\"\u003e():\u003c/span\u003e \u003cspan class=\"n\"\u003earray\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003e__NAMESPACE__\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003e__DIR__\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003earray\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003ethrows\u003c/span\u003e \u003cspan class=\"n\"\u003eReflectionException\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003ethrows\u003c/span\u003e \u003cspan class=\"n\"\u003eContainerException\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003epublic\u003c/span\u003e \u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003ebeans\u003c/span\u003e\u003cspan class=\"p\"\u003e():\u003c/span\u003e \u003cspan class=\"n\"\u003earray\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"s1\"\u003e\u0026#39;httpRequest\u0026#39;\u003c/span\u003e     \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"s1\"\u003e\u0026#39;parsers\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003eContentType\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eXML\u003c/span\u003e  \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003ebean\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eXmlRequestParser\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"k\"\u003eclass\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003eContentType\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eJSON\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003ebean\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eJsonRequestParser\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"k\"\u003eclass\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"s1\"\u003e\u0026#39;httpResponse\u0026#39;\u003c/span\u003e    \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"s1\"\u003e\u0026#39;format\u0026#39;\u003c/span\u003e     \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003eResponse\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eFORMAT_JSON\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"s1\"\u003e\u0026#39;formatters\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003eResponse\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eFORMAT_HTML\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003ebean\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eHtmlResponseFormatter\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"k\"\u003eclass\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003eResponse\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eFORMAT_JSON\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003ebean\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eJsonResponseFormatter\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"k\"\u003eclass\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003eResponse\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eFORMAT_XML\u003c/span\u003e  \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003ebean\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eXmlResponseFormatter\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"k\"\u003eclass\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"s1\"\u003e\u0026#39;acceptFormatter\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"s1\"\u003e\u0026#39;formats\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003eContentType\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eJSON\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003eResponse\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eFORMAT_JSON\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003eContentType\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eHTML\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003eResponse\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eFORMAT_HTML\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003eContentType\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eXML\u003c/span\u003e  \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003eResponse\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eFORMAT_XML\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"s1\"\u003e\u0026#39;httpServer\u0026#39;\u003c/span\u003e      \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"s1\"\u003e\u0026#39;on\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003eSwooleEvent\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eREQUEST\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003ebean\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eRequestListener\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"k\"\u003eclass\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"s1\"\u003e\u0026#39;httpRouter\u0026#39;\u003c/span\u003e      \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"s1\"\u003e\u0026#39;name\u0026#39;\u003c/span\u003e            \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;swoft-http-router\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003econfig\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"s1\"\u003e\u0026#39;ignoreLastSlash\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"bp\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"s1\"\u003e\u0026#39;tmpCacheNumber\u0026#39;\u003c/span\u003e  \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"mi\"\u003e500\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e可以看到，这里通过\u003ccode\u003ebeans()\u003c/code\u003e定义了\u003ccode\u003ehttpRequest\u003c/code\u003e、\u003ccode\u003ehttpResponse\u003c/code\u003e、\u003ccode\u003eacceptFormatter\u003c/code\u003e、\u003ccode\u003ehttpServer\u003c/code\u003e和\u003ccode\u003ehttpRouter\u003c/code\u003e四个Bean对象。\u003c/p\u003e\n\u003cp\u003e回到上面\u003ccode\u003egetDefinitions\u003c/code\u003e方法。\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e$definitions = ArrayHelper::merge($definitions, $autoLoader-\u0026gt;beans());\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e然后将Bean信息添加到\u003ccode\u003edefinitions\u003c/code\u003e对象上。\u003c/p\u003e\n\u003cp\u003e之后通过\u003ccode\u003e$beanFile = $this-\u0026gt;application-\u0026gt;getBeanFile();\u003c/code\u003e获取bean配置文件。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$beanDefinitions = require $beanFile;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$definitions     = ArrayHelper::merge($definitions, $beanDefinitions);\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e加载配置文件，然后将Bean信息添加到\u003ccode\u003edefinitions\u003c/code\u003e对象上。\u003c/p\u003e\n\u003cp\u003e可以看到Bean有两种定义方式：通过AutoLoader和配置文件，与\u003ca href=\"https://en.swoft.org/docs/2.x/zh-CN/bean/bean.html\"\u003eswoft官方文档\u003c/a\u003e里的说明一致。\u003c/p\u003e\n\u003cp\u003e回到\u003ccode\u003ehandle\u003c/code\u003e方法。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$parsers     = AnnotationRegister::getParsers();\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e$annotations = AnnotationRegister::getAnnotations();\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e还记得上一篇文章最后提到的\u003ccode\u003eAnnotationRegister\u003c/code\u003e类的\u003ccode\u003eannotations\u003c/code\u003e和\u003ccode\u003eparsers\u003c/code\u003e两个属性吗？这里通过\u003ccode\u003egetParsers\u003c/code\u003e和\u003ccode\u003egetAnnotations\u003c/code\u003e获取这两个属性。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eBeanFactory::addDefinitions($definitions);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eBeanFactory::addAnnotations($annotations);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eBeanFactory::addParsers($parsers);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eBeanFactory::setHandler($handler);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eBeanFactory::init();\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e向BeanFatory注册信息。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * Init\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    *\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @return void\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @throws AnnotationException\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @throws ReflectionException\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    */\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epublic static function init(): void\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Container::getInstance()-\u0026gt;init();\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e...\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * Add definitions\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    *\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @param array $definitions\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    *\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @return void\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    */\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epublic static function addDefinitions(array $definitions): void\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Container::getInstance()-\u0026gt;addDefinitions($definitions);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * Add annotations\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    *\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @param array $annotations\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    *\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @return void\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    */\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epublic static function addAnnotations(array $annotations): void\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Container::getInstance()-\u0026gt;addAnnotations($annotations);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * Add annotation parsers\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    *\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @param array $annotationParsers\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    *\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @return void\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    */\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epublic static function addParsers(array $annotationParsers): void\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Container::getInstance()-\u0026gt;addParsers($annotationParsers);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * Set bean handler\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    *\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @param HandlerInterface $handler\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    */\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epublic static function setHandler(HandlerInterface $handler): void\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Container::getInstance()-\u0026gt;setHandler($handler);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e这里可以看到所有的方法，最终都调用的是\u003ccode\u003eSwoft\\Bean\\Container\u003c/code\u003e类。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * Add definitions\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    *\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @param array $definitions\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    *\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @return void\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    */\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epublic function addDefinitions(array $definitions): void\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $this-\u0026gt;definitions = ArrayHelper::merge($this-\u0026gt;definitions, $definitions);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * Add annotations\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    *\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @param array $annotations\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    *\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @return void\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    */\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epublic function addAnnotations(array $annotations): void\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $this-\u0026gt;annotations = ArrayHelper::merge($this-\u0026gt;annotations, $annotations);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * Add annotation parsers\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    *\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @param array $annotationParsers\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    *\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @return void\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    */\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epublic function addParsers(array $annotationParsers): void\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $this-\u0026gt;parsers = ArrayHelper::merge($this-\u0026gt;parsers, $annotationParsers);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @param HandlerInterface $handler\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    */\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epublic function setHandler(HandlerInterface $handler): void\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $this-\u0026gt;handler = $handler;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e这四个方法就是注册属性，接下来是重头戏\u003ccode\u003einit\u003c/code\u003e方法。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * Init\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    *\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @throws AnnotationException\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @throws ReflectionException\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    */\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epublic function init(): void\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    // Parse annotations\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $this-\u0026gt;parseAnnotations();\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    // Parse definitions\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $this-\u0026gt;parseDefinitions();\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    // Init beans\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $this-\u0026gt;initializeBeans();\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e先看\u003ccode\u003eparseAnnotations\u003c/code\u003e方法，从代码注释上也可以看出大概，解析注解，接下来我们看下具体是如何实现的。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * Parse annotations\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    *\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @throws AnnotationException\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    */\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eprivate function parseAnnotations(): void\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $annotationParser = new AnnotationObjParser(\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        $this-\u0026gt;definitions, $this-\u0026gt;objectDefinitions, $this-\u0026gt;classNames, $this-\u0026gt;aliases\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    );\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $annotationData   = $annotationParser-\u0026gt;parseAnnotations($this-\u0026gt;annotations, $this-\u0026gt;parsers);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    [$this-\u0026gt;definitions, $this-\u0026gt;objectDefinitions, $this-\u0026gt;classNames, $this-\u0026gt;aliases] = $annotationData;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e声明了一个\u003ccode\u003eAnnotationObjParser\u003c/code\u003e对象，调用了\u003ccode\u003eparseAnnotations\u003c/code\u003e方法。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003eParse\u003c/span\u003e \u003cspan class=\"n\"\u003eannotations\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eparam\u003c/span\u003e \u003cspan class=\"n\"\u003earray\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eannotations\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eparam\u003c/span\u003e \u003cspan class=\"n\"\u003earray\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eparsers\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003earray\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003ethrows\u003c/span\u003e \u003cspan class=\"n\"\u003eAnnotationException\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003epublic\u003c/span\u003e \u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003eparseAnnotations\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003earray\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eannotations\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003earray\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eparsers\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e \u003cspan class=\"n\"\u003earray\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparsers\u003c/span\u003e     \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eparsers\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eannotations\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eannotations\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eforeach\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eannotations\u003c/span\u003e \u003cspan class=\"n\"\u003eas\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eloadNameSpace\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eclasses\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eforeach\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eclasses\u003c/span\u003e \u003cspan class=\"n\"\u003eas\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eclassName\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eclassOneAnnotations\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparseOneClassAnnotations\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eclassName\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eclassOneAnnotations\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003edefinitions\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eobjectDefinitions\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eclassNames\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ealiases\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e这里遍历所有的\u003ccode\u003eannotation\u003c/code\u003e类，循环调用\u003ccode\u003eparseOneClassAnnotations\u003c/code\u003e进行解析。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-zed\" data-lang=\"zed\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e    * Parse class all annotations\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e    *\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e    * @param string $className\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e    * @param array  $classOneAnnotations\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e    *\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e    * @throws AnnotationException\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e    */\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eprivate\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003efunction\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eparseOneClassAnnotations\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003estring\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eclassName\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003earray\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eclassOneAnnotations\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003evoid\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Check class annotation tag\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"n\"\u003eisset\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eclassOneAnnotations\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"err\"\u003e\u0026#39;\u003c/span\u003e\u003cspan class=\"n\"\u003eannotation\u003c/span\u003e\u003cspan class=\"err\"\u003e\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e]))\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003ethrow\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003enew\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eAnnotationException\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"n\"\u003esprintf\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"err\"\u003e\u0026#39;\u003c/span\u003e\u003cspan class=\"n\"\u003eProperty\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003emethod\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e%\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ewith\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e`@\u003c/span\u003e\u003cspan class=\"n\"\u003exxx\u003c/span\u003e\u003cspan class=\"err\"\u003e`\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003emust\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ebe\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003edefine\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eclass\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eannotation\u003c/span\u003e\u003cspan class=\"err\"\u003e\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eclassName\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Parse class annotations\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eclassAnnotations\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eclassOneAnnotations\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"err\"\u003e\u0026#39;\u003c/span\u003e\u003cspan class=\"n\"\u003eannotation\u003c/span\u003e\u003cspan class=\"err\"\u003e\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ereflectionClass\u003c/span\u003e\u003cspan class=\"w\"\u003e  \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eclassOneAnnotations\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"err\"\u003e\u0026#39;\u003c/span\u003e\u003cspan class=\"n\"\u003ereflection\u003c/span\u003e\u003cspan class=\"err\"\u003e\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eclassAry\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eclassName\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ereflectionClass\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eclassAnnotations\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eobjectDefinition\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparseClassAnnotations\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eclassAry\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Parse property annotations\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003epropertyInjects\u003c/span\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[];\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003epropertyAllAnnotations\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eclassOneAnnotations\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"err\"\u003e\u0026#39;\u003c/span\u003e\u003cspan class=\"n\"\u003eproperties\u003c/span\u003e\u003cspan class=\"err\"\u003e\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e??\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[];\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eforeach\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003epropertyAllAnnotations\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eas\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003epropertyName\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003epropertyOneAnnotations\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eproAnnotations\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003epropertyOneAnnotations\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"err\"\u003e\u0026#39;\u003c/span\u003e\u003cspan class=\"n\"\u003eannotation\u003c/span\u003e\u003cspan class=\"err\"\u003e\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e??\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[];\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003epropertyInject\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparsePropertyAnnotations\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eclassAry\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003epropertyName\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eproAnnotations\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003epropertyInject\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003epropertyInjects\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003epropertyName\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003epropertyInject\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Parse method annotations\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003emethodInjects\u003c/span\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[];\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003emethodAllAnnotations\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eclassOneAnnotations\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"err\"\u003e\u0026#39;\u003c/span\u003e\u003cspan class=\"n\"\u003emethods\u003c/span\u003e\u003cspan class=\"err\"\u003e\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e??\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[];\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eforeach\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003emethodAllAnnotations\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eas\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003emethodName\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003emethodOneAnnotations\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003emethodAnnotations\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003emethodOneAnnotations\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"err\"\u003e\u0026#39;\u003c/span\u003e\u003cspan class=\"n\"\u003eannotation\u003c/span\u003e\u003cspan class=\"err\"\u003e\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e??\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[];\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003emethodInject\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparseMethodAnnotations\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eclassAry\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003emethodName\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003emethodAnnotations\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003emethodInject\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003emethodInjects\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003emethodName\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003emethodInject\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eobjectDefinition\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003ereturn\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"n\"\u003eempty\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003epropertyInjects\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eobjectDefinition\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003esetPropertyInjections\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003epropertyInjects\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"n\"\u003eempty\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003emethodInjects\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eobjectDefinition\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003esetMethodInjections\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003emethodInjects\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Object definition and class name\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"w\"\u003e         \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eobjectDefinition\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003egetName\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ealiase\u003c/span\u003e\u003cspan class=\"w\"\u003e       \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eobjectDefinition\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003egetAlias\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eclassNames\u003c/span\u003e\u003cspan class=\"w\"\u003e   \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eclassNames\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eclassName\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e??\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[];\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eclassNames\u003c/span\u003e\u003cspan class=\"p\"\u003e[]\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eclassNames\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eclassName\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e   \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003earray_unique\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eclassNames\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eobjectDefinitions\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eobjectDefinition\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"n\"\u003eempty\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ealiase\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ealiases\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ealiase\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e这里可以看到分别有类注解、属性注解和方法注解三类。\u003c/p\u003e\n\u003cp\u003e对应官方文档的\u003ca href=\"https://en.swoft.org/docs/2.x/zh-CN/annotation/index.html#%E8%A7%84%E8%8C%83\"\u003e注解说明\u003c/a\u003e。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @param array $classAry\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    *\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @return ObjectDefinition|null\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    */\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eprivate function parseClassAnnotations(array $classAry): ?ObjectDefinition\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    [, , $classAnnotations] = $classAry;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $objectDefinition = null;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    foreach ($classAnnotations as $annotation) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        $annotationClass = get_class($annotation);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        if (!isset($this-\u0026gt;parsers[$annotationClass])) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            continue;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        $parserClassName  = $this-\u0026gt;parsers[$annotationClass];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        $annotationParser = $this-\u0026gt;getAnnotationParser($classAry, $parserClassName);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        $data = $annotationParser-\u0026gt;parse(Parser::TYPE_CLASS, $annotation);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        if (empty($data)) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            continue;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        if (count($data) !== 4) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            throw new InvalidArgumentException(sprintf(\u0026#39;%s annotation parse must be 4 size\u0026#39;, $annotationClass));\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        [$name, $className, $scope, $alias] = $data;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        $name = empty($name) ? $className : $name;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        if (empty($className)) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            throw new InvalidArgumentException(sprintf(\u0026#39;%s with class name can not be empty\u0026#39;, $annotationClass));\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        // Multiple coverage\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        $objectDefinition = new ObjectDefinition($name, $className, $scope, $alias);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    return $objectDefinition;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e类注解，这里会调用对应解析类的\u003ccode\u003eparse\u003c/code\u003e方法。\u003c/p\u003e\n\u003cp\u003e这里以\u003ccode\u003ewebsocket-server\\src\\Annotation\\Mapping\\WsModule.php\u003c/code\u003e和\u003ccode\u003ewebsocket-server\\src\\Annotation\\Parser\\WsModuleParser.php\u003c/code\u003e为例。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"err\"\u003e?\u003c/span\u003e\u003cspan class=\"n\"\u003ephp\u003c/span\u003e \u003cspan class=\"n\"\u003edeclare\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003estrict_types\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003enamespace\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eWebSocket\u003c/span\u003e\\\u003cspan class=\"n\"\u003eServer\u003c/span\u003e\\\u003cspan class=\"n\"\u003eAnnotation\u003c/span\u003e\\\u003cspan class=\"n\"\u003eMapping\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eDoctrine\u003c/span\u003e\\\u003cspan class=\"n\"\u003eCommon\u003c/span\u003e\\\u003cspan class=\"n\"\u003eAnnotations\u003c/span\u003e\\\u003cspan class=\"n\"\u003eAnnotation\u003c/span\u003e\\\u003cspan class=\"n\"\u003eAttribute\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eDoctrine\u003c/span\u003e\\\u003cspan class=\"n\"\u003eCommon\u003c/span\u003e\\\u003cspan class=\"n\"\u003eAnnotations\u003c/span\u003e\\\u003cspan class=\"n\"\u003eAnnotation\u003c/span\u003e\\\u003cspan class=\"n\"\u003eAttributes\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eDoctrine\u003c/span\u003e\\\u003cspan class=\"n\"\u003eCommon\u003c/span\u003e\\\u003cspan class=\"n\"\u003eAnnotations\u003c/span\u003e\\\u003cspan class=\"n\"\u003eAnnotation\u003c/span\u003e\\\u003cspan class=\"n\"\u003eRequired\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eDoctrine\u003c/span\u003e\\\u003cspan class=\"n\"\u003eCommon\u003c/span\u003e\\\u003cspan class=\"n\"\u003eAnnotations\u003c/span\u003e\\\u003cspan class=\"n\"\u003eAnnotation\u003c/span\u003e\\\u003cspan class=\"n\"\u003eTarget\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eWebSocket\u003c/span\u003e\\\u003cspan class=\"n\"\u003eServer\u003c/span\u003e\\\u003cspan class=\"n\"\u003eMessageParser\u003c/span\u003e\\\u003cspan class=\"n\"\u003eRawTextParser\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003eClass\u003c/span\u003e \u003cspan class=\"n\"\u003eWebSocket\u003c/span\u003e \u003cspan class=\"o\"\u003e-\u003c/span\u003e \u003cspan class=\"n\"\u003emark\u003c/span\u003e \u003cspan class=\"n\"\u003ean\u003c/span\u003e \u003cspan class=\"n\"\u003ewebsocket\u003c/span\u003e \u003cspan class=\"n\"\u003emodule\u003c/span\u003e \u003cspan class=\"n\"\u003ehandler\u003c/span\u003e \u003cspan class=\"k\"\u003eclass\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003esince\u003c/span\u003e \u003cspan class=\"mf\"\u003e2.0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eAnnotation\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eTarget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;CLASS\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eAttributes\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e     \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eAttribute\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;name\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;string\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e     \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eAttribute\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;path\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;string\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e     \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eAttribute\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;controllers\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;array\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e     \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eAttribute\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;messageParser\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;string\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003efinal\u003c/span\u003e \u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"n\"\u003eWsModule\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003eWebsocket\u003c/span\u003e \u003cspan class=\"n\"\u003eroute\u003c/span\u003e \u003cspan class=\"n\"\u003epath\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eit\u003c/span\u003e \u003cspan class=\"n\"\u003emust\u003c/span\u003e \u003cspan class=\"n\"\u003eunique\u003c/span\u003e \u003cspan class=\"ow\"\u003ein\u003c/span\u003e \u003cspan class=\"n\"\u003ea\u003c/span\u003e \u003cspan class=\"n\"\u003eapplication\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003estring\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eRequired\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eprivate\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003epath\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;/\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003eModule\u003c/span\u003e \u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003estring\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eprivate\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ename\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003eRouting\u003c/span\u003e \u003cspan class=\"n\"\u003epath\u003c/span\u003e \u003cspan class=\"n\"\u003eparams\u003c/span\u003e \u003cspan class=\"n\"\u003ebinding\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e \u003cspan class=\"n\"\u003eeg\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;id\u0026#34;\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;\\d+\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003earray\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eprivate\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eparams\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003eMessage\u003c/span\u003e \u003cspan class=\"n\"\u003econtrollers\u003c/span\u003e \u003cspan class=\"n\"\u003eof\u003c/span\u003e \u003cspan class=\"n\"\u003ethe\u003c/span\u003e \u003cspan class=\"n\"\u003emodule\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e[]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eprivate\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003econtrollers\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003eMessage\u003c/span\u003e \u003cspan class=\"n\"\u003eparser\u003c/span\u003e \u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003ethe\u003c/span\u003e \u003cspan class=\"n\"\u003emodule\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003estring\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eprivate\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003emessageParser\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eRawTextParser\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"k\"\u003eclass\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003eDefault\u003c/span\u003e \u003cspan class=\"n\"\u003emessage\u003c/span\u003e \u003cspan class=\"n\"\u003ecommand\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e \u003cspan class=\"n\"\u003eFormat\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;controller.action\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003estring\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eprivate\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003edefaultCommand\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;home.index\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003eDefault\u003c/span\u003e \u003cspan class=\"n\"\u003emessage\u003c/span\u003e \u003cspan class=\"n\"\u003eopcode\u003c/span\u003e \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"n\"\u003eresponse\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e \u003cspan class=\"n\"\u003eplease\u003c/span\u003e \u003cspan class=\"n\"\u003esee\u003c/span\u003e \u003cspan class=\"n\"\u003eWEBSOCKET_OPCODE_\u003c/span\u003e\u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003evar\u003c/span\u003e \u003cspan class=\"ne\"\u003eint\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eprivate\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003edefaultOpcode\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003eClass\u003c/span\u003e \u003cspan class=\"n\"\u003econstructor\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eparam\u003c/span\u003e \u003cspan class=\"n\"\u003earray\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003evalues\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003epublic\u003c/span\u003e \u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003e__construct\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003earray\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003evalues\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eisset\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003evalues\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;value\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e]))\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003epath\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003evalues\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;value\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"n\"\u003eelseif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eisset\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003evalues\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;path\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e]))\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003epath\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003evalues\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;path\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eisset\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003evalues\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;name\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e]))\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ename\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003evalues\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;name\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eisset\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003evalues\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;params\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e]))\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparams\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003earray\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003evalues\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;params\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eisset\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003evalues\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;controllers\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e]))\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003econtrollers\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003earray\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003evalues\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;controllers\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eisset\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003evalues\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;messageParser\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e]))\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003emessageParser\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003evalues\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;messageParser\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eisset\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003evalues\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;defaultOpcode\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e]))\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003edefaultOpcode\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"ne\"\u003eint\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003evalues\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;defaultOpcode\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eisset\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003evalues\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;defaultCommand\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e]))\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003edefaultCommand\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003evalues\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;defaultCommand\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003estring\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003epublic\u003c/span\u003e \u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003egetPath\u003c/span\u003e\u003cspan class=\"p\"\u003e():\u003c/span\u003e \u003cspan class=\"n\"\u003estring\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003epath\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003estring\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003epublic\u003c/span\u003e \u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003egetMessageParser\u003c/span\u003e\u003cspan class=\"p\"\u003e():\u003c/span\u003e \u003cspan class=\"n\"\u003estring\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003emessageParser\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003estring\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003epublic\u003c/span\u003e \u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003egetDefaultCommand\u003c/span\u003e\u003cspan class=\"p\"\u003e():\u003c/span\u003e \u003cspan class=\"n\"\u003estring\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003edefaultCommand\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003estring\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003epublic\u003c/span\u003e \u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003egetName\u003c/span\u003e\u003cspan class=\"p\"\u003e():\u003c/span\u003e \u003cspan class=\"n\"\u003estring\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ename\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e[]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003epublic\u003c/span\u003e \u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003egetControllers\u003c/span\u003e\u003cspan class=\"p\"\u003e():\u003c/span\u003e \u003cspan class=\"n\"\u003earray\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003econtrollers\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003earray\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003epublic\u003c/span\u003e \u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003egetParams\u003c/span\u003e\u003cspan class=\"p\"\u003e():\u003c/span\u003e \u003cspan class=\"n\"\u003earray\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparams\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"ne\"\u003eint\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003epublic\u003c/span\u003e \u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003egetDefaultOpcode\u003c/span\u003e\u003cspan class=\"p\"\u003e():\u003c/span\u003e \u003cspan class=\"ne\"\u003eint\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003edefaultOpcode\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003ccode\u003eWsModule\u003c/code\u003e声明了一个类注解。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"err\"\u003e?\u003c/span\u003e\u003cspan class=\"n\"\u003ephp\u003c/span\u003e \u003cspan class=\"n\"\u003edeclare\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003estrict_types\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003enamespace\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eWebSocket\u003c/span\u003e\\\u003cspan class=\"n\"\u003eServer\u003c/span\u003e\\\u003cspan class=\"n\"\u003eAnnotation\u003c/span\u003e\\\u003cspan class=\"n\"\u003eParser\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eAnnotation\u003c/span\u003e\\\u003cspan class=\"n\"\u003eAnnotation\u003c/span\u003e\\\u003cspan class=\"n\"\u003eMapping\u003c/span\u003e\\\u003cspan class=\"n\"\u003eAnnotationParser\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eAnnotation\u003c/span\u003e\\\u003cspan class=\"n\"\u003eAnnotation\u003c/span\u003e\\\u003cspan class=\"n\"\u003eParser\u003c/span\u003e\\\u003cspan class=\"n\"\u003eParser\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eAnnotation\u003c/span\u003e\\\u003cspan class=\"n\"\u003eException\u003c/span\u003e\\\u003cspan class=\"n\"\u003eAnnotationException\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eBean\u003c/span\u003e\\\u003cspan class=\"n\"\u003eAnnotation\u003c/span\u003e\\\u003cspan class=\"n\"\u003eMapping\u003c/span\u003e\\\u003cspan class=\"n\"\u003eBean\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eStdlib\u003c/span\u003e\\\u003cspan class=\"n\"\u003eHelper\u003c/span\u003e\\\u003cspan class=\"n\"\u003eStr\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eWebSocket\u003c/span\u003e\\\u003cspan class=\"n\"\u003eServer\u003c/span\u003e\\\u003cspan class=\"n\"\u003eAnnotation\u003c/span\u003e\\\u003cspan class=\"n\"\u003eMapping\u003c/span\u003e\\\u003cspan class=\"n\"\u003eWsModule\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eWebSocket\u003c/span\u003e\\\u003cspan class=\"n\"\u003eServer\u003c/span\u003e\\\u003cspan class=\"n\"\u003eMessageParser\u003c/span\u003e\\\u003cspan class=\"n\"\u003eRawTextParser\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eWebSocket\u003c/span\u003e\\\u003cspan class=\"n\"\u003eServer\u003c/span\u003e\\\u003cspan class=\"n\"\u003eRouter\u003c/span\u003e\\\u003cspan class=\"n\"\u003eRouteRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003eClass\u003c/span\u003e \u003cspan class=\"n\"\u003eWebSocketParser\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003esince\u003c/span\u003e \u003cspan class=\"mf\"\u003e2.0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eAnnotationParser\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eWsModule\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"k\"\u003eclass\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"n\"\u003eWsModuleParser\u003c/span\u003e \u003cspan class=\"k\"\u003eextends\u003c/span\u003e \u003cspan class=\"n\"\u003eParser\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003eParse\u003c/span\u003e \u003cspan class=\"n\"\u003eobject\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eparam\u003c/span\u003e \u003cspan class=\"ne\"\u003eint\u003c/span\u003e      \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003etype\u003c/span\u003e \u003cspan class=\"n\"\u003eClass\u003c/span\u003e \u003cspan class=\"ow\"\u003eor\u003c/span\u003e \u003cspan class=\"n\"\u003eMethod\u003c/span\u003e \u003cspan class=\"ow\"\u003eor\u003c/span\u003e \u003cspan class=\"n\"\u003eProperty\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eparam\u003c/span\u003e \u003cspan class=\"n\"\u003eWsModule\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eann\u003c/span\u003e  \u003cspan class=\"n\"\u003eAnnotation\u003c/span\u003e \u003cspan class=\"n\"\u003eobject\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003earray\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003eReturn\u003c/span\u003e \u003cspan class=\"n\"\u003eempty\u003c/span\u003e \u003cspan class=\"n\"\u003earray\u003c/span\u003e \u003cspan class=\"n\"\u003eis\u003c/span\u003e \u003cspan class=\"n\"\u003enothing\u003c/span\u003e \u003cspan class=\"n\"\u003eto\u003c/span\u003e \u003cspan class=\"k\"\u003edo\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003eWhen\u003c/span\u003e \u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"n\"\u003etype\u003c/span\u003e \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ebeanName\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eclassName\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003escope\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ealias\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003esize\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"n\"\u003eis\u003c/span\u003e \u003cspan class=\"n\"\u003eto\u003c/span\u003e \u003cspan class=\"n\"\u003einject\u003c/span\u003e \u003cspan class=\"n\"\u003ebean\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003eWhen\u003c/span\u003e \u003cspan class=\"n\"\u003eproperty\u003c/span\u003e \u003cspan class=\"n\"\u003etype\u003c/span\u003e \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003epropertyValue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eisRef\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"n\"\u003eis\u003c/span\u003e \u003cspan class=\"n\"\u003eto\u003c/span\u003e \u003cspan class=\"n\"\u003ereference\u003c/span\u003e \u003cspan class=\"n\"\u003evalue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003ethrows\u003c/span\u003e \u003cspan class=\"n\"\u003eAnnotationException\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003epublic\u003c/span\u003e \u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003eparse\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"ne\"\u003eint\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003etype\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eann\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e \u003cspan class=\"n\"\u003earray\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003etype\u003c/span\u003e \u003cspan class=\"o\"\u003e!==\u003c/span\u003e \u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eTYPE_CLASS\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003ethrow\u003c/span\u003e \u003cspan class=\"n\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eAnnotationException\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;`@WsModule` must be defined on class!\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eclassName\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eRouteRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003ebindModule\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"k\"\u003eclass\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"s1\"\u003e\u0026#39;path\u0026#39;\u003c/span\u003e           \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eann\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003egetPath\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"err\"\u003e?\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eStr\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003egetClassName\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"k\"\u003eclass\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;Module\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"s1\"\u003e\u0026#39;name\u0026#39;\u003c/span\u003e           \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eann\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003egetName\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"s1\"\u003e\u0026#39;params\u0026#39;\u003c/span\u003e         \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eann\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003egetParams\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"s1\"\u003e\u0026#39;class\u0026#39;\u003c/span\u003e          \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"k\"\u003eclass\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"s1\"\u003e\u0026#39;eventMethods\u0026#39;\u003c/span\u003e   \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"p\"\u003e[],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"s1\"\u003e\u0026#39;controllers\u0026#39;\u003c/span\u003e    \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eann\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003egetControllers\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"s1\"\u003e\u0026#39;messageParser\u0026#39;\u003c/span\u003e  \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eann\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003egetMessageParser\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"err\"\u003e?\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eRawTextParser\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"k\"\u003eclass\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"s1\"\u003e\u0026#39;defaultOpcode\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eann\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003egetDefaultOpcode\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"s1\"\u003e\u0026#39;defaultCommand\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eann\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003egetDefaultCommand\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e]);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"k\"\u003eclass\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"k\"\u003eclass\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eBean\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eSINGLETON\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e按上一篇文章说明，这里\u003ccode\u003eWsModuleParser\u003c/code\u003e会被标记为注解类\u003ccode\u003eWsModule\u003c/code\u003e的注解解析类。\u003c/p\u003e\n\u003cp\u003e解析注解的时候，会调用\u003ccode\u003eWsModuleParser\u003c/code\u003e的\u003ccode\u003eparse\u003c/code\u003e方法，这里通过\u003ccode\u003eRouteRegister::bindModule\u003c/code\u003e做了一些路由操作，这里后续再讲，这里不做深入介绍。\u003c/p\u003e\n\u003cp\u003e属性和方法注解，也是类似的，\u003ccode\u003eparseAnnotations\u003c/code\u003e方法就讲完了。\u003c/p\u003e\n\u003cp\u003e回到\u003ccode\u003eContainer\u003c/code\u003e类的\u003ccode\u003einit\u003c/code\u003e方法，接下来调用了\u003ccode\u003eparseDefinitions\u003c/code\u003e方法。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * Parse definitions\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    */\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eprivate function parseDefinitions(): void\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $annotationParser = new DefinitionObjParser(\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        $this-\u0026gt;definitions, $this-\u0026gt;objectDefinitions, $this-\u0026gt;classNames, $this-\u0026gt;aliases\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    );\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    // Collect info\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $definitionData = $annotationParser-\u0026gt;parseDefinitions();\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    [$this-\u0026gt;definitions, $this-\u0026gt;objectDefinitions, $this-\u0026gt;classNames, $this-\u0026gt;aliases] = $definitionData;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e声明了一个\u003ccode\u003eDefinitionObjParser\u003c/code\u003e对象，调用了\u003ccode\u003eparseDefinitions\u003c/code\u003e方法。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * Parse definitions\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    *\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @return array\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    */\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epublic function parseDefinitions(): array\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    foreach ($this-\u0026gt;definitions as $beanName =\u0026gt; $definition) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        if (isset($this-\u0026gt;objectDefinitions[$beanName])) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            $objectDefinition = $this-\u0026gt;objectDefinitions[$beanName];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            $this-\u0026gt;resetObjectDefinition($beanName, $objectDefinition, $definition);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            continue;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        $this-\u0026gt;createObjectDefinition($beanName, $definition);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    return [$this-\u0026gt;definitions, $this-\u0026gt;objectDefinitions, $this-\u0026gt;classNames, $this-\u0026gt;aliases];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e遍历所有的\u003ccode\u003eBean\u003c/code\u003e对象，调用\u003ccode\u003ecreateObjectDefinition\u003c/code\u003e方法。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-zed\" data-lang=\"zed\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e    * Create object definition for definition\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e    *\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e    * @param string $beanName\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e    * @param array  $definition\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e    */\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eprivate\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003efunction\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ecreateObjectDefinition\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003estring\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ebeanName\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003earray\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"kt\"\u003edefinition\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003evoid\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eclassName\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"kt\"\u003edefinition\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"err\"\u003e\u0026#39;\u003c/span\u003e\u003cspan class=\"n\"\u003eclass\u003c/span\u003e\u003cspan class=\"err\"\u003e\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e??\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eempty\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eclassName\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003ethrow\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003enew\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eInvalidArgumentException\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esprintf\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"err\"\u003e\u0026#39;\u003c/span\u003e\u003cspan class=\"o\"\u003e%\u003c/span\u003e\u003cspan class=\"n\"\u003es\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ekey\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003efor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003edefinition\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003emust\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003ebe\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003edefined\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eclass\u003c/span\u003e\u003cspan class=\"err\"\u003e\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ebeanName\u003c/span\u003e\u003cspan class=\"p\"\u003e));\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eobjDefinition\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003enew\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eObjectDefinition\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ebeanName\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eclassName\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eobjDefinition\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eupdateObjectDefinitionByDefinition\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eobjDefinition\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"kt\"\u003edefinition\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eclassNames\u003c/span\u003e\u003cspan class=\"w\"\u003e   \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eclassNames\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eclassName\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e??\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[];\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eclassNames\u003c/span\u003e\u003cspan class=\"p\"\u003e[]\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ebeanName\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eclassNames\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eclassName\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e       \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003earray_unique\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eclassNames\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eobjectDefinitions\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ebeanName\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eobjDefinition\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e声明了\u003ccode\u003eObjectDefinition\u003c/code\u003e对象，调用了\u003ccode\u003eupdateObjectDefinitionByDefinition\u003c/code\u003e方法。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-zed\" data-lang=\"zed\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e    * Update definition\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e    *\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e    * @param ObjectDefinition $objDfn\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e    * @param array            $definition\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e    *\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e    * @return ObjectDefinition\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e    */\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eprivate\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003efunction\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eupdateObjectDefinitionByDefinition\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eObjectDefinition\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eobjDfn\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003earray\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"kt\"\u003edefinition\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eObjectDefinition\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003econstructInject\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003epropertyInjects\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eoption\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparseDefinition\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"kt\"\u003edefinition\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Set construct inject\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"n\"\u003eempty\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003econstructInject\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eobjDfn\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003esetConstructorInjection\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003econstructInject\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Set property inject\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eforeach\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003epropertyInjects\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eas\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003epropertyName\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003epropertyInject\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eobjDfn\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003esetPropertyInjection\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003epropertyName\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003epropertyInject\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003escopes\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003eBean\u003c/span\u003e\u003cspan class=\"o\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eSINGLETON\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003eBean\u003c/span\u003e\u003cspan class=\"o\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003ePROTOTYPE\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003eBean\u003c/span\u003e\u003cspan class=\"o\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eREQUEST\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003escope\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eoption\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"err\"\u003e\u0026#39;\u003c/span\u003e\u003cspan class=\"n\"\u003escope\u003c/span\u003e\u003cspan class=\"err\"\u003e\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e??\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ealias\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eoption\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"err\"\u003e\u0026#39;\u003c/span\u003e\u003cspan class=\"n\"\u003ealias\u003c/span\u003e\u003cspan class=\"err\"\u003e\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e??\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"n\"\u003eempty\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003escope\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"n\"\u003ein_array\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003escope\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003escopes\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003ethrow\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003enew\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eInvalidArgumentException\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"err\"\u003e\u0026#39;\u003c/span\u003e\u003cspan class=\"n\"\u003eScope\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003efor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003edefinition\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eis\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003enot\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eundefined\u003c/span\u003e\u003cspan class=\"err\"\u003e\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Update scope\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"n\"\u003eempty\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003escope\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eobjDfn\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003esetScope\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003escope\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"c1\"\u003e// Update alias\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"n\"\u003eempty\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ealias\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eobjDfn\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003esetAlias\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ealias\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eobjAlias\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eobjDfn\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003egetAlias\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003eunset\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ealiases\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eobjAlias\u003c/span\u003e\u003cspan class=\"p\"\u003e]);\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ealiases\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ealias\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eobjDfn\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003egetName\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"n\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eobjDfn\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e这里调用了\u003ccode\u003eparseDefinition\u003c/code\u003e方法进行解析。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-mysql\" data-lang=\"mysql\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e    * Parse definition\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e    *\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e    * @param array $definition\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e    *\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e    * @return array\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cm\"\u003e    */\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eprivate\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003efunction\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eparseDefinition\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003earray\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003edefinition\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003earray\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"o\"\u003e//\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eRemove\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eclass\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003ekey\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nf\"\u003eunset\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003edefinition\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;class\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e]);\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"o\"\u003e//\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eParse\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003econstruct\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003econstructArgs\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003edefinition\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e??\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[];\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"nf\"\u003eis_array\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003econstructArgs\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003ethrow\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003enew\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eInvalidArgumentException\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;Construct args for definition must be array\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"err\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"o\"\u003e//\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eParse\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003econstruct\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eargs\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eargInjects\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[];\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nf\"\u003eforeach\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003econstructArgs\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eas\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003earg\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eargValue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eargIsRef\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"nf\"\u003egetValueByRef\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003earg\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eargInjects\u003c/span\u003e\u003cspan class=\"p\"\u003e[]\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003enew\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eArgsInjection\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eargValue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eargIsRef\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"err\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"o\"\u003e//\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"kt\"\u003eSet\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003econstruct\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003einject\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003econstructInject\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"no\"\u003enull\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"nf\"\u003eempty\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eargInjects\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003econstructInject\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003enew\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eMethodInjection\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;__construct\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eargInjects\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"err\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"o\"\u003e//\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eRemove\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003econstruct\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003edefinition\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nf\"\u003eunset\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003edefinition\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e]);\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"o\"\u003e//\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eParse\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003edefinition\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eoption\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"k\"\u003eoption\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003edefinition\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;__option\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e??\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[];\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"nf\"\u003eis_array\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"k\"\u003eoption\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"n\"\u003ethrow\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003enew\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eInvalidArgumentException\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;__option for definition must be array\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"err\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"o\"\u003e//\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eRemove\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e`\u003c/span\u003e\u003cspan class=\"n\"\u003e__option\u003c/span\u003e\u003cspan class=\"o\"\u003e`\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nf\"\u003eunset\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003edefinition\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;__option\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e]);\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"o\"\u003e//\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eParse\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003edefinition\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eproperties\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003epropertyInjects\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[];\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nf\"\u003eforeach\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003edefinition\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003eas\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003epropertyName\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003epropertyValue\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"nf\"\u003eis_string\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003epropertyName\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"n\"\u003ethrow\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003enew\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003eInvalidArgumentException\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;Property key from definition must be string\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"err\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eproValue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eproIsRef\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"nf\"\u003egetValueByRef\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003epropertyValue\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"o\"\u003e//\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eParse\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003eproperty\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"k\"\u003efor\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003earray\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"k\"\u003eif\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nf\"\u003eis_array\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eproValue\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e{\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e            \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eproValue\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"nf\"\u003eparseArrayProperty\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eproValue\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"err\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003epropertyInject\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"n\"\u003enew\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nf\"\u003ePropertyInjection\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003epropertyName\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eproValue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eproIsRef\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e        \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003epropertyInjects\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003epropertyName\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003epropertyInject\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"err\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003econstructInject\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003epropertyInjects\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"err\"\u003e$\u003c/span\u003e\u003cspan class=\"k\"\u003eoption\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"err\"\u003e}\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e解析\u003ccode\u003e__construct\u003c/code\u003e方法和传参，解析属性信息。\u003c/p\u003e\n\u003cp\u003e回到\u003ccode\u003eupdateObjectDefinitionByDefinition\u003c/code\u003e方法，将\u003ccode\u003e__construct\u003c/code\u003e和类属性信息注册到\u003ccode\u003eObjectDefinition\u003c/code\u003e对象上，到这里\u003ccode\u003eparseDefinitions\u003c/code\u003e方法执行完毕。\u003c/p\u003e\n\u003cp\u003e回到\u003ccode\u003eContainer\u003c/code\u003e类的\u003ccode\u003einit\u003c/code\u003e方法，接下来调用了\u003ccode\u003einitializeBeans\u003c/code\u003e方法。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003eInitialize\u003c/span\u003e \u003cspan class=\"n\"\u003ebeans\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003ethrows\u003c/span\u003e \u003cspan class=\"n\"\u003eInvalidArgumentException\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003ethrows\u003c/span\u003e \u003cspan class=\"n\"\u003eReflectionException\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eprivate\u003c/span\u003e \u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003einitializeBeans\u003c/span\u003e\u003cspan class=\"p\"\u003e():\u003c/span\u003e \u003cspan class=\"n\"\u003evoid\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e/*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003eObjectDefinition\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eobjectDefinition\u003c/span\u003e \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eforeach\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eobjectDefinitions\u003c/span\u003e \u003cspan class=\"n\"\u003eas\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ebeanName\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eobjectDefinition\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003escope\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eobjectDefinition\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003egetScope\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eExclude\u003c/span\u003e \u003cspan class=\"n\"\u003erequest\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003escope\u003c/span\u003e \u003cspan class=\"o\"\u003e===\u003c/span\u003e \u003cspan class=\"n\"\u003eBean\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eREQUEST\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003erequestDefinitions\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ebeanName\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eobjectDefinition\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eunset\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eobjectDefinitions\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ebeanName\u003c/span\u003e\u003cspan class=\"p\"\u003e]);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003econtinue\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eExclude\u003c/span\u003e \u003cspan class=\"n\"\u003esession\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003escope\u003c/span\u003e \u003cspan class=\"o\"\u003e===\u003c/span\u003e \u003cspan class=\"n\"\u003eBean\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eSESSION\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003esessionDefinitions\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ebeanName\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eobjectDefinition\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eunset\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eobjectDefinitions\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ebeanName\u003c/span\u003e\u003cspan class=\"p\"\u003e]);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003econtinue\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eNew\u003c/span\u003e \u003cspan class=\"n\"\u003ebean\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003enewBean\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ebeanName\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e对于\u003ccode\u003escope\u003c/code\u003e不为\u003ccode\u003eBean::REQUEST\u003c/code\u003e和\u003ccode\u003eBean::SESSION\u003c/code\u003e的，调用\u003ccode\u003enewBean\u003c/code\u003e方法。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003eInitialize\u003c/span\u003e \u003cspan class=\"n\"\u003ebeans\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eparam\u003c/span\u003e \u003cspan class=\"n\"\u003estring\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ebeanName\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eparam\u003c/span\u003e \u003cspan class=\"n\"\u003estring\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eid\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003eobject\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003ethrows\u003c/span\u003e \u003cspan class=\"n\"\u003eReflectionException\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eprivate\u003c/span\u003e \u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003enewBean\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003estring\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ebeanName\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003estring\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eid\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eFirst\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003echeck\u003c/span\u003e \u003cspan class=\"n\"\u003ebean\u003c/span\u003e \u003cspan class=\"n\"\u003ewhether\u003c/span\u003e \u003cspan class=\"n\"\u003ehas\u003c/span\u003e \u003cspan class=\"n\"\u003ebeen\u003c/span\u003e \u003cspan class=\"n\"\u003ecreate\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eisset\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003esingletonPool\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ebeanName\u003c/span\u003e\u003cspan class=\"p\"\u003e])\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"n\"\u003eisset\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eprototypePool\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ebeanName\u003c/span\u003e\u003cspan class=\"p\"\u003e]))\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ebeanName\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eGet\u003c/span\u003e \u003cspan class=\"n\"\u003eobject\u003c/span\u003e \u003cspan class=\"n\"\u003edefinition\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eobjectDefinition\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003egetNewObjectDefinition\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ebeanName\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003escope\u003c/span\u003e     \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eobjectDefinition\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003egetScope\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ealias\u003c/span\u003e     \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eobjectDefinition\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003egetAlias\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eclassName\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eobjectDefinition\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003egetClassName\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eCache\u003c/span\u003e \u003cspan class=\"n\"\u003ereflection\u003c/span\u003e \u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"n\"\u003einfo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eReflections\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003ecache\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eclassName\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eBefore\u003c/span\u003e \u003cspan class=\"n\"\u003einitialize\u003c/span\u003e \u003cspan class=\"n\"\u003ebean\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ebeforeInit\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ebeanName\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eclassName\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eobjectDefinition\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003econstructArgs\u003c/span\u003e   \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003econstructInject\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eobjectDefinition\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003egetConstructorInjection\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003econstructInject\u003c/span\u003e \u003cspan class=\"o\"\u003e!==\u003c/span\u003e \u003cspan class=\"n\"\u003enull\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003econstructArgs\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003egetConstructParams\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003econstructInject\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003epropertyInjects\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eobjectDefinition\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003egetPropertyInjections\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eProxy\u003c/span\u003e \u003cspan class=\"k\"\u003eclass\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ehandler\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eclassName\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ehandler\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eclassProxy\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eclassName\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ereflectionClass\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eReflectionClass\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eclassName\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ereflectObject\u003c/span\u003e   \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003enewInstance\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ereflectionClass\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003econstructArgs\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eInject\u003c/span\u003e \u003cspan class=\"n\"\u003eproperties\u003c/span\u003e \u003cspan class=\"n\"\u003evalues\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003enewProperty\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ereflectObject\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ereflectionClass\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003epropertyInjects\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eAlias\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"n\"\u003eempty\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ealias\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ealiases\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ealias\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ebeanName\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eCall\u003c/span\u003e \u003cspan class=\"n\"\u003einit\u003c/span\u003e \u003cspan class=\"n\"\u003emethod\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"n\"\u003eexist\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ereflectionClass\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ehasMethod\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eINIT_METHOD\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ereflectObject\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eINIT_METHOD\u003c/span\u003e\u003cspan class=\"p\"\u003e}();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003esetNewBean\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ebeanName\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003escope\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ereflectObject\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eid\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e通过反射实例化\u003ccode\u003eBean\u003c/code\u003e对应的类，注册对应的属性。\u003c/p\u003e\n\u003cp\u003e如果类存在\u003ccode\u003eself::INIT_METHOD\u003c/code\u003e方法，执行此方法。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @param string $beanName\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @param string $scope\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @param object $object\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @param string $id\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    *\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @return object\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    */\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eprivate function setNewBean(string $beanName, string $scope, $object, string $id = \u0026#39;\u0026#39;)\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    switch ($scope) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        case Bean::SINGLETON: // Singleton\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            $this-\u0026gt;singletonPool[$beanName] = $object;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            break;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        case Bean::PROTOTYPE:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            $this-\u0026gt;prototypePool[$beanName] = $object;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            // Clone it\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            $object = clone $object;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            break;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        case Bean::REQUEST:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            $this-\u0026gt;requestPool[$id][$beanName] = $object;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            break;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        case Bean::SESSION:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            $this-\u0026gt;sessionPool[$id][$beanName] = $object;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            break;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    return $object;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003ccode\u003esetNewBean\u003c/code\u003e方法，根据对应的scope信息，将实例化后的反射类注册到对应的类属性上。\u003c/p\u003e\n\u003cp\u003e到这里\u003ccode\u003eBeanProcessor\u003c/code\u003e类就执行完了。\u003c/p\u003e\n","date_published":"2019-09-02T18:29:06+08:00","tags":["Swoft"]},{"title":"Swoft 框架运行分析（二） —— AnnotationProcessor模块分析","id":"https://liudon.com/posts/swoft-anaotion-processor-analysis/","url":"https://liudon.com/posts/swoft-anaotion-processor-analysis/","summary":"\u003cp\u003e上一篇介绍了，\u003ccode\u003eSwoftApplication\u003c/code\u003e里定义了6个Processor对象。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eprotected function processors(): array\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        return [\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            new EnvProcessor($this),\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            new ConfigProcessor($this),\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            new AnnotationProcessor($this),\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            new BeanProcessor($this),\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            new EventProcessor($this),\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            new ConsoleProcessor($this),\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        ];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e所有的Processor实现都在\u003ccode\u003eframework\\src\\Processor\u003c/code\u003e目录下。\u003c/p\u003e","content_html":"\u003cp\u003e上一篇介绍了，\u003ccode\u003eSwoftApplication\u003c/code\u003e里定义了6个Processor对象。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eprotected function processors(): array\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        return [\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            new EnvProcessor($this),\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            new ConfigProcessor($this),\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            new AnnotationProcessor($this),\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            new BeanProcessor($this),\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            new EventProcessor($this),\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            new ConsoleProcessor($this),\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        ];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e所有的Processor实现都在\u003ccode\u003eframework\\src\\Processor\u003c/code\u003e目录下。\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003eEnvProcessor，运行环境检查。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eConfigProcessor，配置相关。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAnnotationProcessor，注解相关。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eBeanProcessor，Bean相关。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eEventProcessor，事件相关。\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eConsoleProcessor，命令行输入相关。\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e今天先讲一下\u003ccode\u003eAnnotationProcessor\u003c/code\u003e这个模块的实现。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"err\"\u003e?\u003c/span\u003e\u003cspan class=\"n\"\u003ephp\u003c/span\u003e \u003cspan class=\"n\"\u003edeclare\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003estrict_types\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003enamespace\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eProcessor\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eException\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eAnnotation\u003c/span\u003e\\\u003cspan class=\"n\"\u003eAnnotationRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eLog\u003c/span\u003e\\\u003cspan class=\"n\"\u003eHelper\u003c/span\u003e\\\u003cspan class=\"n\"\u003eCLog\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003eAnnotation\u003c/span\u003e \u003cspan class=\"n\"\u003eprocessor\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003esince\u003c/span\u003e \u003cspan class=\"mf\"\u003e2.0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"n\"\u003eAnnotationProcessor\u003c/span\u003e \u003cspan class=\"k\"\u003eextends\u003c/span\u003e \u003cspan class=\"n\"\u003eProcessor\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003eHandle\u003c/span\u003e \u003cspan class=\"n\"\u003eannotation\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"ne\"\u003ebool\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003ethrows\u003c/span\u003e \u003cspan class=\"n\"\u003eException\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003epublic\u003c/span\u003e \u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003ehandle\u003c/span\u003e\u003cspan class=\"p\"\u003e():\u003c/span\u003e \u003cspan class=\"ne\"\u003ebool\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e!$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eapplication\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ebeforeAnnotation\u003c/span\u003e\u003cspan class=\"p\"\u003e())\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eCLog\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003ewarning\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;Stop annotation processor by beforeAnnotation return false\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"bp\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eapp\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eapplication\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eFind\u003c/span\u003e \u003cspan class=\"n\"\u003eAutoLoader\u003c/span\u003e \u003cspan class=\"n\"\u003eclasses\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e \u003cspan class=\"n\"\u003eParse\u003c/span\u003e \u003cspan class=\"ow\"\u003eand\u003c/span\u003e \u003cspan class=\"n\"\u003ecollect\u003c/span\u003e \u003cspan class=\"n\"\u003eannotations\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eAnnotationRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"nb\"\u003eload\u003c/span\u003e\u003cspan class=\"p\"\u003e([\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"s1\"\u003e\u0026#39;inPhar\u0026#39;\u003c/span\u003e               \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \\\u003cspan class=\"n\"\u003eIN_PHAR\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"s1\"\u003e\u0026#39;basePath\u0026#39;\u003c/span\u003e             \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eapp\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003egetBasePath\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"s1\"\u003e\u0026#39;notifyHandler\u0026#39;\u003c/span\u003e        \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;notifyHandler\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"s1\"\u003e\u0026#39;disabledAutoLoaders\u0026#39;\u003c/span\u003e  \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eapp\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003egetDisabledAutoLoaders\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"s1\"\u003e\u0026#39;disabledPsr4Prefixes\u0026#39;\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eapp\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003egetDisabledPsr4Prefixes\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e]);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003estats\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eAnnotationRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003egetClassStats\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eCLog\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003einfo\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"s1\"\u003e\u0026#39;Annotations is scanned(autoloader \u003c/span\u003e\u003cspan class=\"si\"\u003e%d\u003c/span\u003e\u003cspan class=\"s1\"\u003e, annotation \u003c/span\u003e\u003cspan class=\"si\"\u003e%d\u003c/span\u003e\u003cspan class=\"s1\"\u003e, parser \u003c/span\u003e\u003cspan class=\"si\"\u003e%d\u003c/span\u003e\u003cspan class=\"s1\"\u003e)\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003estats\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;autoloader\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003estats\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;annotation\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003estats\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;parser\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eapplication\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eafterAnnotation\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eparam\u003c/span\u003e \u003cspan class=\"n\"\u003estring\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003etype\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eparam\u003c/span\u003e \u003cspan class=\"n\"\u003estring\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003etarget\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003esee\u003c/span\u003e \\\u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eAnnotation\u003c/span\u003e\\\u003cspan class=\"ne\"\u003eResource\u003c/span\u003e\\\u003cspan class=\"n\"\u003eAnnotationResource\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"nb\"\u003eload\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003epublic\u003c/span\u003e \u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003enotifyHandler\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003estring\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003etype\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003etarget\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e \u003cspan class=\"n\"\u003evoid\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eswitch\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003etype\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003ecase\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;excludeNs\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eCLog\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003edebug\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;Exclude namespace \u003c/span\u003e\u003cspan class=\"si\"\u003e%s\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003etarget\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"k\"\u003ebreak\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003ecase\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;noLoaderFile\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eCLog\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003edebug\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;No autoloader on \u003c/span\u003e\u003cspan class=\"si\"\u003e%s\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003etarget\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"k\"\u003ebreak\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003ecase\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;noLoaderClass\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eCLog\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003edebug\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;Autoloader class not exist \u003c/span\u003e\u003cspan class=\"si\"\u003e%s\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003etarget\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"k\"\u003ebreak\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003ecase\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;findLoaderClass\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eCLog\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003edebug\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;Find autoloader \u003c/span\u003e\u003cspan class=\"si\"\u003e%s\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003etarget\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"k\"\u003ebreak\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003ecase\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;addLoaderClass\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eCLog\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003edebug\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;Parse autoloader \u003c/span\u003e\u003cspan class=\"si\"\u003e%s\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003etarget\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"k\"\u003ebreak\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003ecase\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;noExistClass\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eCLog\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003edebug\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;Skip interface or trait \u003c/span\u003e\u003cspan class=\"si\"\u003e%s\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003etarget\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"k\"\u003ebreak\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e核心逻辑调用\u003ccode\u003eAnnotationRegister\u003c/code\u003e类的\u003ccode\u003eload\u003c/code\u003e方法，定义如下。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003eLoad\u003c/span\u003e \u003cspan class=\"n\"\u003eannotation\u003c/span\u003e \u003cspan class=\"k\"\u003eclass\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eparam\u003c/span\u003e \u003cspan class=\"n\"\u003earray\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003econfig\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003ethrows\u003c/span\u003e \u003cspan class=\"n\"\u003eAnnotationException\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003ethrows\u003c/span\u003e \u003cspan class=\"n\"\u003eReflectionException\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003epublic\u003c/span\u003e \u003cspan class=\"k\"\u003estatic\u003c/span\u003e \u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"nb\"\u003eload\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003earray\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003econfig\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[]):\u003c/span\u003e \u003cspan class=\"n\"\u003evoid\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eresource\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eAnnotationResource\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003econfig\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eresource\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"nb\"\u003eload\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e这里又调用了\u003ccode\u003eAnnotationResource\u003c/code\u003e类的\u003ccode\u003eload\u003c/code\u003e方法，定义如下。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003eLoad\u003c/span\u003e \u003cspan class=\"n\"\u003eannotation\u003c/span\u003e \u003cspan class=\"n\"\u003eresource\u003c/span\u003e \u003cspan class=\"n\"\u003eby\u003c/span\u003e \u003cspan class=\"n\"\u003efind\u003c/span\u003e \u003cspan class=\"n\"\u003eClassLoader\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003ethrows\u003c/span\u003e \u003cspan class=\"n\"\u003eAnnotationException\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003ethrows\u003c/span\u003e \u003cspan class=\"n\"\u003eReflectionException\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003epublic\u003c/span\u003e \u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"nb\"\u003eload\u003c/span\u003e\u003cspan class=\"p\"\u003e():\u003c/span\u003e \u003cspan class=\"n\"\u003evoid\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eprefixDirsPsr4\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eclassLoader\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003egetPrefixesPsr4\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eforeach\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eprefixDirsPsr4\u003c/span\u003e \u003cspan class=\"n\"\u003eas\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ens\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003epaths\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eOnly\u003c/span\u003e \u003cspan class=\"n\"\u003escan\u003c/span\u003e \u003cspan class=\"n\"\u003enamespaces\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eonlyNamespaces\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"n\"\u003ein_array\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ens\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eonlyNamespaces\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"bp\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003enotify\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;excludeNs\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ens\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003econtinue\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eIt\u003c/span\u003e \u003cspan class=\"n\"\u003eis\u003c/span\u003e \u003cspan class=\"n\"\u003eexcluded\u003c/span\u003e \u003cspan class=\"n\"\u003epsr4\u003c/span\u003e \u003cspan class=\"n\"\u003eprefix\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eisExcludedPsr4Prefix\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ens\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eAnnotationRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eregisterExcludeNs\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ens\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003enotify\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;excludeNs\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ens\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003econtinue\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eFind\u003c/span\u003e \u003cspan class=\"n\"\u003epackage\u003c/span\u003e\u003cspan class=\"o\"\u003e/\u003c/span\u003e\u003cspan class=\"n\"\u003ecomponent\u003c/span\u003e \u003cspan class=\"n\"\u003eloader\u003c/span\u003e \u003cspan class=\"k\"\u003eclass\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eforeach\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003epaths\u003c/span\u003e \u003cspan class=\"n\"\u003eas\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003epath\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eloaderFile\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003egetAnnotationClassLoaderFile\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003epath\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"n\"\u003efile_exists\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eloaderFile\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003enotify\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;noLoaderFile\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eclearBasePath\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003epath\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eloaderFile\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"k\"\u003econtinue\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eloaderClass\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003egetAnnotationLoaderClassName\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ens\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"n\"\u003eclass_exists\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eloaderClass\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003enotify\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;noLoaderClass\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eloaderClass\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"k\"\u003econtinue\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eloaderObject\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003enew\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eloaderClass\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e!$\u003c/span\u003e\u003cspan class=\"n\"\u003eloaderObject\u003c/span\u003e \u003cspan class=\"n\"\u003einstanceof\u003c/span\u003e \u003cspan class=\"n\"\u003eLoaderInterface\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003enotify\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;invalidLoader\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eloaderFile\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"k\"\u003econtinue\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003enotify\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;findLoaderClass\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eclearBasePath\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eloaderFile\u003c/span\u003e\u003cspan class=\"p\"\u003e));\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eIf\u003c/span\u003e \u003cspan class=\"n\"\u003eis\u003c/span\u003e \u003cspan class=\"n\"\u003edisable\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ewill\u003c/span\u003e \u003cspan class=\"n\"\u003eskip\u003c/span\u003e \u003cspan class=\"n\"\u003escan\u003c/span\u003e \u003cspan class=\"n\"\u003eannotation\u003c/span\u003e \u003cspan class=\"n\"\u003eclasses\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"n\"\u003eisset\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003edisabledAutoLoaders\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eloaderClass\u003c/span\u003e\u003cspan class=\"p\"\u003e]))\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eAnnotationRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eregisterAutoLoaderFile\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eloaderFile\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003enotify\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;addLoaderClass\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eloaderClass\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eloadAnnotation\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eloaderObject\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eStorage\u003c/span\u003e \u003cspan class=\"n\"\u003eauto\u003c/span\u003e \u003cspan class=\"n\"\u003eloader\u003c/span\u003e \u003cspan class=\"n\"\u003eto\u003c/span\u003e \u003cspan class=\"n\"\u003eregister\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eAnnotationRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eaddAutoLoader\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ens\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eloaderObject\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e通过\u003ccode\u003egetPrefixesPsr4\u003c/code\u003e方法获取所有自动加载的命名空间和目录，遍历目录下的\u003ccode\u003eAutoLoader.php\u003c/code\u003e文件。\u003c/p\u003e\n\u003cp\u003e通过\u003ccode\u003eregisterAutoLoaderFile\u003c/code\u003e注册自动加载文件到\u003ccode\u003eAnnotationRegister\u003c/code\u003e对象上。\u003c/p\u003e\n\u003cp\u003e然后调用了\u003ccode\u003eloadAnnotation\u003c/code\u003e方法，传入的是一个\u003ccode\u003eautoload\u003c/code\u003e对象。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003eLoad\u003c/span\u003e \u003cspan class=\"n\"\u003eannotations\u003c/span\u003e \u003cspan class=\"n\"\u003efrom\u003c/span\u003e \u003cspan class=\"n\"\u003ean\u003c/span\u003e \u003cspan class=\"n\"\u003ecomponent\u003c/span\u003e \u003cspan class=\"n\"\u003eloader\u003c/span\u003e \u003cspan class=\"n\"\u003econfig\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eparam\u003c/span\u003e \u003cspan class=\"n\"\u003eLoaderInterface\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eloader\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003ethrows\u003c/span\u003e \u003cspan class=\"n\"\u003eAnnotationException\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003ethrows\u003c/span\u003e \u003cspan class=\"n\"\u003eReflectionException\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003eprivate\u003c/span\u003e \u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003eloadAnnotation\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eLoaderInterface\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eloader\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e \u003cspan class=\"n\"\u003evoid\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ensPaths\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eloader\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003egetPrefixDirs\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eforeach\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ensPaths\u003c/span\u003e \u003cspan class=\"n\"\u003eas\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ens\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003epath\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eiterator\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eDirectoryHelper\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003erecursiveIterator\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003epath\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e/*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003eSplFileInfo\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003esplFileInfo\u003c/span\u003e \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eforeach\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eiterator\u003c/span\u003e \u003cspan class=\"n\"\u003eas\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003esplFileInfo\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003efilePath\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003esplFileInfo\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003egetPathname\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003esplFileInfo\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eisDir\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eis_dir\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003efilePath\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"k\"\u003econtinue\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003efileName\u003c/span\u003e  \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003esplFileInfo\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003egetFilename\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eextension\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003esplFileInfo\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003egetExtension\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eloaderClassSuffix\u003c/span\u003e \u003cspan class=\"o\"\u003e!==\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eextension\u003c/span\u003e \u003cspan class=\"o\"\u003e||\u003c/span\u003e \u003cspan class=\"n\"\u003estrpos\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003efileName\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;.\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e===\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"k\"\u003econtinue\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eIt\u003c/span\u003e \u003cspan class=\"n\"\u003eis\u003c/span\u003e \u003cspan class=\"n\"\u003eexclude\u003c/span\u003e \u003cspan class=\"n\"\u003efilename\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eisset\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eexcludedFilenames\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003efileName\u003c/span\u003e\u003cspan class=\"p\"\u003e]))\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eAnnotationRegister\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003eregisterExcludeFilename\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003efileName\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"k\"\u003econtinue\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003esuffix\u003c/span\u003e    \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003esprintf\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;.\u003c/span\u003e\u003cspan class=\"si\"\u003e%s\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eloaderClassSuffix\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003epathName\u003c/span\u003e  \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003estr_replace\u003c/span\u003e\u003cspan class=\"p\"\u003e([\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003epath\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;/\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003esuffix\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;\u003c/span\u003e\u003cspan class=\"se\"\u003e\\\\\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e],\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003efilePath\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eclassName\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003esprintf\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;\u003c/span\u003e\u003cspan class=\"si\"\u003e%s%s\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ens\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003epathName\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eFix\u003c/span\u003e \u003cspan class=\"n\"\u003erepeat\u003c/span\u003e \u003cspan class=\"n\"\u003eincluded\u003c/span\u003e \u003cspan class=\"n\"\u003efile\u003c/span\u003e \u003cspan class=\"n\"\u003ebug\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eautoload\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ein_array\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003efilePath\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eincludedFiles\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"bp\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eWill\u003c/span\u003e \u003cspan class=\"n\"\u003efiltering\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003einterfaces\u003c/span\u003e \u003cspan class=\"ow\"\u003eand\u003c/span\u003e \u003cspan class=\"n\"\u003etraits\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e!\u003c/span\u003e\u003cspan class=\"n\"\u003eclass_exists\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eclassName\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e!$\u003c/span\u003e\u003cspan class=\"n\"\u003eautoload\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003enotify\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;noExistClass\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eclassName\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"k\"\u003econtinue\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eParse\u003c/span\u003e \u003cspan class=\"n\"\u003eannotation\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparseAnnotation\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ens\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eclassName\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e通过getPrefixDirs获取当前命名空间的目录，然后通过\u003ccode\u003erecursiveIterator\u003c/code\u003e遍历目录下的文件。\u003c/p\u003e\n\u003cp\u003e排除目录和非\u003ccode\u003e.php\u003c/code\u003e结尾的文件，最后会调用\u003ccode\u003eparseAnnotation\u003c/code\u003e方法。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * Parser annotation\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    *\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @param string $namespace\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @param string $className\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    *\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @throws AnnotationException\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @throws ReflectionException\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    */\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eprivate function parseAnnotation(string $namespace, string $className): void\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    // Annotation reader\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $reflectionClass = new ReflectionClass($className);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    // Fix ignore abstract\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    if ($reflectionClass-\u0026gt;isAbstract()) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        return;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $oneClassAnnotation = $this-\u0026gt;parseOneClassAnnotation($reflectionClass);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    if (!empty($oneClassAnnotation)) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        AnnotationRegister::registerAnnotation($namespace, $className, $oneClassAnnotation);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e这里调用了\u003ccode\u003eparseOneClassAnnotation\u003c/code\u003e方法。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * Parse an class annotation\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    *\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @param ReflectionClass $reflectionClass\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    *\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @return array\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @throws AnnotationException\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @throws ReflectionException\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    */\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eprivate function parseOneClassAnnotation(ReflectionClass $reflectionClass): array\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    // Annotation reader\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $reader    = new AnnotationReader();\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $className = $reflectionClass-\u0026gt;getName();\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $oneClassAnnotation = [];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $classAnnotations   = $reader-\u0026gt;getClassAnnotations($reflectionClass);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    // Register annotation parser\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    foreach ($classAnnotations as $classAnnotation) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        if ($classAnnotation instanceof AnnotationParser) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            $this-\u0026gt;registerParser($className, $classAnnotation);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            return [];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    // Class annotation\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    if (!empty($classAnnotations)) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        $oneClassAnnotation[\u0026#39;annotation\u0026#39;] = $classAnnotations;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        $oneClassAnnotation[\u0026#39;reflection\u0026#39;] = $reflectionClass;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    // Property annotation\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $reflectionProperties = $reflectionClass-\u0026gt;getProperties();\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    foreach ($reflectionProperties as $reflectionProperty) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        $propertyName        = $reflectionProperty-\u0026gt;getName();\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        $propertyAnnotations = $reader-\u0026gt;getPropertyAnnotations($reflectionProperty);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        if (!empty($propertyAnnotations)) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            $oneClassAnnotation[\u0026#39;properties\u0026#39;][$propertyName][\u0026#39;annotation\u0026#39;] = $propertyAnnotations;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            $oneClassAnnotation[\u0026#39;properties\u0026#39;][$propertyName][\u0026#39;reflection\u0026#39;] = $reflectionProperty;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    // Method annotation\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $reflectionMethods = $reflectionClass-\u0026gt;getMethods();\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    foreach ($reflectionMethods as $reflectionMethod) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        $methodName        = $reflectionMethod-\u0026gt;getName();\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        $methodAnnotations = $reader-\u0026gt;getMethodAnnotations($reflectionMethod);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        if (!empty($methodAnnotations)) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            $oneClassAnnotation[\u0026#39;methods\u0026#39;][$methodName][\u0026#39;annotation\u0026#39;] = $methodAnnotations;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            $oneClassAnnotation[\u0026#39;methods\u0026#39;][$methodName][\u0026#39;reflection\u0026#39;] = $reflectionMethod;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    $parentReflectionClass = $reflectionClass-\u0026gt;getParentClass();\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    if ($parentReflectionClass !== false) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        $parentClassAnnotation = $this-\u0026gt;parseOneClassAnnotation($parentReflectionClass);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        if (!empty($parentClassAnnotation)) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            $oneClassAnnotation[\u0026#39;parent\u0026#39;] = $parentClassAnnotation;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    return $oneClassAnnotation;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e这里就是解析注解了，可以看到分别有类注解、属性注解和方法注解三类。\u003c/p\u003e\n\u003cp\u003e这里注意这一段代码。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e// Register annotation parser\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eforeach ($classAnnotations as $classAnnotation) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    if ($classAnnotation instanceof AnnotationParser) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        $this-\u0026gt;registerParser($className, $classAnnotation);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        return [];\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e遍历注解类，如果注解属于\u003ccode\u003eAnnotationParser\u003c/code\u003e实例，这里调用\u003ccode\u003eregisterParser\u003c/code\u003e进行注册。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e/**\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @param string $annotationClass\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    * @param string $parserClassName\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    */\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003epublic static function registerParser(string $annotationClass, string $parserClassName): void\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    self::$classStats[\u0026#39;parser\u0026#39;]++;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    self::$parsers[$annotationClass] = $parserClassName;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e回到上一个方法，解析完后，又调用了\u003ccode\u003eAnnotationRegister\u003c/code\u003e类的\u003ccode\u003eregisterAnnotation\u003c/code\u003e方法进行注册。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eparam\u003c/span\u003e \u003cspan class=\"n\"\u003estring\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eloadNamespace\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eparam\u003c/span\u003e \u003cspan class=\"n\"\u003estring\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eclassName\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eparam\u003c/span\u003e \u003cspan class=\"n\"\u003earray\u003c/span\u003e  \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eclassAnnotation\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003epublic\u003c/span\u003e \u003cspan class=\"k\"\u003estatic\u003c/span\u003e \u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003eregisterAnnotation\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003estring\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eloadNamespace\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003estring\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eclassName\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003earray\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eclassAnnotation\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e \u003cspan class=\"n\"\u003evoid\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eclassStats\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;annotation\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\u003cspan class=\"o\"\u003e++\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"bp\"\u003eself\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eannotations\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eloadNamespace\u003c/span\u003e\u003cspan class=\"p\"\u003e][\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eclassName\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eclassAnnotation\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e至此，整个\u003ccode\u003eAnnotationProcessor\u003c/code\u003e加载完毕，这里\u003ccode\u003eAnnotationRegister\u003c/code\u003e类里会有\u003ccode\u003eannotations\u003c/code\u003e和\u003ccode\u003eparsers\u003c/code\u003e两个属性，这个信息在后面的\u003ccode\u003eBeanProcessor\u003c/code\u003e里还会用到。\u003c/p\u003e\n","date_published":"2019-08-29T19:11:04+08:00","tags":["Swoft"]},{"title":"Swoft 框架运行分析（一）","id":"https://liudon.com/posts/swoft-execution-analysis/","url":"https://liudon.com/posts/swoft-execution-analysis/","summary":"\u003cblockquote\u003e\n\u003cp\u003eSwoft 是一款基于 Swoole 扩展实现的 PHP 微服务协程框架。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e以前一直都是用的原生swoole框架，最近有时间研究了下衍生的Swoft框架。\u003c/p\u003e\n\u003cp\u003e刚开始看的时候，感觉自己像个原始人，完全看不懂。\u003c/p\u003e","content_html":"\u003cblockquote\u003e\n\u003cp\u003eSwoft 是一款基于 Swoole 扩展实现的 PHP 微服务协程框架。\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e以前一直都是用的原生swoole框架，最近有时间研究了下衍生的Swoft框架。\u003c/p\u003e\n\u003cp\u003e刚开始看的时候，感觉自己像个原始人，完全看不懂。\u003c/p\u003e\n\u003cp\u003e官方文档没有介绍Swoft的实现，网上的一些文章跟当前版本代码已经不一致了。\u003c/p\u003e\n\u003cp\u003e自己花了一周时间，终于梳理清楚了，看完更觉得自己是个原始人了。\u003c/p\u003e\n\u003cp\u003e使用的框架组件版本为：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eswoft-2.0.5\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eswoft-component-2.0.5\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e这里以Swoft启动http server为例。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ephp bin/swoft http:start\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e执行上述命令，启动http server。\u003c/p\u003e\n\u003cp\u003e这里执行的是bin/swoft文件。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e#!/usr/bin/env php\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;?php declare(strict_types=1);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e// Bootstrap\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003erequire_once __DIR__ . \u0026#39;/bootstrap.php\u0026#39;;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eSwoole\\Coroutine::set([\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u0026#39;max_coroutine\u0026#39; =\u0026gt; 300000,\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e]);\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e// Run application\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e(new \\App\\Application())-\u0026gt;run();\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e这里引入\u003ccode\u003ebootstrap.php\u003c/code\u003e文件，引入composer自动加载文件。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"err\"\u003e?\u003c/span\u003e\u003cspan class=\"n\"\u003ephp\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eComposer\u003c/span\u003e \u003cspan class=\"n\"\u003eautoload\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003erequire_once\u003c/span\u003e \u003cspan class=\"n\"\u003edirname\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003e__DIR__\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e.\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;/vendor/autoload.php\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e然后执行\u003ccode\u003eSwoft\\App\\Application\u003c/code\u003e类下的\u003ccode\u003erun\u003c/code\u003e方法。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"err\"\u003e?\u003c/span\u003e\u003cspan class=\"n\"\u003ephp\u003c/span\u003e \u003cspan class=\"n\"\u003edeclare\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003estrict_types\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003enamespace\u003c/span\u003e \u003cspan class=\"n\"\u003eApp\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eSwoftApplication\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003edate_default_timezone_set\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003eClass\u003c/span\u003e \u003cspan class=\"n\"\u003eApplication\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003esince\u003c/span\u003e \u003cspan class=\"mf\"\u003e2.0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"n\"\u003eApplication\u003c/span\u003e \u003cspan class=\"k\"\u003eextends\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoftApplication\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eprotected\u003c/span\u003e \u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003ebeforeInit\u003c/span\u003e\u003cspan class=\"p\"\u003e():\u003c/span\u003e \u003cspan class=\"n\"\u003evoid\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eparent\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003ebeforeInit\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003edate_default_timezone_set\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;Asia/Shanghai\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e这里继承了\u003ccode\u003eSwoft\\SwoftApplication\u003c/code\u003e类，这里只粘贴了部分代码。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e \u003cspan class=\"n\"\u003eapplication\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003esince\u003c/span\u003e \u003cspan class=\"mf\"\u003e2.0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoftApplication\u003c/span\u003e \u003cspan class=\"n\"\u003eimplements\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoftInterface\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eApplicationInterface\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003eClass\u003c/span\u003e \u003cspan class=\"n\"\u003econstructor\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eparam\u003c/span\u003e \u003cspan class=\"n\"\u003earray\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003econfig\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003epublic\u003c/span\u003e \u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003e__construct\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003earray\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003econfig\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eCheck\u003c/span\u003e \u003cspan class=\"n\"\u003eruntime\u003c/span\u003e \u003cspan class=\"n\"\u003eenv\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eSwoftHelper\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003echeckRuntime\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eStorage\u003c/span\u003e \u003cspan class=\"n\"\u003eas\u003c/span\u003e \u003cspan class=\"n\"\u003eglobal\u003c/span\u003e \u003cspan class=\"k\"\u003estatic\u003c/span\u003e \u003cspan class=\"n\"\u003eproperty\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eapp\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eBefore\u003c/span\u003e \u003cspan class=\"n\"\u003einit\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ebeforeInit\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eInit\u003c/span\u003e \u003cspan class=\"n\"\u003econsole\u003c/span\u003e \u003cspan class=\"n\"\u003elogger\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003einitCLogger\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eCan\u003c/span\u003e \u003cspan class=\"n\"\u003esetting\u003c/span\u003e \u003cspan class=\"n\"\u003eproperties\u003c/span\u003e \u003cspan class=\"n\"\u003eby\u003c/span\u003e \u003cspan class=\"n\"\u003earray\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003econfig\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eObjectHelper\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003einit\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003econfig\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eInit\u003c/span\u003e \u003cspan class=\"n\"\u003eapplication\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003einit\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eCLog\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003einfo\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;Project path is \u0026lt;info\u0026gt;\u003c/span\u003e\u003cspan class=\"si\"\u003e%s\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026lt;/info\u0026gt;\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ebasePath\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eAfter\u003c/span\u003e \u003cspan class=\"n\"\u003einit\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eafterInit\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eprotected\u003c/span\u003e \u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003einit\u003c/span\u003e\u003cspan class=\"p\"\u003e():\u003c/span\u003e \u003cspan class=\"n\"\u003evoid\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eInit\u003c/span\u003e \u003cspan class=\"n\"\u003esystem\u003c/span\u003e \u003cspan class=\"n\"\u003epath\u003c/span\u003e \u003cspan class=\"n\"\u003ealiases\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003efindBasePath\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003esetSystemAlias\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eprocessors\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eprocessors\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eprocessor\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eApplicationProcessor\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eprocessor\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eaddFirstProcessor\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e...$\u003c/span\u003e\u003cspan class=\"n\"\u003eprocessors\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003eRun\u003c/span\u003e \u003cspan class=\"n\"\u003eapplication\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003epublic\u003c/span\u003e \u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003erun\u003c/span\u003e\u003cspan class=\"p\"\u003e():\u003c/span\u003e \u003cspan class=\"n\"\u003evoid\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e!$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ebeforeRun\u003c/span\u003e\u003cspan class=\"p\"\u003e())\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eprocessor\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ehandle\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003eProcessorInterface\u003c/span\u003e\u003cspan class=\"p\"\u003e[]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eprotected\u003c/span\u003e \u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003eprocessors\u003c/span\u003e\u003cspan class=\"p\"\u003e():\u003c/span\u003e \u003cspan class=\"n\"\u003earray\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eEnvProcessor\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eConfigProcessor\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eAnnotationProcessor\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eBeanProcessor\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eEventProcessor\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eConsoleProcessor\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003ccode\u003e__construct\u003c/code\u003e方法里检查运行环境，初始化日志组件，然后调用了\u003ccode\u003einit\u003c/code\u003e方法。\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003einit\u003c/code\u003e方法里声明了\u003ccode\u003eprocessor\u003c/code\u003e对象。\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eprocessors\u003c/code\u003e方法定义了Swoft框架的6个Processor对象。\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003erun\u003c/code\u003e方法里直接调用\u003ccode\u003eprocessor\u003c/code\u003e对象的\u003ccode\u003ehandler\u003c/code\u003e方法。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-gdscript3\" data-lang=\"gdscript3\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"err\"\u003e?\u003c/span\u003e\u003cspan class=\"n\"\u003ephp\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003enamespace\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eProcessor\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003eSwoft\u003c/span\u003e\\\u003cspan class=\"n\"\u003eStdlib\u003c/span\u003e\\\u003cspan class=\"n\"\u003eHelper\u003c/span\u003e\\\u003cspan class=\"n\"\u003eArrayHelper\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"n\"\u003euse\u003c/span\u003e \u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003eget_class\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003eApplication\u003c/span\u003e \u003cspan class=\"n\"\u003eprocessor\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003esince\u003c/span\u003e \u003cspan class=\"mf\"\u003e2.0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"n\"\u003eApplicationProcessor\u003c/span\u003e \u003cspan class=\"k\"\u003eextends\u003c/span\u003e \u003cspan class=\"n\"\u003eProcessor\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003eProcessorInterface\u003c/span\u003e\u003cspan class=\"p\"\u003e[]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eprivate\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eprocessors\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003eHandle\u003c/span\u003e \u003cspan class=\"n\"\u003eapplication\u003c/span\u003e \u003cspan class=\"n\"\u003eprocessors\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003epublic\u003c/span\u003e \u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003ehandle\u003c/span\u003e\u003cspan class=\"p\"\u003e():\u003c/span\u003e \u003cspan class=\"ne\"\u003ebool\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003edisabled\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eapplication\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003egetDisabledProcessors\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eforeach\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eprocessors\u003c/span\u003e \u003cspan class=\"n\"\u003eas\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eprocessor\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eget_class\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eprocessor\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"o\"\u003e//\u003c/span\u003e \u003cspan class=\"n\"\u003eIf\u003c/span\u003e \u003cspan class=\"n\"\u003eis\u003c/span\u003e \u003cspan class=\"n\"\u003edisabled\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eskip\u003c/span\u003e \u003cspan class=\"n\"\u003ehandle\u003c/span\u003e\u003cspan class=\"o\"\u003e.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eisset\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003edisabled\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"k\"\u003eclass\u003c/span\u003e\u003cspan class=\"p\"\u003e]))\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"k\"\u003econtinue\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eprocessor\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ehandle\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"bp\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003eAdd\u003c/span\u003e \u003cspan class=\"n\"\u003efirst\u003c/span\u003e \u003cspan class=\"n\"\u003eprocessor\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eparam\u003c/span\u003e \u003cspan class=\"n\"\u003eProcessor\u003c/span\u003e\u003cspan class=\"p\"\u003e[]\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eprocessor\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"ne\"\u003ebool\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003epublic\u003c/span\u003e \u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003eaddFirstProcessor\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eProcessor\u003c/span\u003e \u003cspan class=\"o\"\u003e...$\u003c/span\u003e\u003cspan class=\"n\"\u003eprocessor\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e \u003cspan class=\"ne\"\u003ebool\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003earray_unshift\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eprocessors\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e...\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eprocessor\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"bp\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003eAdd\u003c/span\u003e \u003cspan class=\"n\"\u003elast\u003c/span\u003e \u003cspan class=\"n\"\u003eprocessor\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eparam\u003c/span\u003e \u003cspan class=\"n\"\u003eProcessor\u003c/span\u003e\u003cspan class=\"p\"\u003e[]\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eprocessor\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"ne\"\u003ebool\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003epublic\u003c/span\u003e \u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003eaddLastProcessor\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eProcessor\u003c/span\u003e \u003cspan class=\"o\"\u003e...$\u003c/span\u003e\u003cspan class=\"n\"\u003eprocessor\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e \u003cspan class=\"ne\"\u003ebool\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003earray_push\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eprocessors\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e...\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eprocessor\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"bp\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"o\"\u003e/**\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"n\"\u003eAdd\u003c/span\u003e \u003cspan class=\"n\"\u003eprocessors\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eparam\u003c/span\u003e \u003cspan class=\"ne\"\u003eint\u003c/span\u003e         \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eindex\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"n\"\u003eparam\u003c/span\u003e \u003cspan class=\"n\"\u003eProcessor\u003c/span\u003e\u003cspan class=\"p\"\u003e[]\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eprocessors\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*\u003c/span\u003e \u003cspan class=\"err\"\u003e@\u003c/span\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"ne\"\u003ebool\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e     \u003cspan class=\"o\"\u003e*/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003epublic\u003c/span\u003e \u003cspan class=\"n\"\u003efunction\u003c/span\u003e \u003cspan class=\"n\"\u003eaddProcessor\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"ne\"\u003eint\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eindex\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eProcessor\u003c/span\u003e  \u003cspan class=\"o\"\u003e...$\u003c/span\u003e\u003cspan class=\"n\"\u003eprocessors\u003c/span\u003e\u003cspan class=\"p\"\u003e):\u003c/span\u003e \u003cspan class=\"ne\"\u003ebool\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eArrayHelper\u003c/span\u003e\u003cspan class=\"p\"\u003e::\u003c/span\u003e\u003cspan class=\"n\"\u003einsert\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003ethis\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eprocessors\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e$\u003c/span\u003e\u003cspan class=\"n\"\u003eindex\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e...$\u003c/span\u003e\u003cspan class=\"n\"\u003eprocessors\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"bp\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003ccode\u003eaddFirstProcessor\u003c/code\u003e方法把process对象赋值给\u003ccode\u003e$this-\u0026gt;processors\u003c/code\u003e。\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003ehandle\u003c/code\u003e方法遍历\u003ccode\u003eprocessors\u003c/code\u003e对象，循环执行\u003ccode\u003ehandle\u003c/code\u003e方法。\u003c/p\u003e\n\u003cp\u003eSwoft的核心逻辑都是靠上面定义的6个Processor模块实现的，接下来一个一个分析。\u003c/p\u003e\n","date_published":"2019-08-29T17:22:28+08:00","tags":["Swoft"]},{"title":"BCMath 与 科学计数","id":"https://liudon.com/posts/bcmath-and-exponential-notation/","url":"https://liudon.com/posts/bcmath-and-exponential-notation/","summary":"\u003cp\u003e代码如下\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;?php\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eecho 9.99997600 + 2.4E-5;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eecho \u0026#34;\\n===\\n\u0026#34;;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eecho bcadd(9.99997600, 2.4E-5, 8);\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e结果为\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e10\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e===\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e9.99997600\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e问了朋友，查了各种资料，终于在PHP手册里发现了这段话。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eCaution\nPassing values of type float to a BCMath function which expects a string as operand may not have the desired effect due to the way PHP converts float values to string, namely that the string may be in exponential notation (which is not supported by BCMath), and that the decimal separator is locale dependent (while BCMath always expects a decimal point).\u003c/p\u003e","content_html":"\u003cp\u003e代码如下\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026lt;?php\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eecho 9.99997600 + 2.4E-5;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eecho \u0026#34;\\n===\\n\u0026#34;;\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eecho bcadd(9.99997600, 2.4E-5, 8);\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e结果为\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e10\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e===\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e9.99997600\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e问了朋友，查了各种资料，终于在PHP手册里发现了这段话。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eCaution\nPassing values of type float to a BCMath function which expects a string as operand may not have the desired effect due to the way PHP converts float values to string, namely that the string may be in exponential notation (which is not supported by BCMath), and that the decimal separator is locale dependent (while BCMath always expects a decimal point).\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e\u003cstrong\u003ePHP的BCMath方法不支持科学计数\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e解决方法：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eecho bcadd(9.99997600, number_format(2.4E-5, 8, \u0026#39;.\u0026#39;, \u0026#39;\u0026#39;), 8);\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cstrong\u003ePHP里浮点数相关的运算一定要使用BCMath函数！\u003c/strong\u003e\u003c/p\u003e\n","date_published":"2019-08-16T19:34:34+08:00","tags":[]},{"title":"Flink Could Not Resolve Resourcemanager Address","id":"https://liudon.com/posts/flink-could-not-resolve-resourcemanager-address/","url":"https://liudon.com/posts/flink-could-not-resolve-resourcemanager-address/","summary":"\u003cp\u003e什么是Flink。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eApache Flink® - Stateful Computations over Data Streams\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eFlink安装参考(官方文档)[https://ci.apache.org/projects/flink/flink-docs-release-1.7/tutorials/local_setup.html]。\u003c/p\u003e","content_html":"\u003cp\u003e什么是Flink。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eApache Flink® - Stateful Computations over Data Streams\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eFlink安装参考(官方文档)[https://ci.apache.org/projects/flink/flink-docs-release-1.7/tutorials/local_setup.html]。\u003c/p\u003e\n\u003cp\u003e这里使用\u003ccode\u003e单机模式\u003c/code\u003e。\u003c/p\u003e\n\u003ch4 id=\"问题表现\"\u003e问题表现\u003c/h4\u003e\n\u003cp\u003e启动Flink\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[root@VM_80_180_centos /usr/local/flink-1.7.2]# ./bin/start-cluster.sh \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eStarting cluster.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eStarting standalonesession daemon on host VM_80_180_centos.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eStarting taskexecutor daemon on host VM_80_180_centos.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e查看进程\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[root@VM_80_180_centos /usr/local/flink-1.7.2]# jps\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e10442 StandaloneSessionClusterEntrypoint\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e11067 Jps\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e10909 TaskManagerRunner\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[root@VM_80_180_centos /usr/local/flink-1.7.2]# \n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e查看日志，发现\u0026quot;Could not resolve ResourceManager address\u0026quot;的错误。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[root@VM_80_180_centos /usr/local/flink-1.7.2]# tail -f log/flink-root-taskexecutor-*.log\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2019-03-27 19:43:23,804 INFO  org.apache.flink.runtime.taskexecutor.TaskExecutor            - Could not resolve ResourceManager address akka.tcp://flink@localhost:6123/user/resourcemanager, retrying in 10000 ms: Ask timed out on [ActorSelection[Anchor(akka.tcp://flink@localhost:6123/), Path(/user/resourcemanager)]] after [10000 ms]. Sender[null] sent message of type \u0026#34;akka.actor.Identify\u0026#34;..\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e2019-03-27 19:43:43,843 INFO  org.apache.flink.runtime.taskexecutor.TaskExecutor            - Could not resolve ResourceManager address akka.tcp://flink@localhost:6123/user/resourcemanager, retrying in 10000 ms: Ask timed out on [ActorSelection[Anchor(akka.tcp://flink@localhost:6123/), Path(/user/resourcemanager)]] after [10000 ms]. Sender[null] sent message of type \u0026#34;akka.actor.Identify\u0026#34;..\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e访问Flink的web页面，发现task数全为0.\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/flink-could-not-resolve-resourcemanager-address/63c9befaly1g1igknr8lyj21ae09874j.jpg_320x.avif 320w, https://liudon.com/posts/flink-could-not-resolve-resourcemanager-address/63c9befaly1g1igknr8lyj21ae09874j.jpg_480x.avif 480w, https://liudon.com/posts/flink-could-not-resolve-resourcemanager-address/63c9befaly1g1igknr8lyj21ae09874j.jpg_720x.avif 720w, https://liudon.com/posts/flink-could-not-resolve-resourcemanager-address/63c9befaly1g1igknr8lyj21ae09874j.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/flink-could-not-resolve-resourcemanager-address/63c9befaly1g1igknr8lyj21ae09874j.jpg_320x.webp 320w, https://liudon.com/posts/flink-could-not-resolve-resourcemanager-address/63c9befaly1g1igknr8lyj21ae09874j.jpg_480x.webp 480w, https://liudon.com/posts/flink-could-not-resolve-resourcemanager-address/63c9befaly1g1igknr8lyj21ae09874j.jpg_720x.webp 720w, https://liudon.com/posts/flink-could-not-resolve-resourcemanager-address/63c9befaly1g1igknr8lyj21ae09874j.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/flink-could-not-resolve-resourcemanager-address/63c9befaly1g1igknr8lyj21ae09874j.jpg\" alt=\"flink no task\"\n         width=\"1080\" height=\"215\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003ch4 id=\"问题原因\"\u003e问题原因：\u003c/h4\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/flink-could-not-resolve-resourcemanager-address/63c9befaly1g1igoreyi9j20oz04mdg7.jpg_320x.avif 320w, https://liudon.com/posts/flink-could-not-resolve-resourcemanager-address/63c9befaly1g1igoreyi9j20oz04mdg7.jpg_480x.avif 480w, https://liudon.com/posts/flink-could-not-resolve-resourcemanager-address/63c9befaly1g1igoreyi9j20oz04mdg7.jpg_720x.avif 720w, https://liudon.com/posts/flink-could-not-resolve-resourcemanager-address/63c9befaly1g1igoreyi9j20oz04mdg7.jpg_899x.avif 899w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/flink-could-not-resolve-resourcemanager-address/63c9befaly1g1igoreyi9j20oz04mdg7.jpg_320x.webp 320w, https://liudon.com/posts/flink-could-not-resolve-resourcemanager-address/63c9befaly1g1igoreyi9j20oz04mdg7.jpg_480x.webp 480w, https://liudon.com/posts/flink-could-not-resolve-resourcemanager-address/63c9befaly1g1igoreyi9j20oz04mdg7.jpg_720x.webp 720w, https://liudon.com/posts/flink-could-not-resolve-resourcemanager-address/63c9befaly1g1igoreyi9j20oz04mdg7.jpg_899x.webp 899w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/flink-could-not-resolve-resourcemanager-address/63c9befaly1g1igoreyi9j20oz04mdg7.jpg\" alt=\"taskmanager.host\"\n         width=\"899\" height=\"166\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003eFlink的taskmanager.host默认为空，会使用hostname。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[root@VM_80_180_centos /usr/local/flink-1.7.2]# ping VM_80_180_centos\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003ePING VM_80_180_centos (100.125.80.180) 56(84) bytes of data.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e64 bytes from VM_80_180_centos (100.125.80.180): icmp_seq=1 ttl=64 time=0.022 ms\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e64 bytes from VM_80_180_centos (100.125.80.180): icmp_seq=2 ttl=64 time=0.038 ms\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e64 bytes from VM_80_180_centos (100.125.80.180): icmp_seq=3 ttl=64 time=0.038 ms\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eFlink的jobmanager.host默认为localhost。\u003c/p\u003e\n\u003cp\u003e这里jobmanager和taskmanager绑定的ip不一样，导致出错。\u003c/p\u003e\n\u003ch4 id=\"解决办法\"\u003e解决办法：\u003c/h4\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003evim conf/flink-conf.yaml\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e添加下面这行配置\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003etaskmanager.host: localhost\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e保存退出，然后重新启动Flink，这个时候在web端就可以看到有可用task了。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/flink-could-not-resolve-resourcemanager-address/63c9befaly1g1ih665ffjj21a709374r.jpg_320x.avif 320w, https://liudon.com/posts/flink-could-not-resolve-resourcemanager-address/63c9befaly1g1ih665ffjj21a709374r.jpg_480x.avif 480w, https://liudon.com/posts/flink-could-not-resolve-resourcemanager-address/63c9befaly1g1ih665ffjj21a709374r.jpg_720x.avif 720w, https://liudon.com/posts/flink-could-not-resolve-resourcemanager-address/63c9befaly1g1ih665ffjj21a709374r.jpg_1080x.avif 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/flink-could-not-resolve-resourcemanager-address/63c9befaly1g1ih665ffjj21a709374r.jpg_320x.webp 320w, https://liudon.com/posts/flink-could-not-resolve-resourcemanager-address/63c9befaly1g1ih665ffjj21a709374r.jpg_480x.webp 480w, https://liudon.com/posts/flink-could-not-resolve-resourcemanager-address/63c9befaly1g1ih665ffjj21a709374r.jpg_720x.webp 720w, https://liudon.com/posts/flink-could-not-resolve-resourcemanager-address/63c9befaly1g1ih665ffjj21a709374r.jpg_1080x.webp 1080w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/flink-could-not-resolve-resourcemanager-address/63c9befaly1g1ih665ffjj21a709374r.jpg\" alt=\"flink web\"\n         width=\"1080\" height=\"212\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n","date_published":"2019-03-28T13:00:50+08:00","tags":["Flink"]},{"title":"解决Sublime Text安装包时\"There Are No Packages Available for Installation\"的报错","id":"https://liudon.com/posts/there-are-no-packages-available-for-installation/","url":"https://liudon.com/posts/there-are-no-packages-available-for-installation/","summary":"\u003cp\u003e今天安装hugofy的包时，一直遇到\u0026quot;There Are No Packages Available for Installation\u0026quot;的错误。\n按网上的教程，配置host，配置代理都不起作用。\u003c/p\u003e","content_html":"\u003cp\u003e今天安装hugofy的包时，一直遇到\u0026quot;There Are No Packages Available for Installation\u0026quot;的错误。\n按网上的教程，配置host，配置代理都不起作用。\u003c/p\u003e\n\u003cp\u003e本机确定是可以访问\u003ca href=\"https://packagecontrol.io/channel_v3.json\"\u003ehttps://packagecontrol.io/channel_v3.json\u003c/a\u003e这个地址的。\u003c/p\u003e\n\u003cp\u003e然后按教程把这文件放到本地，配置channel指向本地这个文件，然后提示json解析失败。\n然后检查这个文件，发现文件好像不全。然后换到其他机器curl这个地址，发现下载下来的文件确实不全，不是合法的json内容。\u003c/p\u003e\n\u003cp\u003e\u003cpicture\u003e\u003csource type=\"image/avif\" srcset=\"https://liudon.com/posts/there-are-no-packages-available-for-installation/63c9befaly1fz7anr0smxj20fg0famzv.jpg_320x.avif 320w, https://liudon.com/posts/there-are-no-packages-available-for-installation/63c9befaly1fz7anr0smxj20fg0famzv.jpg_480x.avif 480w, https://liudon.com/posts/there-are-no-packages-available-for-installation/63c9befaly1fz7anr0smxj20fg0famzv.jpg_556x.avif 556w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003csource type=\"image/webp\" srcset=\"https://liudon.com/posts/there-are-no-packages-available-for-installation/63c9befaly1fz7anr0smxj20fg0famzv.jpg_320x.webp 320w, https://liudon.com/posts/there-are-no-packages-available-for-installation/63c9befaly1fz7anr0smxj20fg0famzv.jpg_480x.webp 480w, https://liudon.com/posts/there-are-no-packages-available-for-installation/63c9befaly1fz7anr0smxj20fg0famzv.jpg_556x.webp 556w\" sizes=\"auto, (min-width: 1080px) 1080px, calc(100vw - 32px)\"\u003e\u003cimg src=\"/posts/there-are-no-packages-available-for-installation/63c9befaly1fz7anr0smxj20fg0famzv.jpg\" alt=\"下载文件内容截图\"\n         width=\"556\" height=\"550\"\n         loading=\"lazy\" decoding=\"async\"\u003e\n  \u003c/picture\u003e\u003c/p\u003e\n\u003cp\u003e又搜索一番后，找到一个case。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/wbond/package_control/issues/1397\"\u003ePackage Control: There are no packages available for installation/Server Error\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e原来是官方的文件下载出问题了，可以先按上面链接里的方法修改，验证可行。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-fallback\" data-lang=\"fallback\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eMeanwhile, you can add\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u0026#34;channels\u0026#34;: [ \u0026#34;https://erhan.in/channel_v3.json\u0026#34; ],\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eto Preferences \u0026gt; Package Settings \u0026gt; Package Control \u0026gt; Settings - User file.\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003eThis is the latest snapshot of the original JSON file from web.archive.org.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","date_published":"2019-01-11T17:13:14+08:00","tags":[]},{"title":"2019，新开始","id":"https://liudon.com/posts/the-first-post/","url":"https://liudon.com/posts/the-first-post/","summary":"\u003cp\u003e从2011年开始写博客，博客程序从WordPress换成Typecho。\n早就有想法换成静态博客，一直没时间搞。\u003c/p\u003e\n\u003cp\u003e2019年了，新年新气象，用hugo + github pages搞了个新博客。\u003c/p\u003e","content_html":"\u003cp\u003e从2011年开始写博客，博客程序从WordPress换成Typecho。\n早就有想法换成静态博客，一直没时间搞。\u003c/p\u003e\n\u003cp\u003e2019年了，新年新气象，用hugo + github pages搞了个新博客。\u003c/p\u003e\n\u003cp\u003e具体部署过程参考文章：\n\u003ca href=\"https://axdlog.com/zh/2018/using-hugo-and-travis-ci-to-deploy-blog-to-github-pages-automatically/\"\u003e利用Travis CI和Hugo將Blog自動部署到Github Pages\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e这篇文章就是通过这种方式来更新的，感觉很是神奇。\n再也不用关注服务器性能这些东西了，只需要专心写字就好了。\u003c/p\u003e\n\u003cp\u003e\u003cdel\u003e接下来只需要搞定自定义域名了，域名还在认证中，无法做解析。\u003c/del\u003e\u003c/p\u003e\n\u003cp\u003e自定义域名也搞定了，以后就可以正式切到新博客了。\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://liudon.org\"\u003e老博客\u003c/a\u003e只做备份了，不再更新了。\u003c/p\u003e\n","date_published":"2019-01-09T15:17:04+08:00","tags":[]},{"title":"Search","id":"https://liudon.com/search/","url":"https://liudon.com/search/","summary":"","content_html":"","date_published":"0001-01-01T00:00:00Z","tags":[]}]}