aws(学习笔记第三十八课) codepipeline-build-deploy-github-manual
文章目录
- aws(学习笔记第三十八课) codepipeline-build-deploy-github-manual
- 学习内容:
- 1. 整体架构
- 1.1 代码链接
- 1.2 全体处理架构
- 2. 代码分析
- 2.1 创建`ImageRepo`,并设定给`FargateTaskDef`
- 2.2 创建`CodeBuild project`
- 2.3 对`CodeBuild project`赋予权限(`ECR`的`image repo`)
- 2.4 生成`lambda`函数触发`codebuild`的首次执行
- 2.4.1 生成`lambda`函数触发`codebuild`
- 2.4.2 `lambda`函数触发`codebuild`的代码
- 2.4.3 `AWS Custom Resource`的代码
- 2.5 创建`vpc`和`ecs cluster`
- 2.5.1 创建`vpc`
- 2.5.2 创建`蓝绿部署`
- 2.5 创建`Application Loader Balancer`
- 2.6 创建`fargate service`
- 2.6.1 创建`fargate service`
- 2.6.1 在`fargate service`上进行`application target group`的`attach`
- 2.7 创建`code pipeline`
- 2.7.2 `codepipe`整体架构
- 2.7.1 创建`pipeline artifacts`
- 2.7.2 创建`source stage`
- 2.7.3 创建`build stage`
- 2.7.4 创建`deploy stage`
- 2.8 创建`code pipeline`
- 2.8.1 为`code build`设定`github`的`confidential`
- 2.8.2 最终创建`pipeline`
- 3 执行`CDK`
aws(学习笔记第三十八课) codepipeline-build-deploy-github-manual
- 使用
codepipeline-build-deploy
学习内容:
- 使用
codepipeline,★代码库不采用codecommit,而是github - 使用
codebuild - 使用
codedeploy
1. 整体架构
1.1 代码链接
- 代码链接(codepipeline-build-deploy-github-manual)
- 同时可以参照aws(学习笔记第二十课) codecommit以及codedeploy进行开发
1.2 全体处理架构

2. 代码分析
2.1 创建ImageRepo,并设定给FargateTaskDef
# Creates an Elastic Container Registry (ECR) image repositoryimage_repo = ecr.Repository(self, "ImageRepo")# Creates a Task Definition for the ECS Fargate servicefargate_task_def = ecs.FargateTaskDefinition(self, "FargateTaskDef")fargate_task_def.add_container("Container",container_name="web",image=ecs.ContainerImage.from_ecr_repository(image_repo),port_mappings=[{"containerPort": 80}])
注意,这里并没有指定具体的image的URI以及tag,这里只是指定了Image Repo(ECR)。后面会在CodeBuildStage阶段build出来docker image,并且接在CodeDeployStage阶段将该docker image部署到Fargate Service。

2.2 创建CodeBuild project
# CodeBuild project that builds the Docker imagebuild_image = codebuild.Project(self, "BuildImage",build_spec=codebuild.BuildSpec.from_source_filename("buildspec.yaml"),source=codebuild.Source.git_hub(owner="bufanli", # TODO: Replace with your GitHub usernamerepo="web_app", # TODO: Replace with your GitHub repository namebranch_or_ref="main",),environment=codebuild.BuildEnvironment(privileged=True),environment_variables={"AWS_ACCOUNT_ID": codebuild.BuildEnvironmentVariable(value=os.getenv('CDK_DEFAULT_ACCOUNT') or ""),"REGION": codebuild.BuildEnvironmentVariable(value=os.getenv('CDK_DEFAULT_REGION') or ""),"IMAGE_TAG": codebuild.BuildEnvironmentVariable(value="latest"),"IMAGE_REPO_NAME": codebuild.BuildEnvironmentVariable(value=image_repo.repository_name),"REPOSITORY_URI": codebuild.BuildEnvironmentVariable(value=image_repo.repository_uri),"TASK_DEFINITION_ARN": codebuild.BuildEnvironmentVariable(value=fargate_task_def.task_definition_arn),"TASK_ROLE_ARN": codebuild.BuildEnvironmentVariable(value=fargate_task_def.task_role.role_arn),"EXECUTION_ROLE_ARN": codebuild.BuildEnvironmentVariable(value=fargate_task_def.execution_role.role_arn)}

这里,设定build_spec文件,在app/buildspec.yml中,
- 设定
pre_build登录ecr (Amazon Elastic Container Registry(ECR),方便之后的向ecr进行镜像的登录。commands:- echo Logging in to Amazon ECR...- aws --version- aws ecr get-login-password --region $REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$REGION.amazonaws.com - 进行
build处理
这里的
注意,这里的环境给commands:- echo Building the Docker image...- docker build -t $IMAGE_REPO_NAME:$IMAGE_TAG .- docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $AWS_ACCOUNT_ID.dkr.ecr.$REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAGbuild_spec.yml传递变量都是通过env(环境变量)来传递的。
可以看到,这里build执行docker build命令,进行docker image的build。

- 进行
post build处理
这里的变量也同样是在codebuild中,在cdk的codebuild.project中,通过变量传递过来的。
commands:- echo Pushing the Docker image...- docker push $AWS_ACCOUNT_ID.dkr.ecr.$REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG- echo Container image to be used $REPOSITORY_URI:$IMAGE_TAG- sed -i "s|REPOSITORY_URI|${REPOSITORY_URI}|g" taskdef.json- sed -i "s|IMAGE_TAG|${IMAGE_TAG}|g" taskdef.json- sed -i "s|TASK_ROLE_ARN|${TASK_ROLE_ARN}|g" taskdef.json- sed -i "s|EXECUTION_ROLE_ARN|${EXECUTION_ROLE_ARN}|g" taskdef.json- sed -i "s|TASK_DEFINITION_ARN|${TASK_DEFINITION_ARN}|g" appspec.yaml- cat appspec.yaml && cat taskdef.json
2.3 对CodeBuild project赋予权限(ECR的image repo)
# Grants CodeBuild project access to pull/push images from/to ECR repoimage_repo.grant_pull_push(build_image)
2.4 生成lambda函数触发codebuild的首次执行
2.4.1 生成lambda函数触发codebuild
整体架构如下:
- aws custom resource triggers lambda on create event
- lambda executes code build project
- code build project starts source stage,build stage and deploy stage

2.4.2 lambda函数触发codebuild的代码
CDK代码
注意,这里赋予了lamba权限,允许执行code build
# Lambda function that triggers CodeBuild image build projecttrigger_code_build = lambda_.Function(self, "BuildLambda",architecture=lambda_.Architecture.ARM_64,code=lambda_.Code.from_asset("lambda"),handler="trigger-build.handler",runtime=lambda_.Runtime.NODEJS_18_X,environment={"CODEBUILD_PROJECT_NAME": build_image.project_name,"REGION": os.getenv('CDK_DEFAULT_REGION') or ""},# Allows this Lambda function to trigger the buildImage CodeBuild projectinitial_policy=[iam.PolicyStatement(effect=iam.Effect.ALLOW,actions=["codebuild:StartBuild"],resources=[build_image.project_arn])])
lambda函数代码
const {CodeBuildClient,StartBuildCommand,
} = require("@aws-sdk/client-codebuild");exports.handler = async (event) => {const region = process.env.REGION;const buildProjectName = process.env.CODEBUILD_PROJECT_NAME;const codebuild = new CodeBuildClient({ region: region });const buildCommand = new StartBuildCommand({ projectName: buildProjectName });console.log("Triggering CodeBuild Project...");const buildResponse = await codebuild.send(buildCommand);console.log(buildResponse);return {statusCode: 200,body: "CodeBuild Project building...",};
};
2.4.3 AWS Custom Resource的代码
# Triggers a Lambda function using AWS SDKtrigger_lambda = custom.AwsCustomResource(self, "BuildLambdaTrigger",install_latest_aws_sdk=True,policy=custom.AwsCustomResourcePolicy.from_statements([iam.PolicyStatement(effect=iam.Effect.ALLOW,actions=["lambda:InvokeFunction"],resources=[trigger_code_build.function_arn],)]),on_create={"service": "Lambda","action": "invoke","physical_resource_id": custom.PhysicalResourceId.of("id"),"parameters": {"FunctionName": trigger_code_build.function_name,"InvocationType": "Event",},},on_update={"service": "Lambda","action": "invoke","parameters": {"FunctionName": trigger_code_build.function_name,"InvocationType": "Event",},})
2.5 创建vpc和ecs cluster
2.5.1 创建vpc
# Creates VPC for the ECS Clustercluster_vpc = ec2.Vpc(self, "ClusterVpc",ip_addresses=ec2.IpAddresses.cidr(cidr_block="10.75.0.0/16"))# Deploys the cluster VPC after the initial image build triggerscluster_vpc.node.add_dependency(trigger_lambda)
注意,这里创建vpc需要依赖trigger _lambda,只有当trigger lambda的aws custom resource创建好了,才能创建vpc。
2.5.2 创建蓝绿部署
-
蓝绿部署的整体架构

- 【1】利用
CodeDepoly服务,开始进行application deploy - 【2】生成导入新的
application的Green Group - 【3】在
Application对开发者设定对Green Group的访问的listener - 【4】开发者对
Green Group进行动作确认,确保生产环境上没有问题 - 【5】在
Application对一般用户设定对访问的listener,让其指向Green Group,设定Blue Group为新的Green Group - 【6】删除原来的
Blue Group。这里取决于设定的策略,可能不是马上删除。
- 【1】利用
-
创建
ApplicationTargetGroup(blue)蓝色目标组target_group_blue = elb.ApplicationTargetGroup(self, "BlueTargetGroup",target_group_name="alb-blue-tg",target_type=elb.TargetType.IP,port=80,vpc=cluster_vpc)
-
创建
ApplicationTargetGroup(green)绿色目标组# Creates a new green Target Grouptarget_group_green = elb.ApplicationTargetGroup(self, "GreenTargetGroup",target_group_name="alb-green-tg",target_type=elb.TargetType.IP,port=80,vpc=cluster_vpc)
2.5 创建Application Loader Balancer
注意,这里 default_target_groups=[target_group_blue]默认的target group设成了blue group。
# Creates a new green Target Grouptarget_group_green = elb.ApplicationTargetGroup(self, "GreenTargetGroup",target_group_name="alb-green-tg",target_type=elb.TargetType.IP,port=80,vpc=cluster_vpc)# Creates a Security Group for the Application Load Balancer (ALB)albSg = ec2.SecurityGroup(self, "AlbSecurityGroup",vpc=cluster_vpc,allow_all_outbound=True)albSg.add_ingress_rule(peer=ec2.Peer.any_ipv4(),connection=ec2.Port.tcp(80),description="Allows access on port 80/http",remote_rule=False)# Creates a public ALBpublic_alb = elb.ApplicationLoadBalancer(self, "PublicAlb",vpc=cluster_vpc,internet_facing=True,security_group=albSg)# Adds a listener on port 80 to the ALBalb_listener = public_alb.add_listener("AlbListener80",open=False,port=80,default_target_groups=[target_group_blue])
2.6 创建fargate service
2.6.1 创建fargate service
注意,这里直接在创建fargate service的时候,直接创建ecs cluster。并且将task def和ecs cluster联系起来。
# Creates an ECS Fargate servicefargate_service = ecs.FargateService(self, "FargateService",desired_count=1,service_name="fargate-frontend-service",task_definition=fargate_task_def,cluster=ecs.Cluster(self, "EcsCluster",enable_fargate_capacity_providers=True,vpc=cluster_vpc),# Sets CodeDeploy as the deployment controllerdeployment_controller=ecs.DeploymentController(type=ecs.DeploymentControllerType.CODE_DEPLOY),)
2.6.1 在fargate service上进行application target group的attach
# Adds the ECS Fargate service to the ALB target group
fargate_service.attach_to_application_target_group(target_group_blue)
2.7 创建code pipeline
2.7.2 codepipe整体架构

2.7.1 创建pipeline artifacts
# Creates new pipeline artifactssource_artifact = pipeline.Artifact("SourceArtifact")build_artifact = pipeline.Artifact("BuildArtifact")

source_artifact是由source_stage作成,由build_stage进行使用build_artifact是由build_stage作成,由deploy_stage进行使用,并且包括:appspec.ymltaskdef.json
2.7.2 创建source stage
# Creates the source stage for CodePipelinesource_stage = pipeline.StageProps(stage_name="Source",actions=[pipelineactions.GitHubSourceAction(action_name="GitHub",owner='XXXXXX', # TODO: Replace with your GitHub usernamerepo='web_app', # TODO: Replace with your GitHub repository namebranch="main",oauth_token=SecretValue.secrets_manager("github-access-token-secret"),output=source_artifact,)])
- 这里,需要设定几个地方:
owner这里是github工程的用户名,这里就是自己的github账号。repo这里是github库的名字。oauth_token,因为需要将aws的url(callback),注册给github,所以需要oauth_token进行验证。因为aws的source stage需要检测到github的commit,自动触发code pipeline,所以需要注册url(callback)。
下面的就是讲本次example程序中的application的部分push到github,创建一个示例的web application。

github的webhooks和codepipeline交互

- 在
cdk中练习使用aws secret manager

2.7.3 创建build stage
# Creates the build stage for CodePipelinebuild_stage = pipeline.StageProps(stage_name="Build",actions=[pipelineactions.CodeBuildAction(action_name="DockerBuildPush",input=pipeline.Artifact("SourceArtifact"),project=build_image,outputs=[build_artifact])])
- 这里使用
source stage生成的source artifact,进行docker build,之后将docker image进行push到aws ecr。 project设定这里要设定成前面创建的build_image
2.7.4 创建deploy stage
- 整体构造

- 创建
deployment group# Creates a new CodeDeploy Deployment Groupdeployment_group = codedeploy.EcsDeploymentGroup(self, "CodeDeployGroup",service=fargate_service,# Configurations for CodeDeploy Blue/Green deploymentsblue_green_deployment_config=codedeploy.EcsBlueGreenDeploymentConfig(listener=alb_listener,blue_target_group=target_group_blue,green_target_group=target_group_green)) - 创建
deploy stage# Creates the deploy stage for CodePipelinedeploy_stage = pipeline.StageProps(stage_name="Deploy",actions=[pipelineactions.CodeDeployEcsDeployAction(action_name="EcsFargateDeploy",app_spec_template_input=build_artifact,task_definition_template_input=build_artifact,deployment_group=deployment_group)])
2.8 创建code pipeline
2.8.1 为code build设定github的confidential
# Store Github credentials to CodeBuildcodebuild.GitHubSourceCredentials(self, "CodeBuildGitHubCreds",access_token=SecretValue.secrets_manager("github-access-token-secret"))
2.8.2 最终创建pipeline
# Creates an AWS CodePipeline with source, build, and deploy stagespipeline.Pipeline(self, "BuildDeployPipeline",pipeline_name="ImageBuildDeployPipeline",stages=[source_stage, build_stage, deploy_stage])
3 执行CDK
执行后继续更新。
相关文章:
aws(学习笔记第三十八课) codepipeline-build-deploy-github-manual
文章目录 aws(学习笔记第三十八课) codepipeline-build-deploy-github-manual学习内容:1. 整体架构1.1 代码链接1.2 全体处理架构 2. 代码分析2.1 创建ImageRepo,并设定给FargateTaskDef2.2 创建CodeBuild project2.3 对CodeBuild project赋予权限&#…...
自定义实现C++拓展pytorch功能
ncrelu.cpp #include <torch/extension.h> // 头文件引用部分namespace py pybind11;torch::Tensor ncrelu_forward(torch::Tensor input) {auto pos input.clamp_min(0); // 具体实现部分auto neg input.clamp_max(0);return torch::cat({pos, neg}, …...
深度学习|注意力机制
一、注意力提示 随意:跟随主观意识,也就是指有意识。 注意力机制:考虑“随意线索”,有一个注意力池化层,将会最终选择考虑到“随意线索”的那个值 二、注意力汇聚 这一部分也就是讲第一大点中“注意力汇聚”那个池化…...
京东店铺托管7*16小时全时护航
内容概要 京东店铺托管服务的*716小时全时护航模式,相当于给商家配了个全年无休的"运营管家"。专业团队每天从早7点到晚11点实时盯着运营数据和商品排名,连半夜流量波动都能通过智能系统秒级预警。这种全天候服务可不是单纯拼人力——系统自动…...
遵循IEC62304YY/T0664:确保医疗器械软件生命周期合规性
一、EC 62304与YY/T 0664的核心定位与关系 IEC 62304(IEC 62304)是国际通用的医疗器械软件生命周期管理标准,适用于所有包含软件的医疗器械(如嵌入式软件、独立软件、移动应用等),其核心目标是确保软件的安…...
Android Input——输入系统介绍(一)
Input 是 Android 系统中的一个重要模块,它是负责处理用户输入操作的核心组件。该系统从各种输入设备(如触摸屏、键盘、鼠标等)获取原始输入事件,并将其转换为 Android 应用可以理解和消费的 KeyEvent 或 MotionEvent 对象。 一、…...
20250408-报错:pre_state = state同更新现象
项目场景: 基于强化学习解决组合优化问题 问题描述 # POMO Rolloutstate, reward, done self.env.pre_step()# next_state statewith autocast():while not done:# 执行动作并获取新状态和奖励selected, prob self.model(state)# 更新状态:因为self.env.step(s…...
如何在服务器里部署辅助域
辅助域(Additional Domain Controller,ADC)是指在现有的Active Directory(活动目录)架构中,新增一个或多个域控制器以提高目录服务的可用性和可靠性。以下是辅助域的定义、功能和应用场景的详细说明&#x…...
WPS JS宏编程教程(从基础到进阶)-- 第五部分:JS数组与WPS结合应用
目录 摘要第5章 JS数组与WPS结合应用5-1 JS数组的核心特性核心特性解析5-2 数组的两种创建方式(字面量与扩展操作符)1. 字面量创建2. 扩展操作符创建5-3 数组创建应用:提取字符串中的数字需求说明代码实现5-4 用函数创建数组(new Array、Array.of、Array.from)1. new Arra…...
Kaggle-Housing Prices-(回归预测+Ridge,Lasso,Xgboost模型融合)
Housing Prices 题意: 给出房子的各种特性,让你预测如今房子的价格。 思考: 数据处理: 1.用plt查看散点图,选择对价格影响高的特征值:YearBuilt,YearRemodAdd,GarageYrBlt。但是…...
C语言:32位数据转换为floaf解析
在C语言中,将接收到的32位数据(通常是一个unsigned int或int类型)转换为float类型可以通过以下方式实现: 除了下面的方法外还有几个方法,参考博客: C语言:把两个16位的数据合成32位浮点型数据 …...
MQTT协议:IoT通信的轻量级选手
文章总结(帮你们节约时间) MQTT协议是一种轻量级的发布/订阅通信协议。MQTT通信包括连接建立、订阅、发布和断开等过程。MQTT基于TCP/IP,其通信过程涉及多种控制包和数据包。ESP32S3可以通过MQTT协议接收消息来控制IO9引脚上的LED。 想象一…...
GNSS有源天线和无源天线
区别 需要外部供电的就是有源天线,不需要外部供电的是无源天线。 无源天线 一般就是一个陶瓷片、金属片等,结构简单,成本低廉,占用空间及体积小,适合于强调紧凑型空间的导航类产品。 不需要供电,跟设备直…...
欧税通香港分公司办公室正式乔迁至海港城!
3月20日,欧税通香港分公司办公室正式乔迁至香港油尖旺区的核心商业区海港城!左手挽着内地市场,右手牵起国际航道——这波乔迁选址操作堪称“地理课代表”! 乔迁仪式秒变行业大联欢!感谢亚马逊合规团队、亚马逊云、阿里国际站、Wayfair、coupang、美客多…...
Qt 自带的QSqlDatabase 模块中使用的 SQLite 和 SQLite 官方提供的 C 语言版本(sqlite.org)对比
Qt 自带的 QSqlDatabase 模块中使用的 SQLite 和 SQLite 官方提供的 C 语言版本(sqlite.org)在核心功能上是相同的,但它们在集成方式、API 封装、功能支持以及版本更新上存在一些区别。以下是主要区别: 1. 核心 SQLite 引擎 Qt 的…...
zustand 源码解析
文章目录 实现原理createcreateStore 创建实例CreateStoreImpl 实现发布订阅createImpl 包装返回给用户调用的 hookuseSyncExternalStoreWithSelector 订阅更新zustand 性能优化自定义数据更新createWithEqualityFncreateWithEqualityFnImpl 返回 hookuseSyncExternalStoreWith…...
洛谷题单3-P1423 小玉在游泳-python-流程图重构
题目描述 小玉开心的在游泳,可是她很快难过的发现,自己的力气不够,游泳好累哦。已知小玉第一步能游 2 2 2 米,可是随着越来越累,力气越来越小,她接下来的每一步都只能游出上一步距离的 98 % 98\% 98%。现…...
ETPNav:基于演进拓扑规划的连续环境视觉语言导航模型
1、现有工作的缺陷: 最近,出现了一种基于模块化航路点的方法的新兴趋势,该方法将复杂任务分为航路点生成、子目标规划和导航控制: (1)在每个决策循环中,代理使用预训练的网络来预测附近的几个…...
Spring Cloud LoadBalancer负载均衡+算法切换
目录 介绍核心功能负载均衡启动两个支付服务订单模块引入依赖LoadBalanced 注解启动订单服务测试结果 负载均衡算法切换总结 介绍 Spring Cloud LoadBalancer 是 Spring Cloud 提供的客户端负载均衡解决方案,提供更现代化的 API 和更好的 Spring 生态系统集成。它支…...
游戏引擎学习第210天
回顾并为今天的工作做准备 今天我们,进行一些编码工作。这部分的编码内容对那些对代码架构感兴趣的人非常有帮助,我认为今天的编码内容会很有教育意义,尤其是在展示一些代码转化的过程中,希望大家能够从中获得一些启发。 接下来…...
XXL-JOB 分片广播模式深度解析:从原理到实战
前言 XXL-JOB 是一个轻量级的分布式任务调度平台,它以其简单易用、灵活扩展的特点受到了开发者的青睐。本文将深入探讨 XXL-JOB 的分片广播模式,包括其工作原理、实现方法、异常处理及监控告警策略,并通过 Java 代码示例和工作流程图来帮助大…...
UML类图综合实验三补档
1.使用简单工厂模式模拟女娲(Nvwa)造人(Person),如果传入参数“M”,则返回一个Man对象,如果传入参数“W”,则返回一个Woman对象,用Java语言实现该场景。现需要增加一个新的Robot类,如果传入参数“R”&#…...
WinForm真入门(11)——ComboBox控件详解
WinForm中 ComboBox 控件详解 ComboBox 是 WinForms 中一个集文本框与下拉列表于一体的控件,支持用户从预定义选项中选择或直接输入内容。以下从核心属性、事件、使用场景到高级技巧的全面解析: 一、ComboBox 核心属性 属性说明示例Items下拉…...
DeepSeek底层揭秘——《推理时Scaling方法》技术对比浅析
4月初,DeepSeek 提交到 arXiv 上的最新论文正在 AI 社区逐渐升温。 笔者尝试对比了“关于推理时Scaling”与现有技术,粗浅分析如下: 与LoRA的对比 区别: 应用场景:LoRA是一种参数高效微调方法,主要用于在…...
Android Coli 3 ImageView load two suit Bitmap thumb and formal,Kotlin(四)
Android Coli 3 ImageView load two suit Bitmap thumb and formal,Kotlin(四) 对 Android Coli 3 ImageView load two suit Bitmap thumb and formal,Kotlin(三)-CSDN博客 进行完善,注意完善 …...
Adam优化器研究综述
摘要 Adam优化器(Adaptive Moment Estimation)是一种广泛应用于深度学习的优化算法,通过自适应学习率加速梯度下降过程。本文从Adam的定义、算法原理、优势与局限性、应用场景及变体等方面进行调研,结合学术文献和实践经验&#x…...
在 macOS 上连接 PostgreSQL 数据库(pgAdmin、DBeaver)
在 macOS 上连接 PostgreSQL 数据库 pgAdmin 官方提供的图形化管理工具,支持 macOS。 下载地址:https://www.pgadmin.org/ pgAdmin 4 是对 pgAdmin 的完全重写,使用 Python、ReactJs 和 Javascript 构建。一个用 Electron 编写的桌面运行时…...
使用文本翻译API打破语言障碍
一、引言 在当今全球化的商业环境中,企业面临着前所未有的语言挑战。无论是出口商品、引进技术,还是与国际客户进行交流,语言障碍始终是一个亟待解决的问题。文本翻译API作为一款高效、稳定的工具,支持多种语言的翻译,…...
UniappX动态引入在线字体图标,不兼容css时可用。
优缺点 优点:不需要占用本地存储,可直接在线同步库图标,不用再手动引入ttf文件,不用手动添加键值对对应表。 缺点:受网速影响,字体库cdn路径可能会更改,ios端首次加载,可能会无图标…...
2018年真题
数学基础 一、 (共4分)用逻辑符号表达下列语句(论域为包含一切事物的集合) 1、(2分)集合A的任一元素的元素都是A的元素 经过对图片文字的识别与逻辑分析,结果如下: 符号定义&…...
